Java 与Jframes'不一致的行为;s setMinimumSize并在windows缩放未设置为100%时手动拖动
我使用的是Java8,我有一个JFrame,我希望它具有所需的最小大小。如果框架被放大,这是可以的,但是它不应该低于最小值,这样GUI就可以使用了。 为此,我使用本文中描述的解决方案。我首先使用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
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
使帧大小小于设置的大小吗
手动拖动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恢复正确的大小,如详细所述;解决办法的问题是它无法阻止调整大小,因此您将看到窗口缩小一点,然后立即再次放大。