强制 JFrame 在 setResizable(false) 后不调整大小。命令不起作用
Forcing JFrame to not resize after setResizable(false). Command wont work
我有一个简单的 Atari breakout 程序,长话短说,我的增强功能之一是允许用户调整 window 的大小几秒钟,然后使 window 非-可调整大小的 again.Everything 工作正常,并且 window 从不可调整大小变为可调整大小几秒钟。应该发生的是,几秒钟后,window 应该停止接受用于调整 window 大小的输入(即:不应调整大小)。唯一的问题是,每当它应该设置为不可调整大小时,如果您将光标拖到 window 上以调整它的大小,它就会不断调整大小。它只会在您放开 window 后激活 window 的不可调整大小状态。我的问题是,在您放开 window、取消您对调整大小的控制权之前,一旦计时器启动,我该如何做到这一点?
P.S:我想编写程序,让你在命令被调用时立即阻止你调整window的大小,而不是等你松开鼠标。有什么建议吗?
这是一个简化的案例:(您有 6 秒的时间来调整 window 的大小并使用它)
package test;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.Timer;
public class Test {
public static void main(String[] args) {
JFrame testFrame = new JFrame();
testFrame.setResizable(true);
testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
long endingTime = System.currentTimeMillis() + 6000;
Timer testTimer = new Timer(100, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if((endingTime - System.currentTimeMillis()) < 0){
testFrame.setResizable(false);
}
}
});
testFrame.setVisible(true);
testTimer.start();
}
}
您是否尝试过在启动结束后立即重新验证 JFrame?这很可能会解决您的问题(尽管我不知道,因为您既没有 SSCCE 也没有 MVCE)。希望对您有所帮助,祝您好运。
我能想到的一种方法是,如果框架不可调整大小,则在调整大小事件后将大小设置回原位。
但不确定它的效果如何。
frame.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
if (!frame.isResizable()) {
frame.setSize(...);
}
}
});
使用 Java 的 Robot
class 强制释放鼠标。我在下面修改了您的示例代码:
public static void main(String[] args) {
JFrame testFrame = new JFrame();
testFrame.setResizable(true);
testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Timer testTimer = new Timer(6000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
testFrame.setResizable(false);
Robot r;
try {
r = new Robot();
r.mouseRelease( InputEvent.BUTTON1_DOWN_MASK);
} catch (AWTException ex) {
ex.printStackTrace();
}
}
});
testFrame.setVisible(true);
testTimer.start();
}
我有一个简单的 Atari breakout 程序,长话短说,我的增强功能之一是允许用户调整 window 的大小几秒钟,然后使 window 非-可调整大小的 again.Everything 工作正常,并且 window 从不可调整大小变为可调整大小几秒钟。应该发生的是,几秒钟后,window 应该停止接受用于调整 window 大小的输入(即:不应调整大小)。唯一的问题是,每当它应该设置为不可调整大小时,如果您将光标拖到 window 上以调整它的大小,它就会不断调整大小。它只会在您放开 window 后激活 window 的不可调整大小状态。我的问题是,在您放开 window、取消您对调整大小的控制权之前,一旦计时器启动,我该如何做到这一点?
P.S:我想编写程序,让你在命令被调用时立即阻止你调整window的大小,而不是等你松开鼠标。有什么建议吗?
这是一个简化的案例:(您有 6 秒的时间来调整 window 的大小并使用它)
package test;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.Timer;
public class Test {
public static void main(String[] args) {
JFrame testFrame = new JFrame();
testFrame.setResizable(true);
testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
long endingTime = System.currentTimeMillis() + 6000;
Timer testTimer = new Timer(100, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if((endingTime - System.currentTimeMillis()) < 0){
testFrame.setResizable(false);
}
}
});
testFrame.setVisible(true);
testTimer.start();
}
}
您是否尝试过在启动结束后立即重新验证 JFrame?这很可能会解决您的问题(尽管我不知道,因为您既没有 SSCCE 也没有 MVCE)。希望对您有所帮助,祝您好运。
我能想到的一种方法是,如果框架不可调整大小,则在调整大小事件后将大小设置回原位。
但不确定它的效果如何。
frame.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
if (!frame.isResizable()) {
frame.setSize(...);
}
}
});
使用 Java 的 Robot
class 强制释放鼠标。我在下面修改了您的示例代码:
public static void main(String[] args) {
JFrame testFrame = new JFrame();
testFrame.setResizable(true);
testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Timer testTimer = new Timer(6000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
testFrame.setResizable(false);
Robot r;
try {
r = new Robot();
r.mouseRelease( InputEvent.BUTTON1_DOWN_MASK);
} catch (AWTException ex) {
ex.printStackTrace();
}
}
});
testFrame.setVisible(true);
testTimer.start();
}