2017-11-11 1 views
0

JFrame에 2 차원 배열 테이블을 새로 고치려면 ActionListener을 사용하고 싶습니다. 여기 내 프로그램에서 일부 코드입니다 :JFrame에서 ActionListener로 JTable을 새로 고치려면 어떻게해야합니까?

public Students(){ 
    ..... 
    removeall = new JMenuItem("Remove All Students"); 
    removeall.addActionListener(this); 
    ..... 
} 
public void actionPerformed(ActionEvent e) { 

    if(e.getSource().equals(removeall)) { 
     removeAll(); 
     table.repaint(); 
} 

public void removeAll() { 

    for(int i=name1.size()-1;i>=0;i--) 
    { 
     lastname1.remove(i); 
     id1.remove(i); 
     quiz11.remove(i); 
     quiz21.remove(i); 
     midterm1.remove(i); 
     project1.remove(i); 
     final1.remove(i); 
     lettergrade1.remove(i); 
     average1.remove(i); 
     name1.remove(i); 
     tablemodel.removeRow(i); 
    } 
    JOptionPane.showMessageDialog(this,"All students are removed. "); 
} 

보시다시피, 나는 repaint()tableModel.fireTableDataChanged()을 시도하고 모두 작동하지 않았다. 테이블을 새로 고치려면 어떻게해야합니까?

그것은 새로 고침하지 않습니다 : 그리고 여기 사진이

It doesn't refresh

+0

가 편집 내용을 참조하시기 바랍니다 swer. 다시 말하지만,이 질문에 답하지 않으면 직접 [mcve]를 게시하십시오. –

+0

'table.repaint()'를'table.fireTableDataChanged() '로 대체하십시오. –

답변

1

컴파일하고 실행하는 우리에게 유효한 MCVE 게시하지 않았기 때문에 귀하의 질문에 정확하게 대답하는 것은 불가능하지만, 실제 모델 자체를 변경하지 않고 JTable의 모델을 초기화하는 데 사용 된 콜렉션의 상태를 변경하려고하는 것처럼 보입니다.

그렇다면 JTable에서 모든 데이터를 제거하려면 모든 행을 제거하십시오. DefaultTableModel을 사용하는 경우 모델에서 .setRowCount(0)을 호출하기 만하면됩니다.

모델을 변경하면 다시 칠하기 때문에이 상황에서는 repaint()을 호출 할 필요가 없습니다. 또한 모델에서 fireTableDataChanged()을 호출하려고 시도하지 않아야합니다. 이러한 유형의 호출은 모델 자체만으로 내부적으로 호출되어야하기 때문입니다. 예를 들어

, 내 MCVE :

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import java.util.Random; 
import javax.swing.*; 
import javax.swing.table.*; 

public class TableExample { 
    private static void createAndShowGui() { 
     TablePanel tablePanel = new TablePanel(); 
     JMenuItem fillTableItem = new JMenuItem(new FillTableAction(tablePanel)); 
     JMenuItem clearTableItem = new JMenuItem(new ClearTableAction(tablePanel)); 

     JMenu tableMenu = new JMenu("Table Actions"); 
     tableMenu.setMnemonic(KeyEvent.VK_T); 
     tableMenu.add(fillTableItem); 
     tableMenu.add(clearTableItem); 
     JMenuBar menuBar = new JMenuBar(); 
     menuBar.add(tableMenu); 

     JFrame frame = new JFrame("TableExample"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(tablePanel); 
     frame.setJMenuBar(menuBar); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 

@SuppressWarnings("serial") 
class FillTableAction extends AbstractAction { 
    private TablePanel tablePanel; 

    public FillTableAction(TablePanel tablePanel) { 
     super("Fill Table"); 
     putValue(MNEMONIC_KEY, KeyEvent.VK_F); 
     this.tablePanel = tablePanel; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     tablePanel.fillTable(); 
    } 
} 

@SuppressWarnings("serial") 
class ClearTableAction extends AbstractAction { 
    private TablePanel tablePanel; 

    public ClearTableAction(TablePanel tablePanel) { 
     super("Clear Table"); 
     putValue(MNEMONIC_KEY, KeyEvent.VK_C); 
     this.tablePanel = tablePanel; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     tablePanel.clearTable(); 
    } 
} 

@SuppressWarnings("serial") 
class TablePanel extends JPanel { 
    private static final String[] COL_NAMES = { "Name", "Surname", "ID" }; 
    private DefaultTableModel model = new DefaultTableModel(COL_NAMES, 0); 
    private JTable table = new JTable(model); 
    private Random random = new Random(); 

    public TablePanel() { 
     setLayout(new BorderLayout()); 
     add(new JScrollPane(table)); 
    } 

    public void clearTable() { 
     model.setRowCount(0); 
    } 

    // fill it with random text and data 
    public void fillTable() { 
     int rows = random.nextInt(50) + 40; 
     for (int i = 0; i < rows; i++) { 
      StringBuilder sb = new StringBuilder(); 
      char c = (char) ('A' + random.nextInt(26)); 
      sb.append(c); 
      for (int j = 0; j < 4 + random.nextInt(3); j++) { 
       sb.append((char) ('a' + random.nextInt(26))); 
      } 
      String name = sb.toString(); 

      sb.delete(0, sb.length()); 
      sb.append((char) ('A' + random.nextInt(26))); 
      for (int j = 0; j < 6 + random.nextInt(4); j++) { 
       sb.append((char) ('a' + random.nextInt(26))); 
      } 
      String surName = sb.toString(); 

      int id = random.nextInt(Integer.MAX_VALUE/2); 

      Object[] rowData = { name, surName, id }; 
      model.addRow(rowData); 
     } 
    } 
} 
+0

그러나이 답변으로 질문에 답변이 없으면 [mcve] (MCVE)를 작성하여 게시하십시오. –

+0

도움 주셔서 감사합니다. 문제를 tablemodel.removeRow (i)로 해결했습니다. for 루프의 끝에있는 코드. –

관련 문제