我正在尝试在Swing中创建一个无模式对话框菜单,该菜单在按下按钮时显示。该对话框包含多个菜单项。我的问题是对话框窗口太宽了。我正在寻找有关设置窗口宽度的帮助。
下面是输出的样子。请注意,包含菜单项的窗口比菜单项本身要宽得多。这就是我想解决的问题。

下面是显示此问题的最小代码:
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;
public class Test {
public static void main(String[] args) {
new Test().run();
}
TestDialog testDialog;
private void run() {
JFrame jframe = new JFrame();
JButton jbutton = new JButton("test");
jframe.add(jbutton);
jbutton.setBounds(130, 100, 100, 40);
jframe.setSize(400, 500);
jframe.setLayout(null);
jframe.setVisible(true);
testDialog = new TestDialog(SwingUtilities.windowForComponent(jframe));
jbutton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
testDialog.show();
}
});
}
private class TestDialog {
JDialog jdialog;
public TestDialog(Window parent) {
jdialog = new JDialog(parent, "Test", Dialog.ModalityType.MODELESS);
jdialog.setPreferredSize(new Dimension(100, 0));
jdialog.setLayout(new BoxLayout(jdialog.getContentPane(), BoxLayout.Y_AXIS));
JMenuItem jmenuItem1 = new JMenuItem("MenuItem 1");
Dimension jmiDimension = jmenuItem1.getPreferredSize();
System.out.printf("jmenuItem1 is %f x %f%n", jmiDimension.getWidth(), jmiDimension.getHeight());
jdialog.add(jmenuItem1);
jdialog.add(new JMenuItem("MenuItem 2"));
jdialog.pack();
Dimension d = jdialog.getSize();
System.out.printf("jdialog is %f x %f%n", d.getWidth(), d.getHeight());
}
public void show() {
jdialog.setVisible(true);
}
}
}程序打印此输出,显示对话框为324像素宽,但菜单项为87:
jmenuItem1 is 87.000000 x 21.000000
jdialog is 324.000000 x 88.000000我还尝试过使用jdialog.setSize()和jdialog.setMaximumSize()方法。我已经尝试设置菜单项的最大尺寸。它们似乎都不会对对话框的窗口大小产生任何影响。
我也尝试了GridLayout,而不是BoxLayout --也没什么区别。
我还尝试了设置对话框的内容窗格和分层窗格的宽度。仍然没有区别。
我注意到该对话框既没有所有者也没有父级。
发布于 2020-11-20 08:36:26
testDialog = new TestDialog(SwingUtilities.windowForComponent(jframe));您不需要使用windowForComponent(...)方法。您已经有一个对父框架的引用:
testDialog = new TestDialog( jframe );不要试图硬编码大小。每个组件将确定其自己的首选大小,然后布局管理器将使用此信息来确定总体大小。
//jdialog.setPreferredSize(new Dimension(100, 0));设计用于JMenu的JMenuItem。相反,您应该使用JButton来添加到常规面板中。
我对尺寸没有问题。对话框的宽度/高度与预期一致。
请注意,我在Windows10上使用JDK11。当我运行您的原始代码时,对话框没有大小,因为setPreferredSize()语句导致高度为0。所以我不确定你是如何在你的图像中显示的。
是的,对话框宽度比添加到框架中的组件宽,因为即使没有组件添加到对话框中,对话框也有最小宽度才能够显示标题栏。
https://stackoverflow.com/questions/64921798
复制相似问题