Swing:具有自主内容大小的 JscrollPane
Swing: JscrollPane with autonomous content size
我有一个带有布局的面板(例如,BorderLayout
),中间有一个 JScrollPane
。 JScrollPane
里面有内容(一个JPanel
)
问题是,当 JScrollPane
调整大小时,我不想调整其内容的大小。例如,如果布局增加 JScrollPane
,我希望它的内容尽可能小(并且只占据窗格的一部分),但它会调整大小以适合窗格。
我还需要一个机会减少窗格内的内容并手动增加它(增加没有问题,他们在减少)。
那么,如何实现内容大小独立?当然,我需要保存滚动功能,如果内容会大于 JScrollPane
.
这是一个简单的例子:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestScroll extends JFrame {
public TestScroll() {
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(500, 500);
init();
}
private void init() {
setLayout(new BorderLayout());
// Inner panel
final JPanel innerPanel = new JPanel();
innerPanel.setOpaque(true);
innerPanel.setBackground(Color.BLUE);
innerPanel.setPreferredSize(new Dimension(200, 200));
// Scroll
final JScrollPane scrollPane = new JScrollPane(innerPanel);
add(scrollPane, BorderLayout.CENTER);
// Buttons
JPanel buttonPanel = new JPanel();
JButton extendButton = new JButton("Extend inner panel");
extendButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
innerPanel.setPreferredSize(new Dimension(innerPanel.getWidth() * 2,
innerPanel.getHeight() * 2));
innerPanel.revalidate();
}
});
buttonPanel.add(extendButton);
JButton reduceButton = new JButton("Reduce inner panel");
reduceButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
innerPanel.setPreferredSize(new Dimension(innerPanel.getWidth() / 2,
innerPanel.getHeight() / 2));
innerPanel.revalidate();
}
});
buttonPanel.add(reduceButton);
add(buttonPanel, BorderLayout.NORTH);
setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new TestScroll();
}
});
}
}
所以,问题陈述:
- 我不希望内部面板拉伸到窗格(但窗格可以通过外部布局调整大小,因此面板必须保持其大小)。
- 我希望能够手动缩小内部面板,使其只占据滚动窗格的一部分。
- 当然,当内部面板大于滚动窗格时,我想保存滚动功能。
您是否遵循了 Andrew link 关于使用布局管理器来实现您的目标的说法?
这是另一个简单的例子:
//final JScrollPane scrollPane = new JScrollPane(innerPanel);
JPanel outer = new JPanel();
outer.add( innerPanel );
final JScrollPane scrollPane = new JScrollPane(outer);
我有一个带有布局的面板(例如,BorderLayout
),中间有一个 JScrollPane
。 JScrollPane
里面有内容(一个JPanel
)
问题是,当 JScrollPane
调整大小时,我不想调整其内容的大小。例如,如果布局增加 JScrollPane
,我希望它的内容尽可能小(并且只占据窗格的一部分),但它会调整大小以适合窗格。
我还需要一个机会减少窗格内的内容并手动增加它(增加没有问题,他们在减少)。
那么,如何实现内容大小独立?当然,我需要保存滚动功能,如果内容会大于 JScrollPane
.
这是一个简单的例子:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestScroll extends JFrame {
public TestScroll() {
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(500, 500);
init();
}
private void init() {
setLayout(new BorderLayout());
// Inner panel
final JPanel innerPanel = new JPanel();
innerPanel.setOpaque(true);
innerPanel.setBackground(Color.BLUE);
innerPanel.setPreferredSize(new Dimension(200, 200));
// Scroll
final JScrollPane scrollPane = new JScrollPane(innerPanel);
add(scrollPane, BorderLayout.CENTER);
// Buttons
JPanel buttonPanel = new JPanel();
JButton extendButton = new JButton("Extend inner panel");
extendButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
innerPanel.setPreferredSize(new Dimension(innerPanel.getWidth() * 2,
innerPanel.getHeight() * 2));
innerPanel.revalidate();
}
});
buttonPanel.add(extendButton);
JButton reduceButton = new JButton("Reduce inner panel");
reduceButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
innerPanel.setPreferredSize(new Dimension(innerPanel.getWidth() / 2,
innerPanel.getHeight() / 2));
innerPanel.revalidate();
}
});
buttonPanel.add(reduceButton);
add(buttonPanel, BorderLayout.NORTH);
setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new TestScroll();
}
});
}
}
所以,问题陈述:
- 我不希望内部面板拉伸到窗格(但窗格可以通过外部布局调整大小,因此面板必须保持其大小)。
- 我希望能够手动缩小内部面板,使其只占据滚动窗格的一部分。
- 当然,当内部面板大于滚动窗格时,我想保存滚动功能。
您是否遵循了 Andrew link 关于使用布局管理器来实现您的目标的说法?
这是另一个简单的例子:
//final JScrollPane scrollPane = new JScrollPane(innerPanel);
JPanel outer = new JPanel();
outer.add( innerPanel );
final JScrollPane scrollPane = new JScrollPane(outer);