回答編集履歴

4

DateCellRenderer の設定が消えていたのを修正、追加ダイアログ追加

2022/02/16 15:29

投稿

jimbe
jimbe

スコア12646

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
- count ++;
48
+ InputDataPanel inputDataPanel = new InputDataPanel();
48
- tableModel.addRow(new Object[]{new Date(), "氏名"+count, "振り仮名"+count, "内容"+count, "住所"+count, "金額"+count, "備考"+count,});
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, "削除しますか?", "選択ダイアログ", JOptionPane.YES_NO_OPTION);
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, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
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(sd.format((Date)value));
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

コード追加

2022/02/16 14:11

投稿

jimbe
jimbe

スコア12646

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

修正・追加

2022/02/14 18:54

投稿

jimbe
jimbe

スコア12646

test CHANGED
@@ -2,4 +2,5 @@
2
2
  ですのでデータ毎に設定する必要はありません。最初に一回設定するだけで済むはずです。
3
3
  1つで全ての行の該当列の描画を行うため、描画に使用するデータは全てパラメータから得る必要があります。
4
4
  描画する行・列は row, column 、フォーカス状態・選択状態は hasFocus, isSelected 、そしてデータそのものは value です。
5
- value は jtable が TableModel の getValueAt から得たものです。
5
+ value は JTable が TableModel の getValueAt から得たものです。
6
+ TableModel の該当行・列に表示したい日付が入っていて getValueAt で Date オブジェクトとして返されれば value はそのオブジェクトとなりますので、 Date にキャストして利用してください。

1

修正

2022/02/14 18:44

投稿

jimbe
jimbe

スコア12646

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 から得たものです。