[英]JPanel of larger size than the Scrollpane
我实现了一个对话框,在该对话框中,我还在具有滚动条的JPanel中添加了许多复选框。 对于程序的每次运行,复选框的数量不是固定的,但是在创建对话框之前我知道这一点。
不幸的是,当我有大量复选框要添加时,对话框如下所示:
我的代码是:
JPanel listPanel = new JPanel(new GridLayout(files.size() + 2, 1));
for (int i = 0; i < files.size(); i++) {
listPanel.add(files.get(i));
}
listPanel.setPreferredSize(new Dimension(600, 1400));
JScrollPane sp =
new JScrollPane(listPanel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
sp.setPreferredSize(new Dimension(300, 200));
mainPanel.add(sp, BorderLayout.CENTER);
mainPanel.add(buttonPane, BorderLayout.EAST);
getContentPane().setLayout(new FlowLayout());
getContentPane().add(mainPanel);
pack();
setResizable(false);
如何在不影响框架的情况下将Scrollpane内部的Panel的尺寸设置为更大的尺寸?
避免使用setPreferredSize
,让布局管理器确定他们实际需要的大小...
更新了示例
滚动窗格的JViewport
使用listPane
的首选大小来确定它需要多少可见空间,这是很多...
为了克服这个问题,您需要向视口提供一个更好的提示,告知您组件实际希望的可视尺寸。 该组件的preferredSize
在这里不起作用,您需要从Scrollable
接口提供preferredScrollableViewportSize
public class BadList {
public static void main(String[] args) {
new BadList();
}
public BadList() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
List<String> files = new ArrayList<>(2000);
for (int index = 0; index < 2000; index++) {
files.add(Integer.toString(index));
}
ListPane listPanel = new ListPane();
listPanel.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.weightx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridwidth = GridBagConstraints.REMAINDER;
for (String file : files) {
listPanel.add(new JCheckBox(file), gbc);
}
JScrollPane sp = new JScrollPane(listPanel);
JPanel mainPanel = new JPanel(new BorderLayout());
JPanel buttonPane = new JPanel(new GridBagLayout());
buttonPane.add(new JButton("Select All"), gbc);
buttonPane.add(new JButton("Deselect All"), gbc);
gbc.weighty = 1;
buttonPane.add(new JPanel(), gbc);
mainPanel.add(sp, BorderLayout.CENTER);
mainPanel.add(buttonPane, BorderLayout.EAST);
setLayout(new BorderLayout());
add(mainPanel);
}
}
public class ListPane extends JPanel implements Scrollable {
@Override
public Dimension getPreferredScrollableViewportSize() {
return new Dimension(200, 200);
}
@Override
public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
return 128;
}
@Override
public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
return 128;
}
@Override
public boolean getScrollableTracksViewportWidth() {
return false;
}
@Override
public boolean getScrollableTracksViewportHeight() {
return false;
}
}
}
nb-在此示例中,我使用了一些任意的幻数,您将根据自己的需要选择更实际的值
JPanel
已实现FlowLayout
,
FlowLayout
仅接受PreferredSize
,则正确放置了JScrollPane
使用JTable
(在其中放置Boolean value
,表示JCheckBox
),而不是将子项添加到JPanel
(非自然滚动,必须更改scroll increment
)
listPanel.setPreferredSize(new Dimension(600, 1400));
Dimmension
,请注释此代码行,将其用于pack()
为此工作(代码发布在这里),我将JScrollPane
和buttonPane
直接buttonPane
到JFrame
,而不是使用mainPanel()
,否则发布SSCCE
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.