-3

私はJavaJTableの初心者ですが、txtファイルからレコードを読み取って完全に表示できるものがあります。JFrameユーザーがテーブルの行を選択して[削除]ボタンをクリックすると、その行が削除され、削除された行レコードもtxtファイルから削除する必要があるという新しい本を追加したいと思います。私のコードはこれですが、エラーがあり、表示されませんJTable!:

public class CopyOfAllUserTable extends AbstractTableModel {
Vector data;
Vector column;
public static void main(String[] args){
    new CopyOfAllUserTable();
}
public CopyOfAllUserTable() {

        String line;
        data = new Vector();
        column = new Vector();
        try {
        FileInputStream fis = new FileInputStream("D:\\AllUserRecords.txt");
        BufferedReader br = new BufferedReader(new InputStreamReader(fis));
      StringTokenizer st1 = new StringTokenizer(br.readLine(), " ");
              while (st1.hasMoreTokens())
               column.addElement(st1.nextToken());
                while ((line = br.readLine()) != null) {
                       StringTokenizer st2 = new StringTokenizer(line, " ");
                        while (st2.hasMoreTokens())
                                data.addElement(st2.nextToken());
                }
                br.close();
        } catch (Exception e) {
                e.printStackTrace();
        }

    final JFrame frame1=new JFrame();
     JTable table=new JTable(data,column);
    JButton button1=new JButton("Delete");


    button1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
           DefaultTableModel model=new DefaultTableModel(data, column);
           JTable table=new JTable(model);

        }
    });


    JPanel panel=new JPanel();
    panel.add(table);
    panel.add(button1);
    frame1.add(panel);
    frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame1.setBounds(200, 80, 600, 500);
    frame1.setVisible(true);
    frame1.setEnabled(true);


}

public int getRowCount() {
        return data.size() / getColumnCount();
}

public int getColumnCount() {
        return column.size();
}

public Object getValueAt(int rowIndex, int columnIndex) {
        return (String) data.elementAt((rowIndex * getColumnCount())
                        + columnIndex);
}

}

私の問題は行の削除にあり、ファイルからjtableへのレコードの読み取りは完全に成功しています。

4

3 に答える 3

3

JTableまず、フレームのコンテンツに自分を追加していません。

次のようなコンテナの場合:メソッドを使用して子コンポーネントを追加する必要がframe.getContentPane()あります。JPanel#add(...)

例えば:

 final JPanel panel=new JPanel(new BorderLayout());
 button1.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
       DefaultTableModel model=new DefaultTableModel(data, column);
       JTable table=new JTable(model);
       panel.add(new JScrollPane(table));
       panel.revalidate();
    }
});

JPanelデフォルトのレイアウトは。であることに注意してくださいFlowLayout。2番目のこと-ヘッダーとスクロールJTableが必要な場合は、でラップする必要がありますJScrollPane。次へ-追加/削除などの後にパネルを再検証する必要があります。

2番目の問題は、から行を削除することJTableです。私は通常、それを処理するメソッドを作成します。

protected void removeRows(final int[] rows) {
    int modelRows[] = new int[rows.length];
    for(int i = 0; i < rows.length; ++i) {
        modelRows[i] = table.convertRowIndexToModel(rows[i]);
    }
    Arrays.sort(modelRows);
    for(int i = modelRows.length - 1; i >= 0; --i) {
        int row = modelRows[i];
        model.removeRow(row);
    }
    model.fireTableDataChanged();
}

このメソッドは、または(表示されているインデックス)によって返されるインデックスをモデルインデックスにconvertRowIndexToModel変換します。あなたがあなたのために設定した場合、またはあなたがそれを標準的な実装に任せた場合:JTable#getSelectedRows()JTable#getSelectedRow()RowSorterJTable

table.setAutoCreateRowSorter(true);
于 2012-12-27T23:09:35.667 に答える
2

を使用せずに、テーブルをパネルに直接追加していJScrollPaneます。これを行うと、テーブルヘッダーが表示されなくなります。したがって、これの代わりに、

JPanel panel=new JPanel();
    panel.add(table);

これを行う、

JPanel panel=new JPanel();
panel.add(new JScrollPane(table));

なぜ使用するのJScrollPaneですか?これを読んでください。

ユーザーが行を選択して[削除]をクリックすると、選択した行を取得してテーブルリストから削除します。使用しAbstractTableModelているので、これを実行するためのカスタムremoveRow(..)メソッドを作成する必要があります。

例:

private boolean removeSelectedRow(int row) {
    // Remove the row from the list that the table is using.
    dataList.remove(row);
    // You need to call fireXXX method to refresh the table model.
    fireTableDataChanged();
    return true;
   // If fail return false;
}

削除がアクションの場合、最初に選択された行を取得してから、次のようにremoveSelectedRow(int)を呼び出します。

private void deleteRow() {
  int selectedRow = table.getSelectedRow();
  boolean deleteStatus = removeSelectedRow(selectedRow);

  // Only if the deletion is success then delete from the file.
  if(deleteStatus) {
    // Delete it from the file too.
  }
}
于 2012-12-28T02:57:20.040 に答える
0

まず、何かが選択されていることを確認する必要があります。何かが選択されている場合は、削除ボタンを有効にします。JTablejavaソースコード@を検索してください

http://developer.classpath.org/doc/javax/swing/JTable-source.html

および次のコード:

1331: /**
1332: * Receives notification when the row selection changes and fires
1333: * appropriate property change events.
1334: *
1335: * @param event the list selection event
1336: */
1337: public void valueChanged(ListSelectionEvent event)
1338: {
1339: firePropertyChange(AccessibleContext.ACCESSIBLE_SELECTION_PROPERTY,
1340: Boolean.FALSE, Boolean.TRUE);
1341: int r = getSelectedRow();
1342: int c = getSelectedColumn();
1343: if (r != lastSelectedRow || c != lastSelectedColumn)
1344: {
1345: Accessible o = getAccessibleAt(lastSelectedRow,lastSelectedColumn);
1347: Accessible n = getAccessibleAt(r, c);
1348: firePropertyChange(AccessibleContext.ACCESSIBLE_ACTIVE_DESCENDANT_PROPERTY, o, n);
1350: lastSelectedRow = r;
1351: lastSelectedColumn = c;
1352: }
1353: }

選択した行が変更されたときに通知される最後のイベントに登録する必要があります。独自のリスナーを追加して、行が選択されているかどうかに基づいて削除ボタンを有効にします。これは、イベント自体で確認できます。

ケースの90%で機能するため、DefaultTableModelから開始するために使用してください。

また、変更はtabledatamodelに適用され、JTableビューに自動的に反映されます。通常、すべての選択情報とスクロール情報が失われるため、ビューを変更することはありません。これは望ましくないことです。

削除ボタンを押すと、アプローチは簡単です。行が選択されている場合、それ以外の場合はクリックできません。選択した行番号をdefaultTableModelから削除します。最後に、データモデルのコンテンツ全体を単純に記述します。テーブルのモデルは実際にビューに表示される実際の行を保持しているため、指定されたファイルにモデル化します。

したがって、モデルモデルとモデルの観点から考えてください。ビューは一度だけインスタンス化され、スクロールされてパックされ、そのままにしておきます。通常、モデルも変更されることはありません。行を追加または削除して、モデルの内容を変更します。もう1つのヒント:常にレンダラーを使用する:私の謙虚な意見では、JTablesの操作方法を理解していないレンダラー。

そして、はい、選択の変更をリッスンするために最初の部分を省略できます。問題を示す警告を必ずポップアップしてください。そして後の段階で、選択の変更をリッスンする機能を追加して、JButton削除行を有効または無効にします。

お役に立てれば。

于 2012-12-30T11:52:15.627 に答える