我正在尝试在按钮点击时调整JFrame的大小,代码运行良好(但我不知道这是否是实现此目的的最佳方式)。
但问题是: 调整大小时,JFrame会慢慢重新验证。 GIF可以解释究竟发生了什么:
这段代码是:
chatButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
new Thread (new Runnable() {
public void run(){
int width = frame.getWidth();
int height = frame.getHeight();
int buttonWidth = chatButton.getWidth();
if (frame.getWidth() < 1150) {
while (frame.getWidth() < 1150) {
width = frame.getWidth();
frame.setSize(width + 2 , height);
chatButton.setLocation(width - buttonWidth , 0);
frame.invalidate();
frame.validate();
}
} else {
while (frame.getWidth() > 897) {
width = frame.getWidth();
frame.setSize(width - 2 , height);
chatButton.setLocation(width - buttonWidth , 0);
frame.invalidate();
frame.validate();
}
}
}
}).start();
}
});
我把它放在Runnable中,因为在调整大小结束之前它没有重新验证。
我也尝试了repaint()
和revalidate()
,但他们根本没有解决问题。
我该怎么办?
提前致谢。
答案 0 :(得分:0)
这是因为您从非摆动螺纹调整摆动组件的尺寸。这将导致窗口的大小与组件的实际移动不同步。通过使内部代码在计时器上运行每隔50毫秒启动一次,您可以在没有抖动的情况下获得平滑打开。
timer = new Timer(50, new ActionListener() {
public void actionPerformed(ActionEvent e) {
int width = frame.getWidth();
int height = frame.getHeight();
int buttonWidth = chatButton.getWidth();
if(frame.getWidth() < 1150) {
width = frame.getWidth();
frame.setSize(width + 2 , height);
chatButton.setLocation(width - buttonWidth , 0);
frame.invalidate();
frame.validate();
} else {
((Timer)e.getSource()).cancel()
}
});
timer.setInitialDelay(0);
timer.start();
以上代码是打开屏幕时如何执行此操作的示例,您需要使用相同的逻辑进行关闭。