teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記2

2015/09/10 22:41

投稿

argius
argius

スコア9396

answer CHANGED
@@ -40,6 +40,7 @@
40
40
  if (row == 1 && column == 1) {
41
41
  JLabel label = new JLabel(String.valueOf(value));
42
42
  label.setFont(new Font("monospace", Font.BOLD, 16));
43
+ // 良くないやりかた:追記2を参照
43
44
  return label;
44
45
  }
45
46
  return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
@@ -60,3 +61,52 @@
60
61
 
61
62
  }
62
63
  ```
64
+
65
+ ---
66
+
67
+ (追記2)
68
+
69
+ `JLabel`をそのまま返すと選択状態が描画できなくなってしまうので、ダメでした。すみません。
70
+ `super.getTableCellRendererComponent`のコンポーネントに直接フォント変更で行けるはずです。
71
+ 選択したセルをBOLDにする`MyCellRenderer`を書いてみましたので、参考にしてください。
72
+
73
+ ```
74
+ static class MyCellRenderer extends DefaultTableCellRenderer {
75
+
76
+ JTable table;
77
+ Map<Point, Font> cellRendererMap;
78
+
79
+ public MyCellRenderer(JTable table) {
80
+ this.table = table;
81
+ this.cellRendererMap =new HashMap<>();
82
+ }
83
+
84
+ void applyBoldToSelectedCells() {
85
+ Font baseFont = table.getFont();
86
+ int[] cols = table.getSelectedColumns();
87
+ int[] rows = table.getSelectedRows();
88
+ for (int row : rows) {
89
+ for (int col : cols) {
90
+ Point k = new Point(col, row);
91
+ Font v = baseFont.deriveFont(Font.BOLD);
92
+ cellRendererMap.put(k, v);
93
+ }
94
+ }
95
+ table.updateUI();
96
+ }
97
+
98
+ @Override
99
+ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
100
+ boolean hasFocus, int row, int column) {
101
+ Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
102
+ Point key = new Point(column, row);
103
+ if (cellRendererMap.containsKey(key)) {
104
+ Font font = cellRendererMap.get(key);
105
+ c.setFont(font);
106
+ }
107
+ return c;
108
+ }
109
+
110
+ }
111
+ ```
112
+

1

追記

2015/09/10 22:41

投稿

argius
argius

スコア9396

answer CHANGED
@@ -1,2 +1,62 @@
1
1
  `JTable.setFont`メソッドで変更できます。
2
- ただし、セルの高さは自動で変わってくれないので合わせて変更する必要があります。
2
+ ただし、セルの高さは自動で変わってくれないので合わせて変更する必要があります。
3
+
4
+ ---
5
+
6
+ (追記)
7
+
8
+ セルに属性を持たせるのではなく、独自の`CellRenderer`を作ってそこで制御するようにします。
9
+ 下記の例では、特定のセルだけ、2行目の左から2列目だけ(つまり"d"だけ)フォントを変えています。
10
+
11
+ ご質問のようなことをするには、`MyCellRenderer`クラスに2次元配列を用意して、そこにフォントなどの情報を持たせるようにすればできると思います。
12
+
13
+ ```lang-java
14
+ import java.awt.Component;
15
+ import java.awt.Font;
16
+ import javax.swing.JFrame;
17
+ import javax.swing.JLabel;
18
+ import javax.swing.JTable;
19
+ import javax.swing.table.DefaultTableCellRenderer;
20
+
21
+ public final class App extends JFrame {
22
+
23
+ private JTable table;
24
+
25
+ public App() {
26
+ setTitle("App");
27
+ setDefaultCloseOperation(EXIT_ON_CLOSE);
28
+ table = new JTable(new Object[][] {
29
+ new Object[] { "a", "b" }, new Object[] { "c", "d" } },
30
+ new Object[] { "col1", "col2" });
31
+ table.setDefaultRenderer(Object.class, new MyCellRenderer());
32
+ add(table);
33
+ }
34
+
35
+ static class MyCellRenderer extends DefaultTableCellRenderer {
36
+
37
+ @Override
38
+ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
39
+ boolean hasFocus, int row, int column) {
40
+ if (row == 1 && column == 1) {
41
+ JLabel label = new JLabel(String.valueOf(value));
42
+ label.setFont(new Font("monospace", Font.BOLD, 16));
43
+ return label;
44
+ }
45
+ return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
46
+ }
47
+
48
+ }
49
+
50
+ public static void main(String[] args) {
51
+ javax.swing.SwingUtilities.invokeLater(new Runnable() {
52
+ public void run() {
53
+ App app = new App();
54
+ app.setSize(600, 200);
55
+ app.setLocationRelativeTo(null);
56
+ app.setVisible(true);
57
+ }
58
+ });
59
+ }
60
+
61
+ }
62
+ ```