gpt4 book ai didi

java - 当最小化或调整 JFrame 大小时,由线程调整大小的 JPanel 会获取其默认大小

转载 作者:行者123 更新时间:2023-12-01 18:15:20 25 4
gpt4 key购买 nike

我在想做的事情上遇到了一些麻烦。基本上,我有一个 JPanel,当我单击 JButton 时,它会由线程重新调整大小。这工作正常,但是当我再次调整 JFrame 的大小或最小化和最大化 JFrame 时,JPanel 会恢复其默认大小。

这是我的线程的类代码

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 线程规则。避免这种情况,否则您的代码可能会抛出间歇性且很难调试的异常。
  • 使用Swing Timer ,不是后台线程来解决上述问题。
  • 如果您将来确实使用线程,那么实现 Runnable 几乎总是比扩展 Thread 更好。
  • 大多数布局管理器并不考虑组件的大小,而是考虑其首选大小。当您更改 JFrame 时您就会发现这一点。您可以通过调用 setPreferredSize(...) 或重写其 getPreferredSize() 方法来更改组件的 PreferredSize。

关于java - 当最小化或调整 JFrame 大小时,由线程调整大小的 JPanel 会获取其默认大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30010839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com