在窗格仍在运行的情况下更改发送到JOptionPane的JPanel的布局

时间:2013-11-29 18:51:54

标签: java swing joptionpane

尝试在打开时更改JOptionPane的外观,具体取决于用户单击的单选按钮。我究竟做错了什么?如果我例如添加一个按钮并将JLabel从窗口的一侧移动到另一侧,那么它的工作非常完美。

import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
import static javax.swing.JOptionPane.*;

public class ChangePanel extends JFrame{

private JButton click = new JButton("CLICK ME!");

ChangePanel(){
    add(click, BorderLayout.SOUTH);
    click.addActionListener(new ButtonListen());

    setVisible(true);
    setSize(300,100);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
}

public class ButtonListen implements ActionListener{
    public void actionPerformed(ActionEvent e){

        PopUpPanel pop = new PopUpPanel();
        showConfirmDialog(ChangePanel.this, pop, "Changeable", OK_CANCEL_OPTION);           
    }
}
//Send this as Parameter to the ConfirmDialog
public class PopUpPanel extends JPanel implements ActionListener{
    JRadioButton jewelry = new JRadioButton("Jewelry");
    JRadioButton shares = new JRadioButton("Shares");
    JRadioButton machine = new JRadioButton("Machine");

    PopUpPanel(){

        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        ButtonGroup bg = new ButtonGroup();
        JPanel north = new JPanel();
        bg.add(jewelry);
        jewelry.addActionListener(this);
        bg.add(shares);
        shares.addActionListener(this);
        bg.add(machine);
        machine.addActionListener(this);
        north.add(jewelry);
        north.add(shares);
        north.add(machine);
        add(north); 
    }
    //Listener for RadioButtons
    public void actionPerformed(ActionEvent e){
        JTextField info1Txt = new JTextField(12);
        JTextField info2Txt = new JTextField(12);
        JTextField info3Txt = new JTextField(3);;

        JRadioButton b = (JRadioButton)e.getSource();

        if(b.getText().equals("Jewelry")){
            //Dummy test text
            System.out.println("Jewelry");

            JPanel info1 = new JPanel();
            info1.add(new JLabel("info1:"));
            info1.add(info1Txt);
            add(info1);

            JPanel info2 = new JPanel();
            info2.add(new JLabel("info2:"));
            info2.add(info2Txt);
            add(info2);

            JPanel info3 = new JPanel();
            info3.add(new JLabel("info3:"));
            info3.add(info3Txt);
            add(info3);

            validate();
            repaint();

        }else if(b.getText().equals("Shares")){
            //Dummy test text
            System.out.println("Shares");
        }else
            //Dummy test text
            System.out.println("Machine");
    }   
}
public static void main(String[] args){
    new ChangePanel();
}

}

3 个答案:

答案 0 :(得分:1)

当您使用BoxLayout时,您应该向PopUpPanel面板提供尺寸提示,但您尚未给出。

BoxLayout从上到下布置组件时,它会尝试在组件的首选高度处调整每个组件的大小。如果布局的垂直空间与首选高度的总和不匹配,则BoxLayout会尝试调整组件的大小以填充空间。组件增长或缩小以填充空间,BoxLayout表示每个组件的最小和最大尺寸。

查看官方教程页面讨论:BoxLayout Feature

答案 1 :(得分:0)

在删除或添加组件后,在容器上调用revalidate()repaint()。因此,如果您更改以下行:

validate();
repaint();

到:

revalidate();
repaint();

内容应该出现。但是,它不符合JOptionPane的原始大小。您可以覆盖PopUpPanel.getPreferredSize()以返回所需的大小,以便正确打包JOptionPane,即:

@Override
public Dimension getPreferredSize() {
    return new Dimension(300, 300);
}

您也可以使用JDialog代替JOptionPane

另外,请考虑使用CardLayout而不是手动交换组件。查看How to Use CardLayout以获取示例。

答案 2 :(得分:0)

为什么不在PopUpPanel构造函数中使用 setPreferredSize(new Dimension(300,300))?对我来说很好。善于重新验证并重新粉刷。