上篇的例子主要的動作在editor上,不過editor只有在點擊在cell單元的時候才會顯示,所以還不得不造一個界面跟editor一樣的renderer進行“造假”,當然由于這個例子只有兩個按鈕,所以renderer的代碼不多,不過如果editor的組件很多,而且經常需要改動那不就麻煩了,所以我們可以考慮一下讓renderer復用editor的顯示部分,以下的代碼就是很好的說明了這種復用
1
import java.awt.*;
2
import java.awt.event.*;
3
import javax.swing.*;
4
import javax.swing.table.*;
5
6
public class TableTest2 extends JFrame {
7
JTable table;
8
String[] states = new String[]{"stop", "stop", "stop"};
9
10
// model
11
class TableModel extends AbstractTableModel{
12
public int getColumnCount() {
13
return 2;
14
}
15
public int getRowCount() {
16
return states.length;
17
}
18
public Object getValueAt(int rowIndex, int columnIndex) {
19
if(columnIndex == 0){
20
return states[rowIndex];
21
}
22
return null;
23
}
24
public String getColumnName(int columnIndex) {
25
if(columnIndex == 0){
26
return "state";
27
}else{
28
return "operate";
29
}
30
}
31
public boolean isCellEditable(int rowIndex, int columnIndex) {
32
if(columnIndex == 0){
33
return false;
34
}else{
35
return true;
36
}
37
}
38
}
39
40
// cell editor
41
class Editor extends AbstractCellEditor implements TableCellEditor, ActionListener {
42
int row;
43
JTable table;
44
JPanel panel;
45
JButton start;
46
JButton stop;
47
Editor(){
48
panel = new JPanel();
49
panel.setLayout(new GridLayout(1, 2));
50
start = new JButton("start");
51
stop = new JButton("stop");
52
start.addActionListener(this);
53
stop.addActionListener(this);
54
panel.add(start);
55
panel.add(stop);
56
}
57
public Object getCellEditorValue() {
58
return null;
59
}
60
public Component getTableCellEditorComponent(
61
JTable table, Object value, boolean isSelected, int row, int column) {
62
this.table = table;
63
this.row = row;
64
return panel;
65
}
66
67
public void actionPerformed(ActionEvent e) {
68
if(e.getSource() == start){
69
states[row] = "start";
70
}else{
71
states[row] = "stop";
72
}
73
((AbstractTableModel)table.getModel()).fireTableCellUpdated(row, 0);
74
}
75
76
}
77
78
// cell render
79
class Renderer extends JComponent implements TableCellRenderer{
80
TableCellEditor editor;
81
Renderer(TableCellEditor editor){
82
this.editor = editor;
83
}
84
public Component getTableCellRendererComponent(JTable table, Object value,
85
boolean isSelected, boolean hasFocus, int row, int column) {
86
return editor.getTableCellEditorComponent(table, value, isSelected, row, column);
87
}
88
}
89
90
public TableTest2(){
91
super("editor used by renderer");
92
table = new JTable(new TableModel());
93
TableColumn tableColumn = table.getColumnModel().getColumn(1);
94
tableColumn.setCellRenderer(new Renderer(new Editor()));
95
tableColumn.setCellEditor(new Editor());
96
97
this.getContentPane().setLayout(new BorderLayout());
98
this.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
99
this.setSize(500, 300);
100
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
101
}
102
public static void main(String[] args) {
103
new TableTest2().show();
104
}
105
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105
