【问题标题】:Can't refresh JPanel while clicking button单击按钮时无法刷新JPanel
【发布时间】:2011-12-04 19:22:01
【问题描述】:

我是 java swing 新手,刷新面板时遇到问题。 你能告诉我为什么点击按钮后,JTextField 没有显示在主面板中吗? 在此先感谢:)

private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {                                      

    javax.swing.JTextField t = new javax.swing.JTextField("Hello");  
    mainPanel.add(t);      
    mainPanel.validate();
} 

【问题讨论】:

  • 你试过repaint()吗?还有你用的是什么布局?
  • validate之前尝试invalidatemainPanel
  • 发布您的SSCCE 来证明问题。
  • 也许在 'repaint()' 之后使用 'revalidate()' 对你有帮助。

标签: java swing jpanel


【解决方案1】:

您是否尝试过调用 revalidate() 而不是 validate()?

【讨论】:

    【解决方案2】:

    这是我愚蠢的@ss 猜测:您正在使用 NetBeans 构建您的 GUI,并且应该接受新 JTextField 的容器 mainPanel 使用 NetBeans 的 GroupLayout,它很难容纳组件即时添加。如果是这样,让 mainPanel 使用更用户友好的布局,或者嵌套容器,每个容器都使用自己的简单布局,以实现复杂的 GUI。

    您需要在此处阅读有关如何使用这些布局管理器的信息:Laying out Components in a Container

    您还需要在这个问题和下一个问题中提供足够的信息,这样我们就不必继续制作 SWAG。

    【讨论】:

      【解决方案3】:

      你可能忘了设置mainPanel的布局?

      尝试以下方法:

      mainPanel.setLayout(new FlowLayout());
      mainPanel.add(new JTextField("Hello!"));
      mainPanel.validate();
      

      更新:

      上面的建议不够聪明。

      正如camickr 所指出的,FlowLayoutJPanel 的默认布局。

      希望下面的建议会更有帮助。

      例如,模拟情境。

      import java.awt.EventQueue;
      import java.awt.event.ActionListener;
      import javax.swing.JButton;
      import javax.swing.JFrame;
      import javax.swing.JPanel;
      import javax.swing.JTextField;
      
      public class JPanelDefaultLayoutTest extends JFrame {
          private JPanel mainPanel;
      
          public JPanelDefaultLayoutTest () {
              initComponents();
          }
      
          public static void main(String[] args) {
              EventQueue.invokeLater(new Runnable() {
                  public void run() {
                      new JPanelDefaultLayoutTest().setVisible(true);
                  }
              });
          }
      
          private void initComponents() {
              setTitle("Add hello.");
              setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
      
              mainPanel = new JPanel();        
      
              JButton button = new JButton();   
              button.setText("Button");
              button.setToolTipText("Press me.");
              button.addActionListener(new ActionListener() {
                  public void actionPerformed(java.awt.event.ActionEvent evt) {
                      JTextField hello = new JTextField("Hello!");
                      mainPanel.add(hello);
                      mainPanel.revalidate();
                  }
              });
      
              setContentPane(mainPanel);
              mainPanel.add(button);
      //        pack();
          // If you comment the next line (and uncomment the pack() method above),
          // you have to resize the frame manually,
          // to see the added hello after the button press.
              setSize(200, 75);
          }
      }
      

      结论:如果您的面板尺寸太小,您必须手动调整它的大小,才能看到添加的 JTextField 实例。

      【讨论】:

      • 您不能忘记设置布局,因为 JPanel 默认使用 FlowLayout。但是,发布者可能会尝试使用不推荐的空布局,这会导致问题。
      猜你喜欢
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      相关资源
      最近更新 更多