3

ページングを設定しましたJTable- これは非常にうまく機能しますが、テーブルへのデータの更新に問題があります。table.repaint() が機能していません。これが私が使用しているコードです。前もって感謝します!

String[][] data = new String[100][4];

 String[] columnNames = new String[]{
         "IP", "PC_NAME", "ttl", "db"};

コンストラクタ:

gui(){
    JTable table =  new JTable(data, columnNames);
    JScrollPane scrollPane = new JScrollPane(table);
    JButton next = new JButton("next");
    JButton prev = new JButton("prev");
    next.addActionListener(this);
    prev.addActionListener(this);
    JPanel panel = new JPanel(new BorderLayout());
    JPanel buttonPanel = new JPanel();
    buttonPanel.add(prev);
    buttonPanel.add(next);
    panel.add(buttonPanel, BorderLayout.SOUTH);
    panel.add(table.getTableHeader(), BorderLayout.PAGE_START);
    panel.add(scrollPane, BorderLayout.CENTER);
    getContentPane().add(panel);}

アクションリスナー:

public void actionPerformed(ActionEvent e) {
 if (e.getActionCommand() == "next") {
     Rectangle rect = scrollPane.getVisibleRect();
     JScrollBar  bar = scrollPane.getVerticalScrollBar();
     int blockIncr = scrollPane.getViewport().getViewRect().height;
     bar.setValue(bar.getValue() + blockIncr);
     scrollPane.scrollRectToVisible(rect);
 }
 if (e.getActionCommand() == "prev") {
     Rectangle rect = scrollPane.getVisibleRect();
     JScrollBar  bar = scrollPane.getVerticalScrollBar();
     int blockIncr = scrollPane.getViewport().getViewRect().height;
     bar.setValue(bar.getValue() - blockIncr);
     scrollPane.scrollRectToVisible(rect);
 }}

データを配列に格納する関数は次のとおりです。

int i=0;
public void WriteMonitorData (String IP, String PC_NAME, String ttl, String gw)
{
    data[i][0]=IP;
    data[i][1]=PC_NAME;
    data[i][2]=ttl;
    data[i][3]=gw;
    i++;
    table.repaint();
    scrollPane.repaint();

}

編集1:

DefaultTableModel を試してみましたが、まだ運がありません。テーブルの更新に使用したコードは次のとおりです。コンストラクター コードは変更されていません。宣言:

private static final long serialVersionUID = 1L;
 String[][] data = new String[100][4];

 String[] columnNames = new String[]{
         "IP", "PC_NAME", "ttl", "db"};



            DefaultTableModel model = new DefaultTableModel(data,columnNames);
    JTable table =  new JTable(model);
    JScrollPane scrollPane = new JScrollPane(table);

テーブルを更新した関数は次のとおりです。

 public void WriteMonitorData (String IP, String PC_NAME, String ttl, String gw)
{

    System.out.println(IP);
    model.setValueAt(IP, i, 0);
    model.setValueAt(PC_NAME, i, 1);
    model.setValueAt(ttl, i, 2);
    model.setValueAt(gw, i, 3);
    i++;
    model.fireTableDataChanged();
    table.repaint();
    scrollPane.repaint();

}
4

1 に答える 1

3

あなたの問題は、文字列を と比較すること==です。equals(...)代わりにメソッドを使用してください。

  • ==2 つの変数が同じオブジェクトを参照しているかどうかを比較します。気にする必要はありません。したがって、2 つの String 変数は同じ単語を保持できますが、この操作では等しいとは見なされません。
  • equals(...)orequalsIgnoreCase(...)メソッドは、2 つの String 変数が同じ文字を同じ順序で保持しているかどうかをチェックします

そうではありません:

if (e.getActionCommand() == "next") {
  //  ...
}

むしろ:

if ("next".equals(e.getActionCommand())) {
  //  ...
}

または、大文字と小文字を気にしない場合:

if ("next".equalsIgnoreCase(e.getActionCommand())) {
  //  ...
}

編集 1
次に、JTable がデータを保持すると、データを変更しても JTable には影響しない可能性があります。したがって、ここでデータ配列を変更します。

int i=0;
public void WriteMonitorData (String IP, String PC_NAME, String ttl, String gw)
{
    data[i][0]=IP;
    data[i][1]=PC_NAME;
    data[i][2]=ttl;
    data[i][3]=gw;
    i++;
    table.repaint();
    scrollPane.repaint();

}

しかし、この配列はすでに JTable に渡されており、現在はそのモデルの一部であり、Vector に変更されている可能性があります。

JTable のデータ表現の変更を確認するには、テーブルのモデルが保持するデータを変更する必要があります。DefaultTableModel を使用してデータを JTable に保持し、上記の方法 (小文字で始まる必要があります) で、モデルが保持するデータを変更することをお勧めします。

また、ifブロックが機能するかどうかに関係なく、==文字列を比較するために使用しないでください。

于 2012-09-27T22:25:37.850 に答える