Java 摆动JDialog的宽度太宽
我试图在Swing中创建一个无模式的对话框菜单,按下按钮即可显示该菜单。该对话框包含多个菜单项。我的问题是对话框窗口比需要的要宽得多。我正在寻求有关设置窗口宽度的帮助 下面是输出的样子。请注意,包含菜单项的窗口比菜单项本身要宽得多。这就是我想要解决的问题 下面是显示此问题的最少代码:Java 摆动JDialog的宽度太宽,java,swing,Java,Swing,我试图在Swing中创建一个无模式的对话框菜单,按下按钮即可显示该菜单。该对话框包含多个菜单项。我的问题是对话框窗口比需要的要宽得多。我正在寻求有关设置窗口宽度的帮助 下面是输出的样子。请注意,包含菜单项的窗口比菜单项本身要宽得多。这就是我想要解决的问题 下面是显示此问题的最少代码: import java.awt.Dialog; import java.awt.Dimension; import java.awt.Window; import java.awt.event.ActionEve
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,这也没什么区别
我还尝试设置对话框内容窗格和分层窗格的宽度。还是没有区别
我注意到对话框既没有所有者也没有父对象
testDialog = new TestDialog(SwingUtilities.windowForComponent(jframe));
您不需要使用windowForComponent(…)方法。您已经有了对父帧的引用:
testDialog = new TestDialog( jframe );
不要试图硬编码大小。每个组件将确定其自己的首选尺寸,然后布局管理器将使用此信息确定总体尺寸
//jdialog.setPreferredSize(new Dimension(100, 0));
JMenuItem设计用于JMenu。相反,您应该使用JButton添加到常规面板
我对尺寸没有问题。对话框的宽度/高度与预期一致
注意:我在Windows10上使用JDK11。当我运行原始代码时,对话框没有大小,因为setPreferredSize()
语句导致高度为0。所以我不确定你是如何在你的图像中显示的
是的,对话框宽度比添加到框架中的组件宽,因为对话框有一个最小宽度,即使没有组件添加到对话框中,也可以显示标题栏
您不需要使用windowForComponent(…)方法。您已经有了对父帧的引用:
testDialog = new TestDialog( jframe );
不要试图硬编码大小。每个组件将确定其自己的首选尺寸,然后布局管理器将使用此信息确定总体尺寸
//jdialog.setPreferredSize(new Dimension(100, 0));
JMenuItem设计用于JMenu。相反,您应该使用JButton添加到常规面板
我对尺寸没有问题。对话框的宽度/高度与预期一致
注意:我在Windows10上使用JDK11。当我运行原始代码时,对话框没有大小,因为setPreferredSize()
语句导致高度为0。所以我不确定你是如何在你的图像中显示的
是的,对话框宽度比添加到框架中的组件宽,因为对话框有一个最小宽度,即使没有组件添加到对话框中,也可以显示标题栏。谢谢您的回答。关于“对话框宽度比添加到框架中的组件宽,因为对话框有一个能够显示标题栏的最小宽度”,这听起来像是我出现问题的原因。没有办法覆盖这个宽度吗?我使用的标题不是很长。创建一个没有组件的空框架,看看宽度有多小。如果你想要一个标题栏,我不知道怎么把它变小。你可以使用一个没有标题栏的“未修饰”JDialog。谢谢你的回答。关于“对话框宽度比添加到框架中的组件宽,因为对话框有一个能够显示标题栏的最小宽度”,这听起来像是我出现问题的原因。没有办法覆盖这个宽度吗?我使用的标题不是很长。创建一个没有组件的空框架,看看宽度有多小。如果你想要一个标题栏,我不知道怎么把它变小。你可以使用一个没有标题栏的“未修饰”JDialog。我通过搜索互联网找到了这个解决方案。但折衷的办法是,您会得到一个没有正常外观(背景色等)的标题栏:jdialog.setUndercorated(true);jdialog.getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_对话框);我通过搜索互联网找到了这个解决方案。但折衷的办法是,您会得到一个没有正常外观(背景色等)的标题栏:jdialog.setUndercorated(true);jdialog.getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_对话框);