Java JDialog在Windows 10上有一个隐式最小宽度,如何绕过它?

Java JDialog在Windows 10上有一个隐式最小宽度,如何绕过它?,java,swing,windows-10,jdialog,Java,Swing,Windows 10,Jdialog,在Windows10(Java7及以上版本)上,我似乎无法使JDialog小于最小宽度。最小宽度似乎是230px,即使指定新的最小尺寸,也不可能使其变小,如下面的代码所示: import javax.swing.*; import java.awt.*; public class TestDialog { public TestDialog() { JDialog testDialog = new JDialog(); testDialog.setSiz

在Windows10(Java7及以上版本)上,我似乎无法使JDialog小于最小宽度。最小宽度似乎是230px,即使指定新的最小尺寸,也不可能使其变小,如下面的代码所示:

import javax.swing.*;
import java.awt.*;

public class TestDialog {
    public TestDialog() {
        JDialog testDialog = new JDialog();
        testDialog.setSize(new Dimension(10, 100));
        testDialog.setMinimumSize(new Dimension(10, 100));
        testDialog.setLocationRelativeTo(null);
        testDialog.setVisible(true);
    }

    public static void main(String args[]) {
        new TestDialog();
    }
}


如何强制JDialog小于该值?

是的,将对话框设置为未修饰状态将起作用:

SwingUtilities.invokeLater(() -> {
    JDialog testDialog = new JDialog();
    testDialog.setUndecorated(true);  // ****** here ******
    testDialog.setSize(new Dimension(10, 100));
    testDialog.setMinimumSize(new Dimension(10, 100));
    testDialog.setLocationRelativeTo(null);
    testDialog.setVisible(true);
});

不确定是否存在其他解决方案

是,将对话框设置为未修饰将起作用:

SwingUtilities.invokeLater(() -> {
    JDialog testDialog = new JDialog();
    testDialog.setUndecorated(true);  // ****** here ******
    testDialog.setSize(new Dimension(10, 100));
    testDialog.setMinimumSize(new Dimension(10, 100));
    testDialog.setLocationRelativeTo(null);
    testDialog.setVisible(true);
});

不确定是否存在其他解决方案

问题似乎在于默认的外观
当我在设置
testDialog.setUndercorated(true)之后尝试设置不同的装饰样式时根据我的建议,我得到了一个非常狭窄的装饰对话框:

    class TestDialog {

    public TestDialog() {
        JDialog testDialog = new JDialog();
        testDialog.setUndecorated( true );
        testDialog.getRootPane( ).setWindowDecorationStyle(JRootPane.PLAIN_DIALOG );
        testDialog.getContentPane().add(makeContent());
        testDialog.setLocationRelativeTo(null);
        testDialog.pack();
        testDialog.setVisible(true);
    }

    private JPanel makeContent(){
        JPanel pane = new JPanel(new GridLayout(0, 1));
        pane.add(new JLabel("  1 "));
        pane.add(new JLabel("  2 "));
        pane.add(new JLabel("  3 "));
        return pane;
    }

    public static void main(final String args[]) {
        new TestDialog();
    }
}

问题似乎在于默认的外观
当我在设置
testDialog.setUndercorated(true)之后尝试设置不同的装饰样式时根据我的建议,我得到了一个非常狭窄的装饰对话框:

    class TestDialog {

    public TestDialog() {
        JDialog testDialog = new JDialog();
        testDialog.setUndecorated( true );
        testDialog.getRootPane( ).setWindowDecorationStyle(JRootPane.PLAIN_DIALOG );
        testDialog.getContentPane().add(makeContent());
        testDialog.setLocationRelativeTo(null);
        testDialog.pack();
        testDialog.setVisible(true);
    }

    private JPanel makeContent(){
        JPanel pane = new JPanel(new GridLayout(0, 1));
        pane.add(new JLabel("  1 "));
        pane.add(new JLabel("  2 "));
        pane.add(new JLabel("  3 "));
        return pane;
    }

    public static void main(final String args[]) {
        new TestDialog();
    }
}

我能想到的唯一方法是,尽快对其进行装饰,以获得更好的帮助,添加一个or。2) 这样一个小对话框的目的是什么?1)编辑,2)在狭窄的、堆叠的JLabel(列)中显示数据。我能想到的唯一方法是取消装饰1)以便更快地获得更好的帮助,添加or。2) 这样一个小对话框的目的是什么?1)编辑,2)以狭窄的、堆叠的JLabel(在一列中)显示数据这将删除所有窗口装饰(图标、标题栏、关闭按钮),我仍然需要能够移动窗口和/或关闭它。@Bastien:但是你没有看到这些组件迫使你的对话框保持一定的最小宽度吗?如果你需要移动它,你可以在对话框中添加一个鼠标监听器,以及其他允许你关闭它的东西,但恐怕你不能同时拥有蛋糕和吃掉它。是的,这显然是windows 10的装饰问题,这就是我在最初的帖子中提到操作系统的原因。我知道我可以添加一个鼠标侦听器,这可能是我最终要做的,但在JDialog的情况下,当windows UI应该处理这个问题时,这看起来就像是重新发明了轮子。这会删除所有windows装饰(图标、标题栏、关闭按钮),我仍然需要能够移动窗口和/或关闭它。@Bastien:但是你没有看到这些组件迫使你的对话框保持一定的最小宽度吗?如果你需要移动它,你可以在对话框中添加一个鼠标监听器,以及其他允许你关闭它的东西,但恐怕你不能同时拥有蛋糕和吃掉它。是的,这显然是windows 10的装饰问题,这就是我在最初的帖子中提到操作系统的原因。我知道我可以添加一个鼠标侦听器,这可能是我最终要做的,但在JDialog的情况下,当windows UI应该处理这个问题时,这一切看起来就像是在重新发明轮子。