Posted on 2010-08-24 11:52
TWaver 閱讀(1087)
評論(0) 編輯 收藏
上篇的例子主要的動作在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
}
