从外部更改和更新 JPanel 组件,从 JFrame 不工作,Swing

Changing and Updating JPanel Components externally, from JFrame is not Working, Swing

我正在使用 JPanel(更改其组件),但我想从外部 JFrame 更改它。

抱歉,我用 Netbeans 编写了这段代码(我知道它放了一些这个问题不需要的东西)并尝试清理编辑它,因为它的真实代码更大

这里是 JPanel 的代码,名称为 'MyPanel'。

    public class MyPanel extends javax.swing.JPanel {

      private javax.swing.JButton filling = new javax.swing.JButton();
      private javax.swing.JScrollPane jScrollPane1 = new javax.swing.JScrollPane();
      private javax.swing.JTable myTable = new javax.swing.JTable();

      private final javax.swing.table.DefaultTableModel INITIAL_TABLE_MODEL = new javax.swing.table.DefaultTableModel(
          new Object[][]{},
          new String[]{"Text", "Integer"}
      );

      public MyPanel() {
        initComponents();
        //callFilling(); // INNER CALL!
      }

      private void initComponents() {
        filling.setText("filling");
        filling.addActionListener(new java.awt.event.ActionListener() {
          public void actionPerformed(java.awt.event.ActionEvent evt) {
            fillingActionPerformed(evt);
          }
        });

        myTable.setModel(new javax.swing.table.DefaultTableModel(
          new Object [][] { },
          new String [] { "Text", "Integer" }
       ) {
          Class[] types = new Class [] {
            java.lang.String.class, java.lang.Integer.class
          };

          public Class getColumnClass(int columnIndex) {
            return types [columnIndex];
          }
        });
        jScrollPane1.setViewportView(myTable);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
          layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
          .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(filling)
            .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
          .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
          layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
          .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(filling)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE))
        );
      }                   

      public void callFilling() {
        myTable.setModel(INITIAL_TABLE_MODEL);
        INITIAL_TABLE_MODEL.setRowCount(0);
        ((javax.swing.table.DefaultTableModel) myTable.getModel()).setRowCount(0);
        Integer numberRows = new java.util.Random().nextInt((10 - 2) + 1) + 2;
        for (int i = 0; i < numberRows; i++) {
          Integer number = new java.util.Random().nextInt();
          ((javax.swing.table.DefaultTableModel) myTable.getModel()).addRow(
              new Object[]{
                number.toString(), number
              });
        }
        this.revalidate();
        this.repaint();
      }

      private void fillingActionPerformed(java.awt.event.ActionEvent evt) {                                        
        callFilling();
      }
    }

框架!!!

public class MainFrame extends javax.swing.JFrame {

  private javax.swing.JTabbedPane myTabbed = new javax.swing.JTabbedPane();

  public MainFrame() {
    initComponents();
    MyPanel myPanel = addNewTab();
    myPanel.callFilling(); //OUTER CALL!
    myPanel.revalidate();
    myPanel.repaint();
    addNewTab();
  }

  private MyPanel addNewTab() {
    int idx = myTabbed.getTabCount();
    String title = "myTabbed: " + idx + " ";
    MyPanel myPanel = new MyPanel();
    myTabbed.insertTab(title, null, new MyPanel(), null, idx);
    return myPanel;
  }

  private void initComponents() {
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addGroup(layout.createSequentialGroup()
        .addComponent(myTabbed, javax.swing.GroupLayout.DEFAULT_SIZE, 394, Short.MAX_VALUE)
        .addContainerGap())
    );
    layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addGroup(layout.createSequentialGroup()
        .addContainerGap()
        .addComponent(myTabbed, javax.swing.GroupLayout.DEFAULT_SIZE, 288, Short.MAX_VALUE)
        .addContainerGap())
    );

    pack();
  }

  public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(() -> {
      new MainFrame().setVisible(true);
    });
  }
}

callFilling(); 从 JPanel 执行时(review INNER CALL)有效!,但是从 JFrame(review //OUTER CALL) 不起作用!

正在审阅此问题Update content of JPanel on a frame on button click in another frame 我使用了建议的 revalidate(); repaint(); 代码,但没有用。

如何解决这个问题?

MyPanel myPanel = addNewTab();
myPanel.callFilling(); //OUTER CALL!
myPanel.revalidate();
myPanel.repaint();
addNewTab();

不确定您要做什么。

您创建一个 MyPanel 对象并对其调用 callFilling() 以设置 TableModel 中的值。但是您实际上从未将面板添加到框架中。

您只需要在将组件添加到可见面板时调用revalidate() 和repaint() 即可。

然后您调用 addNewTab() 执行以下操作:

MyPanel myPanel = new MyPanel();
myTabbed.insertTab(title, null, new MyPanel(), null, idx);
return myPanel;

同样,创建 2 个 MyPanel 对象没有任何意义。您将一个对象添加到选项卡式窗格,然后 return 第二个 MyPanel 对象。

所以您已经创建了 3 个 MyPanel 对象。

我真的不确定你想做什么。我不知道你是想在框架中添加面板,还是在选项卡式窗格中添加面板,所以我真的无法提出具体建议。

在任何情况下,您都需要构建代码,以便仅创建 MyObject 对象,并且您需要将该面板添加到选项卡式窗格或框架,但不能同时添加到两者。