首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swing JDialog宽度太宽

Swing JDialog宽度太宽
EN

Stack Overflow用户
提问于 2020-11-20 07:55:38
回答 1查看 80关注 0票数 0

我正在尝试在Swing中创建一个无模式对话框菜单,该菜单在按下按钮时显示。该对话框包含多个菜单项。我的问题是对话框窗口太宽了。我正在寻找有关设置窗口宽度的帮助。

下面是输出的样子。请注意,包含菜单项的窗口比菜单项本身要宽得多。这就是我想解决的问题。

下面是显示此问题的最小代码:

代码语言:javascript
复制
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:

代码语言:javascript
复制
jmenuItem1 is 87.000000 x 21.000000
jdialog is 324.000000 x 88.000000

我还尝试过使用jdialog.setSize()和jdialog.setMaximumSize()方法。我已经尝试设置菜单项的最大尺寸。它们似乎都不会对对话框的窗口大小产生任何影响。

我也尝试了GridLayout,而不是BoxLayout --也没什么区别。

我还尝试了设置对话框的内容窗格和分层窗格的宽度。仍然没有区别。

我注意到该对话框既没有所有者也没有父级。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-20 08:36:26

代码语言:javascript
复制
testDialog = new TestDialog(SwingUtilities.windowForComponent(jframe));

您不需要使用windowForComponent(...)方法。您已经有一个对父框架的引用:

代码语言:javascript
复制
testDialog = new TestDialog( jframe );

不要试图硬编码大小。每个组件将确定其自己的首选大小,然后布局管理器将使用此信息来确定总体大小。

代码语言:javascript
复制
//jdialog.setPreferredSize(new Dimension(100, 0));

设计用于JMenu的JMenuItem。相反,您应该使用JButton来添加到常规面板中。

我对尺寸没有问题。对话框的宽度/高度与预期一致。

请注意,我在Windows10上使用JDK11。当我运行您的原始代码时,对话框没有大小,因为setPreferredSize()语句导致高度为0。所以我不确定你是如何在你的图像中显示的。

是的,对话框宽度比添加到框架中的组件宽,因为即使没有组件添加到对话框中,对话框也有最小宽度才能够显示标题栏。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64921798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档