简短版本:我是否需要做一些棘手的工作才能让JDialog的setMaximumSize()工作?
完整版:我有一个JDialog(布局管理器:BorderLayout),它包含一个滚动窗格和底部带有提交按钮的JPanel。
滚动窗格包含一个JPanel,它在系统的其他位置动态构建。
我想要的是对话框在JPanel周围动态调整大小到一定大小,然后开始增长滚动条。这或多或少是默认情况下发生的事情,除了最大尺寸似乎是我的显示器的大小。
我想到这是从java.awt.Component继承的.setMaximumSize()方法,但设置它似乎没有任何效果。
设置首选大小确实有效 - 但是无论如何,对话框总是那么大,这实际上不是我想要的。
(如果我在滚动窗格上设置最大/首选大小属性,则效果相同。)
我错过了一些非常明显的东西吗?是否有一些我不知道的古怪的JDialog / BorderLayout / MaximumSize交互?
答案 0 :(得分:9)
如Sizing a Scroll Pane中所述,某些组件可以提供有关设置视口首选大小的有用信息。 setVisibleRowCount()
的{{1}}方法特别方便,但即使JList
也可以。当然,sscce会有所帮助。
附录:作为具体示例,下面的对话框最初的大小为 N -2行。随着更多内容的添加,对话框会一直增长,直到数字达到 N 。此时,滚动条开始“增长”。该示例使用getViewport().setPreferredSize(…)
,但任何Scrollable
组件都应具有适应性。
JList
答案 1 :(得分:5)
使面板imlement Scrollable是 的方式。另请参阅(除了已提供的Trashgod教程链接)Rob的博客条目
http://tips4java.wordpress.com/2009/12/20/scrollable-panel/
然后:
1)以典型内容合理的方式实现getPreferredScrollableViewportSize()(对于JList f.i.,它是显示的首选行数,也就是:visibleRowCount)
2)为那些“合理的条款”实施setter / getters
这个附加层(协调“合理术语”)允许所有协作组件尽最大努力提出强大的大小提示,而不会像setXXSize那样产生不友好的干扰(这是 no-no-never-ever ,简单地忘记那些方法存在;)
答案 2 :(得分:2)
导致JDialog大小的pack()方法依赖于对getPreferredSize()的调用来确定要使用的大小。
如果您是JDialog的子类,则可以通过继承此方法来强制执行最大大小。
示例:
@Override
public Dimension getPreferredSize() {
int maxWidth=500;
int maxHeight=300;
Dimension dim=super.getPreferredSize();
if (dim.width>maxWidth) dim.width=maxWidth;
if (dim.height>maxHeight) dim.height=maxHeight;
return dim;
}
答案 3 :(得分:1)
你必须从getSize()
里面的JComponents计算JScrollPane
只是简单的例子
编辑:并调用JDialog#pack()
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class PackDialog {
private JDialog dlg;
private JScrollPane scrollPane;
private JPanel panel;
private JButton btn;
public PackDialog() {
btn = new JButton();
btn.setPreferredSize(new Dimension(300, 30));
btn.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnActionPerformed(evt);
}
private void btnActionPerformed(ActionEvent evt) {
int h = panel.getHeight();
h += btn.getHeight();
int w = panel.getWidth();
dlg.setPreferredSize(new Dimension(w, h));
dlg.pack();
}
});
panel = new JPanel();
panel.setPreferredSize(new Dimension(300, 600));
panel.setLayout(new BorderLayout(10, 10));
panel.add(btn, BorderLayout.SOUTH);
scrollPane = new JScrollPane(panel);
dlg = new JDialog();
dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dlg.setPreferredSize(new Dimension(400, 300));
dlg.add(scrollPane);
dlg.pack();
dlg.setVisible(true);
}
public static void main(String[] a_args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
PackDialog pd = new PackDialog();
}
});
}}