Java 在循环中使用JFrame.pack()

Java 在循环中使用JFrame.pack(),java,multithreading,swing,event-dispatch-thread,pack,Java,Multithreading,Swing,Event Dispatch Thread,Pack,我想逐步修改JavaJFrame设计结构,如本简单示例中所示。在一个循环中,我正在增加JPanel的de preferredWidth并使用方法pack()。但显然,pack方法被忽略了。如果我把包放在循环之外,只使用一次,那就是工作。有人知道原因和可能的解决方案吗 public class Calculadora extends JFrame { private JPanel pnl = new JPanel(); private boolean flag; public Calculad

我想逐步修改JavaJFrame设计结构,如本简单示例中所示。在一个循环中,我正在增加JPanel的de preferredWidth并使用方法pack()。但显然,pack方法被忽略了。如果我把包放在循环之外,只使用一次,那就是工作。有人知道原因和可能的解决方案吗

public class Calculadora extends JFrame {

private JPanel pnl = new JPanel();
private boolean flag;

public Calculadora() {
    JPanel pnlPrincipal = new JPanel();
    pnlPrincipal.setPreferredSize(new Dimension(300, 300));
    pnlPrincipal.setBackground(Color.BLACK);
    JButton btnAnexo = new JButton("Anexo");
    btnAnexo.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (flag) {
                closeAnexo();
                flag = false;
            } else {
                openAnexo();
                flag = true;
            }
        }
    });
    pnlPrincipal.add(btnAnexo);
    this.pnl.setBackground(Color.WHITE);
    this.pnl.setPreferredSize(new Dimension(0, 300));
    this.add(pnl, BorderLayout.EAST);
    this.add(pnlPrincipal, BorderLayout.CENTER);
    this.pack();
    this.setVisible(true);
}

private void openAnexo() {
    new Thread () {
        @Override
        public void run() {
            for (int i = pnl.getWidth(); i <= 200; i++) {
                pnl.setPreferredSize(new Dimension(i, 300));
                pack();
            }
        }
    }.start();
}

private void closeAnexo() {
    new Thread () {
        @Override
        public void run() {
            for (int i = pnl.getWidth(); i >= 0; i--) {
                pnl.setPreferredSize(new Dimension(i, 300));
                pack();
            }
        }
    }.start();
}

public static void main(String[] args) {
    new Calculadora();
}
}
公共类Calculadora扩展JFrame{
private JPanel pnl=new JPanel();
私有布尔标志;
公共Calculadora(){
JPanel pnlPrincipal=新的JPanel();
pnlPrincipal.setPreferredSize(新尺寸(300300));
PNL主立根(颜色:黑色);
JButton btnAnexo=新JButton(“Anexo”);
addActionListener(新的ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
国际单项体育联合会(旗){
closeAnexo();
flag=false;
}否则{
openAnexo();
flag=true;
}
}
});
pnlPrincipal.add(btnAnexo);
此.pnl.backbackground(颜色:白色);
此.pnl.setPreferredSize(新维度(0300));
添加(pnl,BorderLayout.EAST);
添加(pnlPrincipal,BorderLayout.CENTER);
这个包();
此.setVisible(true);
}
私有void openAnexo(){
新线程(){
@凌驾
公开募捐{
对于(int i=pnl.getWidth();i=0;i--){
pnl.setPreferredSize(新尺寸(i,300));
包装();
}
}
}.start();
}
公共静态void main(字符串[]args){
新加尔各拉多拉();
}
}

在这种情况下,您应该使用适当的:

JPanel pnlPrincipal = new JPanel();
pnlPrincipal.setLayout(new BorderLayout());

// or

JPanel pnlPrincipal = new JPanel(new BorderLayout());

在这种情况下,您应使用适当的:

JPanel pnlPrincipal = new JPanel();
pnlPrincipal.setLayout(new BorderLayout());

// or

JPanel pnlPrincipal = new JPanel(new BorderLayout());

在这种情况下,您应使用适当的:

JPanel pnlPrincipal = new JPanel();
pnlPrincipal.setLayout(new BorderLayout());

// or

JPanel pnlPrincipal = new JPanel(new BorderLayout());

在这种情况下,您应使用适当的:

JPanel pnlPrincipal = new JPanel();
pnlPrincipal.setLayout(new BorderLayout());

// or

JPanel pnlPrincipal = new JPanel(new BorderLayout());
在这里:

请参阅教程以获得更好的解释

我不知道你想用这个实现什么,但要注意:(是的,我们应该这样做)。

这里:

请参阅教程以获得更好的解释

我不知道你想用这个实现什么,但要注意:(是的,我们应该这样做)。

这里:

请参阅教程以获得更好的解释

我不知道你想用这个实现什么,但要注意:(是的,我们应该这样做)。

这里:

请参阅教程以获得更好的解释


我不知道你想用这个实现什么,但要注意:(是的,我们应该这样做)。

问题仍然存在。因为我在JFrame中添加了第二个JPanel,而不是在这个JPanel中。所以布局没有什么区别,问题依然存在。因为我在JFrame中添加了第二个JPanel,而不是在这个JPanel中。所以布局没有什么区别,问题依然存在。因为我在JFrame中添加了第二个JPanel,而不是在这个JPanel中。所以布局没有什么区别,问题依然存在。因为我在JFrame中添加了第二个JPanel,而不是在这个JPanel中。所以布局没有区别。