Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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 与Jframes'不一致的行为;s setMinimumSize并在windows缩放未设置为100%时手动拖动_Java_Windows_Swing_Jframe - Fatal编程技术网

Java 与Jframes'不一致的行为;s setMinimumSize并在windows缩放未设置为100%时手动拖动

Java 与Jframes'不一致的行为;s setMinimumSize并在windows缩放未设置为100%时手动拖动,java,windows,swing,jframe,Java,Windows,Swing,Jframe,我使用的是Java8,我有一个JFrame,我希望它具有所需的最小大小。如果框架被放大,这是可以的,但是它不应该低于最小值,这样GUI就可以使用了。 为此,我使用本文中描述的解决方案。我首先使用pack,然后将最小大小设置为帧大小。但由于某些原因,它只在Windows缩放设置为1/100%时起作用。对于其他缩放值,我实际上可以通过拖动使帧变小(这与缩放值成比例) 下面是一个示例代码 import java.awt.BorderLayout; import javax.swing.*; publ

我使用的是Java8,我有一个JFrame,我希望它具有所需的最小大小。如果框架被放大,这是可以的,但是它不应该低于最小值,这样GUI就可以使用了。 为此,我使用本文中描述的解决方案。我首先使用
pack
,然后将最小大小设置为帧大小。但由于某些原因,它只在Windows缩放设置为1/100%时起作用。对于其他缩放值,我实际上可以通过拖动使帧变小(这与缩放值成比例)

下面是一个示例代码

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

public class ScalingProblem extends JFrame {

  public ScalingProblem() {

    setTitle("My Gui");
    setSize(400, 400);

    JButton button = new JButton("Button 1");
    JButton button2 = new JButton("Button 2");
    JButton button3 = new JButton("Button 3");
    JButton button4 = new JButton("Button 4");
    JPanel panel = new JPanel(new BorderLayout());

    panel.add(button, BorderLayout.NORTH);
    panel.add(button2, BorderLayout.EAST);
    panel.add(button3, BorderLayout.WEST);
    panel.add(button4, BorderLayout.SOUTH);

    this.getContentPane().add(panel);

    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    pack();
    setMinimumSize(getSize());
  }

  public static void main(String[] args) {

    ScalingProblem a = new ScalingProblem();
  }
}
即使设置了最小帧大小,我也可以将其缩小1.25倍,这也是我的显示比例因子

因此,基本上,当拖动帧时,可以使用
setMinimumSize
使大小小于最小大小集。我试图将最小大小设置为getSize返回值的1.25倍,但这会使帧变大,并且我无法使用
pack
setSize
等方法使其变小

所以我的问题是

  • 我是否可以使用
    setMinimumSize
    设置框架集的最小尺寸
  • 我可以使用
    setMinimumSize
    使帧大小小于设置的大小吗 手动拖动
  • 我发现了一个(肮脏的)技巧:获取比例因子并相应地计算最小尺寸;然后在设置缩放的最小尺寸时暂时禁用setSize方法

    package test;
    
    import java.awt.Dimension;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.geom.AffineTransform;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class TestScaling extends JFrame {
    
        public TestScaling() {
            super("Test scaling");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JPanel panel=new JPanel(new GridBagLayout());
            GridBagConstraints c=new GridBagConstraints();
            for (int i=0;i<10;i++) {
                for (int j=0;j<8;j++) {
                    c.gridx=j;
                    c.gridy=i;
                    panel.add(new JButton(i+"x"+j),c);
                }
            }
            setContentPane(panel);
            pack();
            Dimension dorig=getSize();
            AffineTransform at=getGraphicsConfiguration().getDefaultTransform();
            Dimension dmin=new Dimension((int) (dorig.width*at.getScaleX()), (int) (dorig.height*at.getScaleY()));
            
            //A dirty trick, when workaround is true setSize(int,int) will not work
            //so setMinimumSize will not resize the window
            workaround=true;
            setMinimumSize(dmin);
            workaround=false;
        }
        
        protected boolean workaround;
        
        @Override
        public void setSize(int width, int height) {
            if (workaround) {
                return;
            }
            super.setSize(width, height);
        }
        
        
        public static void main(String[] args) {
            new TestScaling().setVisible(true);
        }
    }
    
    这是在单屏幕环境下工作,对于多个屏幕,我必须处理它(当窗口移动时,基本上检查图形配置并更新最小大小)

    封装测试;
    导入java.awt.Dimension;
    导入java.awt.GridBagConstraints;
    导入java.awt.GridBagLayout;
    导入java.awt.geom.AffineTransform;
    导入javax.swing.JButton;
    导入javax.swing.JFrame;
    导入javax.swing.JPanel;
    公共类TestScaling扩展了JFrame{
    公共TestScaling(){
    超级(“测试缩放”);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel panel=newjpanel(newgridbagloayout());
    GridBagConstraints c=新的GridBagConstraints();
    对于(int i=0;i很幸运,这是一个,唯一的解决办法似乎是使用ComponentListener恢复正确的大小,如详细所述;解决办法的问题是它无法阻止调整大小,因此您将看到窗口缩小一点,然后立即再次放大。