java 设置 JDialog 的最大大小?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5759131/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Setting the maximum size of a JDialog?
提问by Electrons_Ahoy
The short version: do I need to do something tricky to get JDialog's setMaximumSize() to work?
简短版本:我需要做一些棘手的事情才能让 JDialog 的 setMaximumSize() 工作吗?
The full version: I've got a JDialog (layout manager: BorderLayout) which contains a scroll pane and a JPanel on the bottom with the commit buttons.
完整版:我有一个 JDialog(布局管理器:BorderLayout),它包含一个滚动窗格和一个底部带有提交按钮的 JPanel。
The scroll pane contains a JPanel which is built dynamically elsewhere in the system.
滚动窗格包含一个 JPanel,它是在系统的其他地方动态构建的。
What I want is for the dialog to dynamically size itself around the JPanel up to a certain size, and then start growing scrollbars. This is, more or less, what happens by default, except the maximum size seems to be the size of my monitor.
我想要的是让对话框在 JPanel 周围动态调整自己的大小,直到达到一定的大小,然后开始增长滚动条。这或多或少是默认情况下发生的情况,除了最大尺寸似乎是我的显示器的尺寸。
I thoughtthis is what the .setMaximumSize() method inherited from java.awt.Component did, but setting it doesn't seem to have any effect.
我认为这是从 java.awt.Component 继承的 .setMaximumSize() 方法所做的,但设置它似乎没有任何效果。
Setting the preferred size does has an effect - but then the dialog is always that size no matter what, which really isn't what I want.
设置首选大小确实会产生影响 - 但无论如何,对话框始终是那个大小,这确实不是我想要的。
(And the effects are the same if I set the maximum/preferred size properties on the scroll pane.)
(如果我在滚动窗格上设置最大/首选大小属性,效果是一样的。)
Have I missed something tremendously obvious? Is there some wacky JDialog / BorderLayout / MaximumSize interaction I don't know about?
我错过了一些非常明显的东西吗?是否有一些我不知道的古怪 JDialog/BorderLayout/MaximumSize 交互?
回答by trashgod
As discussed in Sizing a Scroll Pane, some components can provide useful information about setting the viewport's preferred size. The setVisibleRowCount()
method of JList
is particularly convenient, but even getViewport().setPreferredSize(…)
may suffice. Naturally, an ssccewould help.
如调整滚动窗格大小 中所述,某些组件可以提供有关设置视口首选大小的有用信息。的setVisibleRowCount()
方法JList
特别方便,但甚至getViewport().setPreferredSize(…)
可能就足够了。当然,sscce会有所帮助。
Addendum: As a concrete example, the dialog below is initially sized to have N-2 rows. As more are added, the dialog grows until the number reaches N. At that point the scrollbars start "growing". The example uses a JList
, but any Scrollable
component should be adaptable.
附录:作为一个具体示例,下面的对话框最初大小为N-2 行。随着添加更多,对话框会增长,直到数量达到N。那时滚动条开始“增长”。该示例使用JList
,但任何Scrollable
组件都应具有适应性。
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
/** @see http://stackoverflow.com/questions/5759131 */
public class ListDialog {
private static final int N = 12;
private JDialog dlg = new JDialog();
private DefaultListModel model = new DefaultListModel();
private JList list = new JList(model);
private JScrollPane sp = new JScrollPane(list);
private int count;
public ListDialog() {
JPanel panel = new JPanel();
panel.add(new JButton(new AbstractAction("Add") {
@Override
public void actionPerformed(ActionEvent e) {
append();
if (count <= N) {
list.setVisibleRowCount(count);
dlg.pack();
}
}
}));
for (int i = 0; i < N - 2; i++) {
this.append();
}
list.setVisibleRowCount(N - 2);
dlg.add(sp, BorderLayout.CENTER);
dlg.add(panel, BorderLayout.SOUTH);
dlg.pack();
dlg.setLocationRelativeTo(null);
dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dlg.setVisible(true);
}
private void append() {
model.addElement("String " + String.valueOf(++count));
list.ensureIndexIsVisible(count - 1);
}
public static void main(String[] a_args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
ListDialog pd = new ListDialog();
}
});
}
}
回答by kleopatra
Make the panel imlement Scrollable is theway to go. See also (in addition to the tutorial link Trashgod already provided) Rob's blog entry
使面板实现可滚动是要走的路。另请参阅(除了 Trashgod 已经提供的教程链接)Rob 的博客条目
http://tips4java.wordpress.com/2009/12/20/scrollable-panel/
http://tips4java.wordpress.com/2009/12/20/scrollable-panel/
then:
然后:
1) implement getPreferredScrollableViewportSize() in terms reasonable for the typical content (for a JList f.i. that's the preferred number of rows to show, aka: visibleRowCount)
2) implement setters/getters for those "reasonable terms"
1) 以对于典型内容而言合理的方式实现 getPreferredScrollableViewportSize()(对于 JList fi,它是要显示的首选行数,又名:visibleRowCount)
2)为那些“合理的条件”实现 setter/getter
That additional layer (coordiates "reasonable terms") allows all collaborating components to do their best to come up with robust size hints without unfriendly interference as setXXSize (which is a no-no-never-ever, simply forget those methods exist ;)
该附加层(协调“合理条款”)允许所有协作组件尽最大努力提出健壮的大小提示,而不会产生不友好的干扰,如 setXXSize(这是一个永远不会,只需忘记这些方法存在;)
回答by Kjakan
The pack() method which causes the JDialog to be sized relies on a call to getPreferredSize() to determine which size to use.
导致 JDialog 大小调整的 pack() 方法依赖于对 getPreferredSize() 的调用来确定要使用的大小。
If you subclass JDialog you can enforce a maximum size by subclassing this method.
如果子类化 JDialog,则可以通过子类化此方法来强制最大大小。
Example:
例子:
@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;
}
回答by mKorbel
you have to calculate getSize()
from JComponents inside JScrollPane
just simple example
你必须getSize()
在JScrollPane
简单的例子中从 JComponents计算
Edit: and call JDialog#pack()
编辑:并调用 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();
}
});
}}