Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当最小化或重新调整JFrame大小时,由线程重新调整大小的JPanel将获得其默认大小_Java_Multithreading_Swing_Jframe_Jpanel - Fatal编程技术网

Java 当最小化或重新调整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

我想做的事有些麻烦。 基本上,我有一个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线程规则。避免这种情况,否则您的代码可能会抛出间歇性的、很难调试的异常
  • 使用一个而不是后台线程来解决上述问题
  • 如果将来确实使用线程,那么实现可运行几乎总是比扩展线程更好
  • 大多数布局管理器不考虑组件的大小,而是考虑其首选大小。当你改变JFrame时,你会发现这一点。您可以通过调用
    setPreferredSize(…)
    或重写其
    getPreferredSize()
    方法来更改组件的preferredSize
这里的问题:

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

1)要更快地获得更好的帮助,请发布(最简单的完整可验证示例)或(简短、完整、正确的示例)。2) 将面板的大小留给布局管理器!3) 请参阅,以了解一个我不再费心解决的问题。请查看类似以下内容:1)要更快获得更好的帮助,请发布(最小完整可验证示例)或(简短、自包含、正确的示例)。2) 将面板的大小留给布局管理器!3) 看看有没有一个问题我再也懒得去解决了