Java 当最小化或重新调整JFrame大小时,由线程重新调整大小的JPanel将获得其默认大小
我想做的事有些麻烦。 基本上,我有一个JPanel,当我点击一个JButton时,它会被一个线程重新调整大小。这很好,但是当我重新调整JFrame的大小或最小化和最大化JFrame时,JPanel会恢复其默认大小 这是我的线程的类代码Java 当最小化或重新调整JFrame大小时,由线程重新调整大小的JPanel将获得其默认大小,java,multithreading,swing,jframe,jpanel,Java,Multithreading,Swing,Jframe,Jpanel,我想做的事有些麻烦。 基本上,我有一个JPanel,当我点击一个JButton时,它会被一个线程重新调整大小。这很好,但是当我重新调整JFrame的大小或最小化和最大化JFrame时,JPanel会恢复其默认大小 这是我的线程的类代码 public class Slider extends Thread { private JPanel panel; private boolean running = true; private int maxWidth = 0; public Slider
public class Slider extends Thread {
private JPanel panel;
private boolean running = true;
private int maxWidth = 0;
public Slider(JPanel panel, int maxWidth) {
this.panel = (JPanel)panel;
this.maxWidth = maxWidth;
}
public JPanel getPanel() {
return panel;
}
public void setPanel(JPanel panel) {
this.panel = panel;
}
public boolean isRunning() {
return running;
}
public void setRunning(boolean running) {
this.running = running;
}
public void extendJPanelHorizontally(){
this.panel.setSize(this.panel.getWidth()+1, this.panel.getHeight());
}
@Override
public void run() {
while (running){
if (this.panel.getWidth() >= this.maxWidth){
running = false;
System.out.println("Finishing...");
}else{
System.out.println("Re-sizing...");
this.extendJPanelHorizontally();
}
try {
Thread.sleep(3);
System.out.println("Waiting...");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
}
我的按钮就是这样做的:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
Slider slider = new Slider((JPanel)this.jPanel1, 200);
slider.start();
}
谢谢。这里有问题:
- 您的代码通过在后台线程中更改Swing状态来忽略所有Swing线程规则。避免这种情况,否则您的代码可能会抛出间歇性的、很难调试的异常
- 使用一个而不是后台线程来解决上述问题
- 如果将来确实使用线程,那么实现可运行几乎总是比扩展线程更好
- 大多数布局管理器不考虑组件的大小,而是考虑其首选大小。当你改变JFrame时,你会发现这一点。您可以通过调用
或重写其setPreferredSize(…)
方法来更改组件的preferredSizegetPreferredSize()
- 您的代码通过在后台线程中更改Swing状态来忽略所有Swing线程规则。避免这种情况,否则您的代码可能会抛出间歇性的、很难调试的异常
- 使用一个而不是后台线程来解决上述问题
- 如果将来确实使用线程,那么实现可运行几乎总是比扩展线程更好
- 大多数布局管理器不考虑组件的大小,而是考虑其首选大小。当你改变JFrame时,你会发现这一点。您可以通过调用
或重写其setPreferredSize(…)
方法来更改组件的preferredSizegetPreferredSize()