実現したいこと
- JTableに表示されている表から行を選択して削除したい
前提
ここに質問の内容を詳しく書いてください。
Jframeでテーブルを表示させて操作させる簡単なシステムを作っています。
テーブルに表示されている行を選択して、ボタンを押下することで選択行が削除される
機能を搭載しているのですが、「java.lang.ArrayIndexOutOfBoundsException:」が発生しました。
テーブルの行数と選択行がうまく「removeRow()」に送られていないのでしょうか?
発生している問題・エラーメッセージ
【エラーメッセージ】 Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2 >= 0 at java.base/java.util.Vector.removeElementAt(Vector.java:549) at java.desktop/javax.swing.table.DefaultTableModel.removeRow(DefaultTableModel.java:469) at practice.no14.ListPractice.actionPerformed(ListPractice.java:163) at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1972) at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2313) at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405) at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262) at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279) at java.desktop/java.awt.Component.processMouseEvent(Component.java:6620) at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3398) at java.desktop/java.awt.Component.processEvent(Component.java:6385) at java.desktop/java.awt.Container.processEvent(Container.java:2266) at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4995) at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2324) at java.desktop/java.awt.Component.dispatchEvent(Component.java:4827) at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4948) at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4575) at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4516) at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2310) at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2780) at java.desktop/java.awt.Component.dispatchEvent(Component.java:4827) at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:775) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97) at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:747) at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:744) at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90) ### 該当のソースコード ```ここに言語名を入力 【ソースコード】 public class ListPractice extends JFrame implements ActionListener { final JTable table; final TableModel tableModel = new TableModel(); final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tableModel); final JTextField filterText = new JTextField(); final DefaultTableModel model = new DefaultTableModel(); ListPractice() { // フレームのセットアップ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 画面サイズの決定 setSize(400, 300); // 画面位置の設定(null指定で画面中央) setLocationRelativeTo(null); table = new JTable(model); ListSelectionModel lsModel = table.getSelectionModel(); lsModel.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { // TODO 自動生成されたメソッド・スタブ if (e.getValueIsAdjusting()) { return; } ListSelectionModel lsm = (ListSelectionModel) e.getSource(); } }); // フィルターパネル JPanel filterPanel = new JPanel(); // 横レイアウトを指定(X_AXIS) BoxLayout boxLayout = new BoxLayout(filterPanel, BoxLayout.X_AXIS); filterPanel.setLayout(boxLayout); JLabel filterLabel = new JLabel("検索"); filterPanel.add(filterLabel); // 検索処理 filterText.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO 自動生成されたメソッド・スタブ RowFilter<TableModel, Object> filter = null; try { filter = RowFilter.regexFilter(filterText.getText(), 0); } catch (Exception ex) { // TODO: handle exception } sorter.setRowFilter(filter); } }); filterLabel.setLabelFor(filterText); filterPanel.add(filterText); add(filterPanel,BorderLayout.NORTH); // フィルターパネル JPanel filterPanel2 = new JPanel(); // 縦レイアウトを指定(Y_AXIS) BoxLayout boxLayout2 = new BoxLayout(filterPanel2, BoxLayout.Y_AXIS); filterPanel2.setLayout(boxLayout2); // 削除ボタン作成 JButton Rbutton = new JButton("削除"); Rbutton.setAlignmentX(RIGHT_ALIGNMENT); //Rbutton.addActionListener(new ClickAction()); // filterPanel2にボタンを登録 filterPanel2.add(Rbutton); // 削除処理 Rbutton.setActionCommand("DELETE"); Rbutton.addActionListener(this); // テーブルの設定 table.setRowSorter(sorter); table.setModel(tableModel); add(filterPanel2,BorderLayout.CENTER); TableColumn col = table.getColumnModel().getColumn(0); JScrollPane sp = new JScrollPane(table); filterPanel2.add(sp); //getContentPane().add(sp, BorderLayout.CENTER); getContentPane().add(filterPanel, BorderLayout.NORTH); getContentPane().add(filterPanel2, BorderLayout.CENTER); } public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ SwingUtilities.invokeLater(new Runnable() { @Override public void run() { // TODO 自動生成されたメソッド・スタブ ListPractice app = new ListPractice(); app.setVisible(true); } }); } ** @Override public void actionPerformed(ActionEvent e) { // TODO 自動生成されたメソッド・スタブ String command = (String) e.getActionCommand(); // 削除ボタンが押下された時の処理 if ("DELETE".equals(command)) { ListSelectionModel lsModel = table.getSelectionModel(); for (int i=0; i< table.getRowCount(); i++) { if (lsModel.isSelectedIndex(i)) { model.removeRow(i); } } table.repaint(); } }** } 【ソースコード】 public class TableModel extends AbstractTableModel implements Serializable { Object[][] data = { {"田中", "大阪", true}, {"長谷川", "東京", false}, {"藤原", "奈良", false}, {"橋本", "和歌山", false}, {"山田", "北海道", false} }; String[] columns = {"名前", "出身", "選択"}; @Override public Class<?> getColumnClass(int columnIndex) { return data[0][columnIndex].getClass(); } // データのカラム数を返す @Override public int getColumnCount() { // TODO 自動生成されたメソッド・スタブ return columns.length; } // データの行数を返す @Override public int getRowCount() { // TODO 自動生成されたメソッド・スタブ return data.length; } // カラム名をStringで返す @Override public String getColumnName(int column) { // TODO 自動生成されたメソッド・スタブ return columns[column]; } @Override public Object getValueAt(int rowIndex, int columnIndex) { // TODO 自動生成されたメソッド・スタブ return data[rowIndex][columnIndex]; } // セルの編集に関するメソッド @Override public boolean isCellEditable(int rowIndex, int columnIndex) { // TODO 自動生成されたメソッド・スタブ // 編集可能なセルの設定 if(columnIndex == 2) { return true; } else { return false; } } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { // TODO 自動生成されたメソッド・スタブ data[rowIndex][columnIndex] = aValue; fireTableCellUpdated(rowIndex, columnIndex); } public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ } } ### 補足情報(FW/ツールのバージョンなど) 参考にしたサイト http://asistobe851.web.fc2.com/my-memo/RowManagement.html 初学者のため無駄なコードがあると思いますが、ご容赦ください。
回答2件
あなたの回答
tips
プレビュー