Java 在循环中使用JFrame.pack()
我想逐步修改JavaJFrame设计结构,如本简单示例中所示。在一个循环中,我正在增加JPanel的de preferredWidth并使用方法pack()。但显然,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
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中。所以布局没有区别。