【问题标题】:JPanel re-sized by a Thread gets its default size when minimizing or re-sizing JFrame最小化或重新调整 JFrame 大小时,由 Thread 重新调整大小的 JPanel 将获得其默认大小
【发布时间】:2015-05-03 06:15:57
【问题描述】:

我在想做的事情上遇到了一些麻烦。 基本上,我有一个 JPanel,当我单击 JButton 时,它会由 Thread 重新调整大小。这很好用,但是当我重新调整 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();
}

谢谢。

【问题讨论】:

标签: java multithreading swing jframe jpanel


【解决方案1】:

这里的问题:

  • 您的代码通过在后台线程中更改 Swing 状态来忽略所有 Swing 线程规则。避免这种情况,否则您的代码可能会抛出间歇性且难以调试的异常。
  • 使用Swing Timer,而不是后台线程来解决上述问题。
  • 如果您将来确实要使用线程,那么几乎总是最好实现 Runnable 而不是扩展 Thread。
  • 大多数布局管理器不考虑组件的大小,而是考虑它的preferredSize。当您更改 JFrame 时,您会发现这一点。您可以通过调用setPreferredSize(...) 或覆盖其getPreferredSize() 方法来更改组件的preferredSize。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    相关资源
    最近更新 更多