【问题标题】:Repaint components in JOptionPane在 JOptionPane 中重绘组件
【发布时间】: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


【解决方案1】:

也许Window#pack() 方法会起作用:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class AddView2 {
  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 AddView2(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();
      SwingUtilities.getWindowAncestor((Component) e.getSource()).pack();
    }
  }

  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setSize(320, 240);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
    new AddView2(f).showAddPane();
  }
}

【讨论】:

  • 非常感谢,这正是我所需要的。
【解决方案2】:

您可能需要调用添加的组件的 setPreferredSize() 以获得所需的正确尺寸。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    相关资源
    最近更新 更多