代码之家  ›  专栏  ›  技术社区  ›  QA_Col

从jframe外部更改和更新jpanel组件不工作,swing

  •  0
  • QA_Col  · 技术社区  · 5 年前

    我正在使用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发的吗( 查看内部呼叫 工作!,但来自JFrame( 查看//外部呼叫 不管用!

    回顾这个问题 Update content of JPanel on a frame on button click in another frame 提出的 revalidate(); repaint(); 我使用的代码,但不起作用。

    如何解决这个问题?

    1 回复  |  直到 5 年前
        1
  •  0
  •   camickr    5 年前
    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对象没有任何意义。将一个对象添加到选项卡式窗格中,然后返回第二个mypanel对象。

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

    我真的不知道你想做什么。我不知道您是想在框架中添加一个面板,还是在选项卡式窗格中添加一个面板,所以我不能给出具体的建议。

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