Изменение и обновление компонентов JPanel извне, из JFrame не работает, Swing - PullRequest
0 голосов
/ 11 февраля 2019

Я работал с JPanel (изменяя его компонент), но я хочу изменить его на External 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 ( обзор INNER CALL ) работает !, но из JFrame ( review // OUTER CALL) не работает!

Просмотр этого вопроса Обновление содержимого JPanel в кадре при нажатии кнопки в другом кадре Предлагаемый код revalidate(); repaint();, который я использовал, но не работает.

Как это решить?

1 Ответ

0 голосов
/ 14 февраля 2019
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, и вам необходимо добавить эту панель либо на панель с вкладками, либо на фрейм, но не на оба.

...