尝试在打开时更改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();
}
}
答案 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))?对我来说很好。善于重新验证并重新粉刷。