Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 摆动JDialog的宽度太宽_Java_Swing - Fatal编程技术网

Java 摆动JDialog的宽度太宽

Java 摆动JDialog的宽度太宽,java,swing,Java,Swing,我试图在Swing中创建一个无模式的对话框菜单,按下按钮即可显示该菜单。该对话框包含多个菜单项。我的问题是对话框窗口比需要的要宽得多。我正在寻求有关设置窗口宽度的帮助 下面是输出的样子。请注意,包含菜单项的窗口比菜单项本身要宽得多。这就是我想要解决的问题 下面是显示此问题的最少代码: import java.awt.Dialog; import java.awt.Dimension; import java.awt.Window; import java.awt.event.ActionEve

我试图在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,这也没什么区别

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

我注意到对话框既没有所有者也没有父对象

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_对话框);