回答編集履歴

2

コード追加

2023/05/20 19:50

投稿

jimbe
jimbe

スコア13168

test CHANGED
@@ -5,3 +5,169 @@
5
5
 
6
6
  また、"選択"列と SelectionModel は関係ありません。
7
7
  選択列の値によって処理を行うのであれば、そのようなコードを書く必要があります。
8
+
9
+ クラス名を変更、モデルを内部に取り込み、パネルをクラス化、ActionListener は無名クラスにしています。
10
+ モデルのデータを配列から(削除し易いように)リスト化、行削除メソッド(removeRow)を作成、 ControllPanel の削除ボタンを押すとリストの最後から順に選択状態を調べてモデルの行削除メソッドを呼びます。
11
+ ```java
12
+ import java.awt.BorderLayout;
13
+ import java.awt.event.ActionEvent;
14
+ import java.awt.event.ActionListener;
15
+ import java.util.*;
16
+
17
+ import javax.swing.*;
18
+ import javax.swing.table.AbstractTableModel;
19
+ import javax.swing.table.TableRowSorter;
20
+
21
+ public class TableFrame extends JFrame {
22
+ public static void main(String[] args) {
23
+ SwingUtilities.invokeLater(new Runnable() {
24
+ @Override
25
+ public void run() {
26
+ new TableFrame().setVisible(true);
27
+ }
28
+ });
29
+ }
30
+
31
+ TableFrame() {
32
+ super("TableFrame");
33
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
34
+ setSize(400, 300);
35
+ setLocationRelativeTo(null);
36
+
37
+ LocalTableModel model = new LocalTableModel();
38
+
39
+ JTable table = new JTable(model);
40
+ add(new JScrollPane(table), BorderLayout.CENTER);
41
+
42
+ TableRowSorter<?> sorter = new TableRowSorter<LocalTableModel>(model);
43
+ table.setRowSorter(sorter);
44
+ FilterPanel filterPanel = new FilterPanel(sorter);
45
+
46
+ ControllPanel controllPanel = new ControllPanel(model);
47
+
48
+ JPanel northPanel = new JPanel(null);
49
+ northPanel.setLayout(new BoxLayout(northPanel, BoxLayout.Y_AXIS));
50
+ northPanel.add(filterPanel);
51
+ northPanel.add(controllPanel);
52
+ add(northPanel, BorderLayout.NORTH);
53
+ }
54
+
55
+ /** モデル */
56
+ private static class LocalTableModel extends AbstractTableModel {
57
+ private static final String[] columns = {"名前", "出身", "選択"};
58
+
59
+ private static class Data {
60
+ String name, birthplace;
61
+ boolean select;
62
+
63
+ Data(String name, String birthplace, boolean select) {
64
+ this.name = name;
65
+ this.birthplace = birthplace;
66
+ this.select = select;
67
+ }
68
+ }
69
+
70
+ private List<Data> dataList = new ArrayList<>(Arrays.asList(
71
+ new Data("田中", "大阪", true),
72
+ new Data("長谷川", "東京", false),
73
+ new Data("藤原", "奈良", false),
74
+ new Data("橋本", "和歌山", false),
75
+ new Data("山田", "北海道", false)
76
+ ));
77
+
78
+ @Override
79
+ public Class<?> getColumnClass(int columnIndex) {
80
+ return columnIndex == 2 ? Boolean.class : String.class;
81
+ }
82
+
83
+ @Override
84
+ public int getColumnCount() {
85
+ return columns.length;
86
+ }
87
+
88
+ @Override
89
+ public int getRowCount() {
90
+ return dataList.size();
91
+ }
92
+
93
+ @Override
94
+ public String getColumnName(int column) {
95
+ return columns[column];
96
+ }
97
+
98
+ @Override
99
+ public Object getValueAt(int rowIndex, int columnIndex) {
100
+ Data data = dataList.get(rowIndex);
101
+ switch(columnIndex) {
102
+ case 0: return data.name;
103
+ case 1: return data.birthplace;
104
+ case 2: return data.select;
105
+ }
106
+ return null;
107
+ }
108
+
109
+ @Override
110
+ public boolean isCellEditable(int rowIndex, int columnIndex) {
111
+ return columnIndex == 2; // 編集可能なセルの設定
112
+ }
113
+
114
+ @Override
115
+ public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
116
+ if(columnIndex != 2) return;
117
+ dataList.get(rowIndex).select = (boolean)aValue;
118
+ fireTableCellUpdated(rowIndex, columnIndex);
119
+ }
120
+
121
+ //削除
122
+ void removeRow(int rowIndex) {
123
+ dataList.remove(rowIndex);
124
+ fireTableRowsDeleted(rowIndex, rowIndex);
125
+ }
126
+ }
127
+
128
+ /** フィルターパネル */
129
+ private static class FilterPanel extends JPanel {
130
+ FilterPanel(TableRowSorter<?> sorter) {
131
+ super(null);
132
+ setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
133
+
134
+ JLabel filterLabel = new JLabel("検索");
135
+ add(filterLabel);
136
+
137
+ JTextField filterText = new JTextField();
138
+ filterText.addActionListener(new ActionListener() {
139
+ @Override
140
+ public void actionPerformed(ActionEvent e) {
141
+ sorter.setRowFilter(RowFilter.regexFilter(filterText.getText(), 0));
142
+ }
143
+ });
144
+ add(filterText);
145
+
146
+ filterLabel.setLabelFor(filterText);
147
+ }
148
+ }
149
+
150
+ /** コントロールパネル */
151
+ private static class ControllPanel extends JPanel {
152
+ ControllPanel(LocalTableModel model) {
153
+ super(null);
154
+ setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
155
+
156
+ //削除ボタン
157
+ JButton deleteButton = new JButton("削除");
158
+ deleteButton.setAlignmentX(RIGHT_ALIGNMENT);
159
+ deleteButton.addActionListener(new ActionListener() {
160
+ @Override
161
+ public void actionPerformed(ActionEvent e) {
162
+ for(int i=model.getRowCount()-1; i>=0; i--) { //先頭からやると削除時に後続のインデックスがズレてくるので、最期からやる
163
+ if((boolean)model.getValueAt(i, 2)) { //選択
164
+ model.removeRow(i);
165
+ }
166
+ }
167
+ }
168
+ });
169
+ add(deleteButton);
170
+ }
171
+ }
172
+ }
173
+ ```

1

追記

2023/05/20 19:11

投稿

jimbe
jimbe

スコア13168

test CHANGED
@@ -2,3 +2,6 @@
2
2
 
3
3
  そもそも削除対象のモデルが違います。
4
4
  ご自身で作成された TableModel から削除しなければならないのに、中身のない DefaultTableModel から作った model から削除しようとしています。
5
+
6
+ また、"選択"列と SelectionModel は関係ありません。
7
+ 選択列の値によって処理を行うのであれば、そのようなコードを書く必要があります。