回答編集履歴
4
DateCellRenderer の設定が消えていたのを修正、追加ダイアログ追加
test
CHANGED
@@ -12,6 +12,7 @@
|
|
12
12
|
import java.awt.*;
|
13
13
|
import java.awt.event.ActionEvent;
|
14
14
|
import java.awt.event.ActionListener;
|
15
|
+
import java.text.DateFormat;
|
15
16
|
import java.text.SimpleDateFormat;
|
16
17
|
import java.util.Date;
|
17
18
|
|
@@ -38,14 +39,17 @@
|
|
38
39
|
table.getTableHeader().setReorderingAllowed(false);
|
39
40
|
table.setRowHeight(30);
|
40
41
|
table.setFont(new Font("SansSerif", Font.BOLD, 20));
|
42
|
+
table.getColumnModel().getColumn(0).setCellRenderer(new DateCellRenderer());
|
41
43
|
|
42
44
|
JButton btn1 = new JButton("追加");
|
43
45
|
btn1.addActionListener(new ActionListener() {
|
44
|
-
private int count = 0;
|
45
46
|
@Override
|
46
47
|
public void actionPerformed(ActionEvent e) {
|
47
|
-
|
48
|
+
InputDataPanel inputDataPanel = new InputDataPanel();
|
48
|
-
ta
|
49
|
+
int option = JOptionPane.showOptionDialog(SwingTest.this, inputDataPanel, "追加", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, null, null);
|
50
|
+
if(option != JOptionPane.OK_OPTION) return;
|
51
|
+
|
52
|
+
tableModel.addRow(inputDataPanel.getRowDatas());
|
49
53
|
}
|
50
54
|
});
|
51
55
|
|
@@ -53,7 +57,7 @@
|
|
53
57
|
btn2.addActionListener(new ActionListener() {
|
54
58
|
@Override
|
55
59
|
public void actionPerformed(ActionEvent e) {
|
56
|
-
int option = JOptionPane.showConfirmDialog(SwingTest.this, "削除しますか?", "選択
|
60
|
+
int option = JOptionPane.showConfirmDialog(SwingTest.this, "削除しますか?", "選択", JOptionPane.YES_NO_OPTION);
|
57
61
|
if(option != JOptionPane.YES_OPTION) return;
|
58
62
|
|
59
63
|
int[] selection = table.getSelectedRows();
|
@@ -69,12 +73,52 @@
|
|
69
73
|
}
|
70
74
|
|
71
75
|
class DateCellRenderer extends DefaultTableCellRenderer {
|
72
|
-
public Component getTableCellRendererComponent(JTable table,
|
76
|
+
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
|
73
77
|
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
|
74
78
|
|
75
|
-
SimpleDateFormat sd = new SimpleDateFormat("yyyy/MM/dd/ (E) HH:mm:ss");
|
76
|
-
setText(
|
79
|
+
setText(createDateFormat().format((Date)value));
|
77
80
|
return this;
|
81
|
+
}
|
82
|
+
}
|
83
|
+
|
84
|
+
private static DateFormat createDateFormat() {
|
85
|
+
return new SimpleDateFormat("yyyy/MM/dd/ (E) HH:mm:ss");
|
86
|
+
}
|
87
|
+
|
88
|
+
class InputDataPanel extends JPanel {
|
89
|
+
private Date date;
|
90
|
+
private JTextField nameText, howToReadText, contentsText, addressText, moneyText, etcText;
|
91
|
+
|
92
|
+
InputDataPanel() {
|
93
|
+
super(new GridBagLayout());
|
94
|
+
|
95
|
+
date = new Date();
|
96
|
+
|
97
|
+
GridBagConstraints gbc = new GridBagConstraints();
|
98
|
+
|
99
|
+
JTextField dateText = createViews("日付", gbc);
|
100
|
+
dateText.setEditable(false);
|
101
|
+
dateText.setText(createDateFormat().format(date));
|
102
|
+
|
103
|
+
nameText = createViews("氏名", gbc);
|
104
|
+
howToReadText = createViews("振り仮名", gbc);
|
105
|
+
contentsText = createViews("内容", gbc);
|
106
|
+
addressText = createViews("住所", gbc);
|
107
|
+
moneyText = createViews("金額", gbc);
|
108
|
+
etcText = createViews("備考", gbc);
|
109
|
+
}
|
110
|
+
|
111
|
+
private JTextField createViews(String labelText, GridBagConstraints gbc) {
|
112
|
+
gbc.gridx = 0;
|
113
|
+
add(new JLabel(labelText), gbc);
|
114
|
+
gbc.gridx = 1;
|
115
|
+
JTextField textfield = new JTextField(20);
|
116
|
+
add(textfield, gbc);
|
117
|
+
return textfield;
|
118
|
+
}
|
119
|
+
|
120
|
+
Object[] getRowDatas() {
|
121
|
+
return new Object[]{ date, nameText.getText(), howToReadText.getText(), contentsText.getText(), addressText.getText(), moneyText.getText(), etcText.getText()};
|
78
122
|
}
|
79
123
|
}
|
80
124
|
}
|
3
コード追加
test
CHANGED
@@ -4,3 +4,79 @@
|
|
4
4
|
描画する行・列は row, column 、フォーカス状態・選択状態は hasFocus, isSelected 、そしてデータそのものは value です。
|
5
5
|
value は JTable が TableModel の getValueAt から得たものです。
|
6
6
|
TableModel の該当行・列に表示したい日付が入っていて getValueAt で Date オブジェクトとして返されれば value はそのオブジェクトとなりますので、 Date にキャストして利用してください。
|
7
|
+
|
8
|
+
ざっくり直すとこんな感じです。
|
9
|
+
```java
|
10
|
+
package teratail_java.q_9uc7u8pf4rfyv0;
|
11
|
+
|
12
|
+
import java.awt.*;
|
13
|
+
import java.awt.event.ActionEvent;
|
14
|
+
import java.awt.event.ActionListener;
|
15
|
+
import java.text.SimpleDateFormat;
|
16
|
+
import java.util.Date;
|
17
|
+
|
18
|
+
import javax.swing.*;
|
19
|
+
import javax.swing.table.DefaultTableCellRenderer;
|
20
|
+
import javax.swing.table.DefaultTableModel;
|
21
|
+
|
22
|
+
public class SwingTest extends JFrame {
|
23
|
+
private static String[] header = { "日付", "氏名", "振り仮名", "内容", "住所", "金額", "備考", };
|
24
|
+
|
25
|
+
public static void main(String args[]) {
|
26
|
+
new SwingTest().setVisible(true);
|
27
|
+
}
|
28
|
+
|
29
|
+
SwingTest() {
|
30
|
+
super("Sample");
|
31
|
+
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
32
|
+
setSize(1000, 1080);
|
33
|
+
|
34
|
+
DefaultTableModel tableModel = new DefaultTableModel(header, 0);
|
35
|
+
|
36
|
+
JTable table = new JTable(tableModel);
|
37
|
+
table.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
|
38
|
+
table.getTableHeader().setReorderingAllowed(false);
|
39
|
+
table.setRowHeight(30);
|
40
|
+
table.setFont(new Font("SansSerif", Font.BOLD, 20));
|
41
|
+
|
42
|
+
JButton btn1 = new JButton("追加");
|
43
|
+
btn1.addActionListener(new ActionListener() {
|
44
|
+
private int count = 0;
|
45
|
+
@Override
|
46
|
+
public void actionPerformed(ActionEvent e) {
|
47
|
+
count ++;
|
48
|
+
tableModel.addRow(new Object[]{new Date(), "氏名"+count, "振り仮名"+count, "内容"+count, "住所"+count, "金額"+count, "備考"+count,});
|
49
|
+
}
|
50
|
+
});
|
51
|
+
|
52
|
+
JButton btn2 = new JButton("削除");
|
53
|
+
btn2.addActionListener(new ActionListener() {
|
54
|
+
@Override
|
55
|
+
public void actionPerformed(ActionEvent e) {
|
56
|
+
int option = JOptionPane.showConfirmDialog(SwingTest.this, "削除しますか?", "選択ダイアログ", JOptionPane.YES_NO_OPTION);
|
57
|
+
if(option != JOptionPane.YES_OPTION) return;
|
58
|
+
|
59
|
+
int[] selection = table.getSelectedRows();
|
60
|
+
for(int i = selection.length - 1; i >= 0; i--) {
|
61
|
+
tableModel.removeRow(table.convertRowIndexToModel(selection[i]));
|
62
|
+
}
|
63
|
+
}
|
64
|
+
});
|
65
|
+
|
66
|
+
add(new JScrollPane(table), BorderLayout.CENTER);
|
67
|
+
add(btn1, BorderLayout.NORTH);
|
68
|
+
add(btn2, BorderLayout.SOUTH);
|
69
|
+
}
|
70
|
+
|
71
|
+
class DateCellRenderer extends DefaultTableCellRenderer {
|
72
|
+
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
|
73
|
+
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
|
74
|
+
|
75
|
+
SimpleDateFormat sd = new SimpleDateFormat("yyyy/MM/dd/ (E) HH:mm:ss");
|
76
|
+
setText(sd.format((Date)value));
|
77
|
+
return this;
|
78
|
+
}
|
79
|
+
}
|
80
|
+
}
|
81
|
+
```
|
82
|
+
セルレンダラは、単に文字列を表示するだけであれば DefaultTableCellRenderer を使った方が isSelected や hasFocus の処理をしてくれますので便利です。 (JLabel を用いるより負荷を軽減するようにも設計されているようです。)
|
2
修正・追加
test
CHANGED
@@ -2,4 +2,5 @@
|
|
2
2
|
ですのでデータ毎に設定する必要はありません。最初に一回設定するだけで済むはずです。
|
3
3
|
1つで全ての行の該当列の描画を行うため、描画に使用するデータは全てパラメータから得る必要があります。
|
4
4
|
描画する行・列は row, column 、フォーカス状態・選択状態は hasFocus, isSelected 、そしてデータそのものは value です。
|
5
|
-
value は
|
5
|
+
value は JTable が TableModel の getValueAt から得たものです。
|
6
|
+
TableModel の該当行・列に表示したい日付が入っていて getValueAt で Date オブジェクトとして返されれば value はそのオブジェクトとなりますので、 Date にキャストして利用してください。
|
1
修正
test
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
セルレンダラは、1つで全行の該当列の描画に使用されます。
|
2
2
|
ですのでデータ毎に設定する必要はありません。最初に一回設定するだけで済むはずです。
|
3
3
|
1つで全ての行の該当列の描画を行うため、描画に使用するデータは全てパラメータから得る必要があります。
|
4
|
-
描画する行・列は row, column 、フォーカス状態・選択状態は hasFocus, isSelected 、そしてデータそのものは value
|
4
|
+
描画する行・列は row, column 、フォーカス状態・選択状態は hasFocus, isSelected 、そしてデータそのものは value です。
|
5
5
|
value は jtable が TableModel の getValueAt から得たものです。
|