2017-11-11 17 views
0

JFrameの二次元配列表を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ループの最後にあるコード。 –

関連する問題