【发布时间】:2016-01-28 13:39:13
【问题描述】:
我有一部分视图显示JOptionPane 中的文本字段。还有一个“其他”按钮。单击它后,我需要JOptionPane 重新绘制自身并显示一些隐藏的文本字段。
我将 GridLayout 用于我的文本字段。我在按钮侦听器中尝试了revalidate() 和repaint() 方法,但它们没有任何改变。
validate() 方法有效,但所有组件的大小太小。在网格面板中调整大小似乎错误。在我的原始代码中,一些组件只是隐藏起来。我没有setPrefferedSize() 或getPrefferedSize() 因为我读错了,但不知道如何正确调整大小。
我把我的代码做的很简单,只是视图的一部分。
public class AddView {
private JFrame parentFrame;
private JPanel addPanel;
private JPanel gd;
private JLabel nameLabel;
private JLabel surName;
private JLabel skype;
private JTextField nameTField;
private JTextField surNameTField;
private JTextField skypeTField;
private JButton otherButton;
public AddView(JFrame parent) {
this.parentFrame = parent;
initComponents();
}
private void initComponents() {
addPanel = new JPanel(new BorderLayout());
gd = new JPanel(new GridLayout(2, 2, 0, 5));
nameLabel = new JLabel("Name");
surName = new JLabel("Surname");
skype = new JLabel("Skype");
nameTField = new JTextField();
surNameTField = new JTextField();
skypeTField = new JTextField();
otherButton = new JButton("Other");
gd.add(nameLabel);
gd.add(nameTField);
gd.add(surName);
gd.add(surNameTField);
addPanel.add(gd, BorderLayout.CENTER);
addPanel.add(otherButton, BorderLayout.SOUTH);
otherButton.addActionListener(new OtherFieldsAction());
}
public int showAddPane() {
return JOptionPane.showConfirmDialog(parentFrame, addPanel, "Add Contact", JOptionPane.OK_CANCEL_OPTION);
}
private class OtherFieldsAction implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
gd.setLayout(new GridLayout(3, 2, 0, 5));
gd.add(skype);
gd.add(skypeTField);
// gd.revalidate(); not work
// gd.repaint();
gd.validate();
}
}
}
这是 JOptionPane
当我点击“其他”按钮时,我得到了这个结果
但我需要像这样调整大小来获得它
您能否就如何正确重绘提出建议。
【问题讨论】:
-
在这种情况下,最好禁用组件直到它们相关为止。
-
@Andrew Thompson 你的意思是使用
JComponent.disable()?不确定我是否理解正确。 -
“你的意思是使用
JComponent.disable()?”好吧,鉴于该方法自Java 1.1以来已被弃用,不。试试setEnabled(boolean).. -
@Andrew Thompson 但是组件将是可见的。在用户单击按钮之前,我需要隐藏它们。
-
然后将它们放在
CardLayout中,另一张卡片是空白面板。但不要尝试调整容器的大小 - 这会让用户感到困惑。
标签: java swing joptionpane repaint invalidation