2

Deleteキーを押してJTableから行を削除する必要がありました。したがって、ユースケースは非常に単純です。ユーザーがいくつかの行を選択し、Deleteキーを押すと、行が削除されます。コードも非常に単純です:

DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
    int[] selectedRows = table.getSelectedRows();
    for (int i = selectedRows.length - 1; i > -1; i--) {
        tableModel.removeRow(selectedRows[i]);
    }

問題は、削除が完了すると、空のテキストボックスでDeleteキーを押したとき(またはキャレットが文章)。私が起こっているのは、セルのテキストコンテンツ(削除されたセルの後の最初のセル)を表示するテキストコンポーネントにさらにキープレスがディスパッチされることです。ドットの前に文字がないため、DefaultEditorKit $ DeleteNextCharAction#actionPerformedメソッドによってビープ音が鳴ります。ハックとして、リスナーのイベントを変更します。

e.setKeyCode(KeyEvent.VK_SHIFT) // see JTable#processKeyBinding

イベントはそれ以上転送されないため、ビープ音は消えますが、それは悪い解決策であり、より良い解決策があると思います。しかし、どちらがより良い解決策ですか?

4

3 に答える 3

4
  • 行を削除するためのコアが間違っています。Maxインデックスで開始する必要があります。そうでない場合は、選択されていない行を削除します。

コード例

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.table.*;

public class RemoveAddRows extends JFrame {

    private static final long serialVersionUID = 1L;
    private Object[] columnNames = {"Type", "Company", "Shares", "Price"};
    private Object[][] data = {
        {"Buy", "IBM", new Integer(1000), new Double(80.50)},
        {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)},
        {"Sell", "Apple", new Integer(3000), new Double(7.35)},
        {"Buy", "Nortel", new Integer(4000), new Double(20.00)},
        {"Buy", "IBM", new Integer(1000), new Double(80.50)},
        {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)},
        {"Sell", "Apple", new Integer(3000), new Double(7.35)},
        {"Buy", "Nortel", new Integer(4000), new Double(20.00)},
        {"Buy", "IBM", new Integer(1000), new Double(80.50)},
        {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)},
        {"Sell", "Apple", new Integer(3000), new Double(7.35)},
        {"Buy", "Nortel", new Integer(4000), new Double(20.00)}
    };
    private JTable table;
    private DefaultTableModel model;

    public RemoveAddRows() {
        model = new DefaultTableModel(data, columnNames) {

            private static final long serialVersionUID = 1L;

            @Override
            public Class getColumnClass(int column) {
                return getValueAt(0, column).getClass();
            }
        };
        table = new JTable(model);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane);
        JButton button1 = new JButton("Remove all rows");
        button1.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
                int[] selectedRows = table.getSelectedRows();
                for (int i = selectedRows.length - 1; i > -1; i--) {
                    model.removeRow(selectedRows[i]);
                }
                /*if (model.getRowCount() > 0) {
                for (int i = model.getRowCount() - 1; i > -1; i--) {
                model.removeRow(i);
                }
                }*/
                System.out.println("model.getRowCount() --->" + model.getRowCount());
            }
        });
        JButton button2 = new JButton("Add new rows");
        button2.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
                Object[] data0 = {"Buy", "IBM", new Integer(1000), new Double(80.50)};
                model.addRow(data0);
                Object[] data1 = {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)};
                model.addRow(data1);
                Object[] data2 = {"Sell", "Apple", new Integer(3000), new Double(7.35)};
                model.addRow(data2);
                Object[] data3 = {"Buy", "Nortel", new Integer(4000), new Double(20.00)};
                model.addRow(data3);
                System.out.println("model.getRowCount() --->" + model.getRowCount());
            }
        });
        JPanel southPanel = new JPanel();
        southPanel.add(button1);
        southPanel.add(button2);
        add(southPanel, BorderLayout.SOUTH);
    }

    public static void main(String[] args) {
        RemoveAddRows frame = new RemoveAddRows();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
于 2012-09-04T12:15:21.393 に答える
1

代わりにキーバインディングを使用してください...

InputMap im = table.getInputMap(JTable.WHEN_FOCUSED);
ActionMap am = table.getActionMap();

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), "DeleteRow");
am.put("DeleteRow", new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent e) {

        System.out.println("Delete row");
        int row = table.getSelectedRow();

        if (row > -1) {

            DefaultTableModel model = (DefaultTableModel) table.getModel();
            model.removeRow(row);

        }

    }
});

(テスト用にmKorbelデータを借用したため、テストではを使用していましたDefaultTableModel。使用しているモデルにキャストする必要があります)。

また、編集する場合、これはまだ発生する可能性があるため、それを確認する必要があります

于 2012-09-04T20:19:26.580 に答える
0

これはMadProgrammerのコードですが、選択した複数の行を1つずつではなく、一度に処理するように変更しました。

    // Assume table is a JTable instance
    InputMap inputMap = table.getInputMap(JTable.WHEN_FOCUSED);
    ActionMap actionMap = table.getActionMap();

    inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), "DeleteRow");
    actionMap.put("DeleteRow", new AbstractAction()
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            int[] row = table.getSelectedRows();

            for (int i = 0; i < row.length; i++)
            {
                ((DefaultTableModel) table.getModel()).removeRow(row[i] - i * 1);
            }
        }
    });
于 2014-06-26T21:00:42.003 に答える