簡體   English   中英

更新JTable數據后如何更新JTable顯示?

[英]How do I update the JTable display when I have updated the JTable data?

我創建了一個帶復選框和按鈕的Default JTable。 我試圖能夠在另一個窗口關閉時更新/刷新表,但無法實現此操作(因為該窗口保持靜態)。 JFrame和JTable的構造函數如下:

public MedDetailsTable() {

    super("Medication Details");                                 // Container title
    setSize(1000, 350);                                              // Container size
    Container contentPane = getContentPane();                       // Used to determine layout of components

    lbl1.setText("Medication Owner: " + MedicationManager.medsowner);
    MedicationManager.meds1.deleteTableArray();                       // Remove any previous elements from array
    int medsno = MedicationManager.meds1.getMedsNumber();             // Retrieve number of medications in medications array
    MedicationManager.meds1.addArrayOutputs(medsno);                  // Create table output array
    int arraysize = MedicationManager.meds1.getTableNumber();         // Table output array size

    Object[][] rowData = new Object[medsno][9];                        // print array in rectangular form 8 columns wide with rows = meds number        
    for (r = 0; r < rowData.length; r++) {

    rowData[r][0] = MedicationManager.meds1.getTableArray((r * 6));             // Med details are retrieved from TableArray  
    rowData[r][1] = MedicationManager.meds1.getTableArray((r * 6) + 1);         // * by no of columns, plus offset for initial column
    rowData[r][2] = MedicationManager.meds1.getTableArray((r * 6) + 2);
    rowData[r][3] = MedicationManager.meds1.getTableArray((r * 6) + 3);
    rowData[r][4] = MedicationManager.meds1.getTableArray((r * 6) + 4);
    rowData[r][5] = MedicationManager.meds1.getTableArray((r * 6) + 5);
    rowData[r][6] = MedicationManager.meds1.getCheckbox(r);                    // Data for checkbox which will initialise as empty = false
    final JButton button = new JButton("Meds Info");
         button.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent arg0) {                     // If button pressed
    int selectedRowIndex = MedicationManager.listTable.getSelectedRow();       // Get column 0 row x selected text
    String selectedObject = (String) MedicationManager.listTable.getModel().getValueAt(selectedRowIndex, 0);
             InternetSearch IS = new InternetSearch(selectedObject);                    // Internet search with drug name
                        }
                    });
         rowData[r][7] = button;                                                // Med details button added
    }

    MedicationManager.listTableModel = new DefaultTableModel(rowData, columnNames) {

        @Override
        public Class<?> getColumnClass(int columnIndex) // get columnClass overridden so boolean column class is returned to produce Checkbox
        {
            return columnClass[columnIndex];
        }
    };


    MedicationManager.listTable = new JTable(MedicationManager.listTableModel);
   MedicationManager.listTable = new JTable(new JTableModel()); 

    // Assign table model
    MedicationManager.listTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);                // Set up column widths
    MedicationManager.listTable.getColumnModel().getColumn(0).setPreferredWidth(180);
    MedicationManager.listTable.getColumnModel().getColumn(1).setPreferredWidth(100);
    MedicationManager.listTable.getColumnModel().getColumn(2).setPreferredWidth(100);
    MedicationManager.listTable.getColumnModel().getColumn(3).setPreferredWidth(150);
    MedicationManager.listTable.getColumnModel().getColumn(4).setPreferredWidth(110);
    MedicationManager.listTable.getColumnModel().getColumn(5).setPreferredWidth(100);
    MedicationManager.listTable.getColumnModel().getColumn(6).setPreferredWidth(50);
    MedicationManager.listTable.getColumnModel().getColumn(7).setPreferredWidth(100);
    MedicationManager.listTable.getColumnModel().getColumn(8).setPreferredWidth(100);
    JScrollPane pane2 = new JScrollPane(MedicationManager.listTable);

    pane2.setPreferredSize(new Dimension(930, 200));

    setDefaultCloseOperation(DISPOSE_ON_CLOSE);                        // Disposes on closing window

    pane2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

    pnl2.add(lbl1);
    Dimension d = new Dimension(70, 30);                                 // Set dimensions for buttons 
    add.setPreferredSize(d);
    chartb.setPreferredSize(d);
    edit.setPreferredSize(d);
    delete.setPreferredSize(d);
    b1.setPreferredSize(d);
    pnl.add(add);
    pnl.add(edit);
    pnl.add(delete);
    pnl.add(chartb);
    pnl.add(b1);
    pnl3.add(pane2);

    add(pnl2);
    add(pnl);
    add(pnl3);

    contentPane.add("North", pnl2);                                  // Set text fields at top
    contentPane.add("South", pnl);                                 // Set "OK" and "Cancel" at bottom 
    contentPane.add("Center", pnl3);

    add.addActionListener(this);
    chartb.addActionListener(this);
    edit.addActionListener(this);
    delete.addActionListener(this);
    b1.addActionListener(this);

    MedicationManager.listTable.getModel().addTableModelListener(this);

    DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();       // Set data to center of columns
    centerRenderer.setHorizontalAlignment(SwingConstants.CENTER);

    for (int n = 0; n < 6; n++) {                                                   // Renderer does not extend to column 7 so checkbox used instead
        MedicationManager.listTable.getColumnModel().getColumn(n).setCellRenderer(centerRenderer);
    }

    TableCellRenderer buttonRenderer = new JTableButtonRenderer();
    MedicationManager.listTable.getColumn("Information").setCellRenderer(buttonRenderer);
MedicationManager.listTable.addMouseListener(new JTableButtonMouseListener(MedicationManager.listTable));

    setLocationRelativeTo(null);                                    // Centre window in screen
    setVisible(true);                                               // Make JPanel visibleclass ButtonListener implements ActionListener {  

}

我一直使用的更新數據的方法如下。 首先刪除行數據,然后將其重新填充到用於填充JTable的數組中。 但是我目前無法刷新數據顯示。 這使用.repaint().fireTableDataChanged()

public void addData(){

    MedicationManager.listTableModel = (DefaultTableModel)   MedicationManager.listTable.getModel();

    MedicationManager.listTableModel.setRowCount(0);

    int medsno = MedicationManager.meds1.getMedsNumber();             // Retrieve number of medications in medications array
    MedicationManager.meds1.addArrayOutputs(medsno);                  // Create table output array
    int arraysize = MedicationManager.meds1.getTableNumber();         // Table output array size

    Object[][] rowData = new Object[medsno][9];                        // print array in rectangular form 8 columns wide with rows = meds number        
    for (r = 0; r < rowData.length; r++) {                            
        rowData[r][0] = MedicationManager.meds1.getTableArray((r * 6));             // Med details are retrieved from TableArray  
        rowData[r][1] = MedicationManager.meds1.getTableArray((r * 6) + 1);         // * by no of columns, plus offset for initial column
        rowData[r][2] = MedicationManager.meds1.getTableArray((r * 6) + 2);
        rowData[r][3] = MedicationManager.meds1.getTableArray((r * 6) + 3);
        rowData[r][4] = MedicationManager.meds1.getTableArray((r * 6) + 4);
        rowData[r][5] = MedicationManager.meds1.getTableArray((r * 6) + 5);
        rowData[r][6] = MedicationManager.meds1.getCheckbox(r);
        final JButton button = new JButton("Meds Info");
         button.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent arg0) {                     // If button pressed
             int selectedRowIndex = MedicationManager.listTable.getSelectedRow();       // Get column 0 row x selected text
            String selectedObject = (String) MedicationManager.listTable.getModel().getValueAt(selectedRowIndex, 0);
             InternetSearch IS = new InternetSearch(selectedObject);                    // Internet search with drug name
                        }
                    });
         rowData[r][7] = button;                                                // Med details button added

        MedicationManager.listTableModel.addRow(rowData);
    } 

      MedicationManager.listTable.setModel(MedicationManager.listTableModel);

    MedicationManager.listTableModel.fireTableDataChanged();
    this.repaint();

}
MedicationManager.listTableModel.addRow(rowData);

addRow(...)方法用於將單行數據添加到TableModel。 “ rowData”變量是一個二維數組。 您不應該使用2D陣列。

相反,您需要在for循環內創建一個一維數組。 然后將數據添加到數組。 然后,將數組添加到TableModel。

就像是:

DefaultTableModel listTableModel = (DefaultTableModel)MedicationManager.listTable.getModel();
listTableModel.setRowCount(0);

for (every row)
{
    Object[] row = new Object[8];
    row[0] = ...
    row[1] = ...
    listTableModel.addRow( row );
}

因此,要刷新現有JTable中的數據,您需要的是對原始表的引用:

  1. MedicationManager引用該表。
  2. 您訪問表的TableModel。
  3. 您從TableModel中刪除數據
  4. 在循環的每次迭代中,將一行數據添加回TableModel中

當您將行添加到TableModel時,模型將通知表更改,並且表將重新繪制自身。

另外,您不能僅將JButton添加到TableModel。 一個JTable只使用渲染器,到實際的按鈕未顯示在表中。 您需要為按鈕創建自定義渲染器和編輯器。 請查看“ 表格按鈕列”中的解決方案。

由於您使用的是DefaultTableModel,因此我只能給出以下答案:

您應該使用新值重新創建模型並將其設置為JTable。

提示:請勿使用DEFAULTTABLEMODEL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM