简体   繁体   English

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

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

I was working with JPanel (Changing its component), but I want to change it from External JFrame.我正在使用 JPanel(更改其组件),但我想从外部 JFrame 更改它。

Sorry, I make this code with Netbeans (I know it put some stuff not needed for this question) and try to clean editing it, because the real code it is more large对不起,我用 Netbeans 制作了这段代码(我知道它在这个问题上放了一些不需要的东西)并尝试清理编辑它,因为它的真实代码更大

Here the code of the JPanel, with name 'MyPanel'.这是 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();
      }
    }

The Frame!!!框架!!!

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);
    });
  }
}

When the callFilling();callFilling(); is do it from JPanel ( review INNER CALL ) works!, but from JFrame ( review //OUTER CALL ) doesn't work!是从 JPanel(审查 INNER CALL )做的!但是从 JFrame(审查 //OUTER CALL )不起作用!

Reviewing this question Update content of JPanel on a frame on button click in another frame The proposed revalidate(); repaint();审查这个问题在另一个框架中单击按钮时更新框架上 JPanel 的内容建议revalidate(); repaint(); revalidate(); repaint(); code I used, but is not working.我使用的代码,但不起作用。

How solve this?这个怎么解决?

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

Not sure what you are trying to do.不确定你要做什么。

You create a MyPanel object and invoke callFilling() on it to set the values in the TableModel.您创建一个 MyPanel 对象并对其调用 callFilling() 以设置 TableModel 中的值。 But you never actually add the panel to the frame.但是您实际上从未将面板添加到框架中。

You only need to invoke revalidate() and repaint() when you add components to a visible panel.您只需要在将组件添加到可见面板时调用 revalidate() 和 repaint()。

Then you invoke addNewTab() which does:然后调用addNewTab()执行以下操作:

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

Again, this doesn't make any sense you create 2 MyPanel objects.同样,这对您创建 2 个 MyPanel 对象没有任何意义。 You add one object to a tabbed pane, but then you return the second MyPanel object.您将一个对象添加到选项卡式窗格,但随后您返回了第二个 MyPanel 对象。

So you have created 3 MyPanel objects.所以你已经创建了 3 个 MyPanel 对象。

I really am not sure what you are trying to do.我真的不确定你要做什么。 I don't know if you are trying to add a panel to the frame, or a panel to the tabbed pane, so I can't really make a specific suggestion.我不知道您是要向框架添加面板,还是要向选项卡式面板添加面板,因此我无法真正提出具体建议。

In any case you need to structure you code so that only on MyObject object is created and you need to add that panel to either the tabbed pane or the frame, but not both.在任何情况下,您都需要对代码进行结构化,以便仅在 MyObject 上创建对象,并且您需要将该面板添加到选项卡式窗格或框架中,但不能同时添加到两者中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM