?? s19.htm
字號:
public int getColumnCount() { <br> return columnNames.length;<br> }<br> public String getColumnName(int col) {<br> return columnNames[col];<br> }<br> public Class getColumnClass(int col) {<br> return data[0][col].getClass();<br> }<br> public void setValueAt(Object value, int row, int col) {<br> data[row][col] = value;<br> fireTableCellUpdated(row, col);<br> }<br> public boolean isCellEditable(int row, int col) {<br> Class cls = getColumnClass(col);<br> String name = getColumnName(col);</p> <p> return (cls == Boolean.class && !name.equals("Dolby")) ||<br> cls == Integer.class || cls == Double.class;<br> }<br> public void updateBulbs(int selectedRow) {<br> for(int r=0; r < getRowCount(); ++r) {<br> data[r][0] = new Boolean(r == selectedRow);<br> }<br> }<br> }</p> <hr size="1" noshade> <p align="center"> </p> <p align="center"><b>例19-12 使用繪制器和編輯器</b></p> <hr noshade size="1"> import java.awt.*;<br> import java.awt.event.*;<br> import java.text.*;<br> import java.util.*;<br> import javax.swing.*;<br> import javax.swing.event.*;<br> import javax.swing.table.*; <p>public class Test extends JFrame {<br> JTable table = new JTable(new StereoDeckModel());</p> <p> public Test() {<br> initializeInUseColumn();<br> initializePriceColumn();<br> initializeVolumeColumn();<br> sizeColumns();</p> <p> table.setSelectionMode(<br> ListSelectionModel.SINGLE_SELECTION);</p> <p> table.getSelectionModel().addListSelectionListener(<br> new ListSelectionListener() {<br> public void valueChanged(ListSelectionEvent e) {<br> StereoDeckModel model = <br> (StereoDeckModel)table.getModel(); </p> <p> if(!e.getValueIsAdjusting()) {<br> model.updateBulbs(table.getSelectedRow());<br> }<br> }<br> });<br> getContentPane().add(new JScrollPane(table),<br> BorderLayout.CENTER);<br> }<br> private void initializeInUseColumn() {<br> TableColumn inUseColumn = table.getColumn("In Use");<br> <br> inUseColumn.setCellRenderer(new BulbRenderer());<br> inUseColumn.setCellEditor(new BulbEditor());<br> }<br> private void initializePriceColumn() {<br> TableColumn priceColumn = table.getColumn("Price");<br> JComboBox combo = new JComboBox();</p> <p> // Combo box items are Numbers ...<br> combo.addItem(new Double(159.99));<br> combo.addItem(new Double(169.99));<br> combo.addItem(new Double(229.99));<br> combo.addItem(new Double(449.99));<br> combo.addItem(new Double(699.99));</p> <p> combo.setRenderer(new ListCellCurrencyRenderer());</p> <p> priceColumn.setCellRenderer(<br> new TableCellCurrencyRenderer());</p> <p> priceColumn.setCellEditor(new PriceEditor(combo));<br> }<br> private void initializeVolumeColumn() {<br> TableColumn volumeColumn = table.getColumn("Volume");<br> TableCellRenderer renderer = new VolumeRenderer();<br> TableCellEditor editor = new VolumeEditor();</p> <p> volumeColumn.setCellRenderer(renderer);<br> volumeColumn.setCellEditor(editor);</p> <p> Dimension ps = ((JPanel)renderer).getPreferredSize();<br> table.setRowHeight(ps.height);<br> }<br> public static void main(String args[]) {<br> GraphicJavaApplication.launch(<br> new Test(), "Car Stereo Deck", 300,300,559,368);<br> }<br> private void sizeColumns() {<br> TableColumnModel tcm = table.getColumnModel();</p> <p> for(int i=0; i < tcm.getColumnCount(); ++i) {<br> TableColumn column = tcm.getColumn(i);<br> int w = getPreferredWidthForColumn(column);</p> <p> column.setMinWidth(w);<br> column.setMaxWidth(w);<br> }<br> }<br> public int getPreferredWidthForColumn(TableColumn col) {<br> int hw = columnHeaderWidth(col), // hw = header width<br> cw = widestCellInColumn(col); // cw = column width</p> <p> return hw > cw ? hw+10 : cw+10;<br> }<br> private int columnHeaderWidth(TableColumn col) {<br> TableCellRenderer renderer = col.getHeaderRenderer();</p> <p> Component comp = renderer.getTableCellRendererComponent(<br> table, col.getHeaderValue(), <br> false, false, 0, 0);</p> <p> return comp.getPreferredSize().width;<br> }<br> private int widestCellInColumn(TableColumn col) {<br> int c = col.getModelIndex(), width=0, maxw=0;</p> <p> for(int r=0; r < table.getRowCount(); ++r) {<br> TableCellRenderer renderer = <br> table.getCellRenderer(r,c);</p> <p> Component comp = <br> renderer.getTableCellRendererComponent(<br> table, table.getValueAt(r,c), <br> false, false, r, c);</p> <p> width = comp.getPreferredSize().width;<br> maxw = width > maxw ? width : maxw;<br> }<br> return maxw;<br> }<br> }<br> class ListCellCurrencyRenderer extends DefaultListCellRenderer {<br> public Component getListCellRendererComponent(<br> JList list,<br> Object value,<br> int index,<br> boolean isSelected,<br> boolean hasFocus) {<br> JLabel c = (JLabel)<br> super.getListCellRendererComponent(<br> list, value, index,<br> isSelected, hasFocus);</p> <p> Format format = NumberFormat.getCurrencyInstance();<br> c.setText(value == null ? "" : format.format(value));<br> return c;<br> }<br> }<br> class TableCellCurrencyRenderer extends DefaultTableCellRenderer {<br> public void setValue(Object value) {<br> Format format = NumberFormat.getCurrencyInstance();<br> super.setValue(value == null ? "" : format.format(value));<br> }<br> }<br> class GraphicJavaApplication extends WindowAdapter {<br> public static void launch(final JFrame f, String title,<br> final int x, final int y, <br> final int w, int h) {<br> f.setTitle(title);<br> f.setBounds(x,y,w,h);<br> f.setVisible(true);</p> <p> f.setDefaultCloseOperation(<br> WindowConstants.DISPOSE_ON_CLOSE);</p> <p> f.addWindowListener(new WindowAdapter() {<br> public void windowClosed(WindowEvent e) {<br> System.exit(0);<br> }<br> });<br> }<br> }</p> <hr size="1" noshade> <p align="center"> </p> <p> 19.6.2 表格單繪制器</p> <p> </p> <p align="center"><b>例19-13 VolumeRenderer</b></p> <hr noshade size="1"> import java.awt.*;<br> import javax.swing.*;<br> import javax.swing.event.*;<br> import javax.swing.table.*; <p>class VolumeRenderer extends JPanel<br> implements TableCellRenderer {<br> private JSlider slider = new JSlider();<br> private JLabel label = new JLabel("value");</p> <p> public VolumeRenderer() {<br> slider.setOrientation(SwingConstants.HORIZONTAL);<br> slider.setPreferredSize(new Dimension(200,30));<br> slider.putClientProperty("JSlider.isFilled",Boolean.TRUE);</p> <p> label.setHorizontalAlignment(JLabel.CENTER);<br> label.setHorizontalTextPosition(JLabel.CENTER);</p> <p> setLayout(new BorderLayout());<br> add(label, BorderLayout.NORTH);<br> add(slider, BorderLayout.CENTER);</p> <p> slider.addChangeListener(new ChangeListener() {<br> public void stateChanged(ChangeEvent e) {<br> label.setText(<br> Integer.toString(slider.getValue()));<br> }<br> });<br> }<br> public Component getTableCellRendererComponent(<br> JTable table, Object value,<br> boolean isSelected,<br> boolean hasFocus,<br> int row, int col) {<br> Integer v = (Integer)value;</p> <p> slider.setValue(v.intValue());<br> label.setText(v.toString());</p> <p> slider.setEnabled(isSelected);<br> label.setEnabled(isSelected);</p> <p> return this;<br> }<br> public JSlider getSlider() {<br> return slider;<br> }<br> public JLabel getLabel() {<br> return label;<br> }<br> }</p> <hr size="1" noshade> <p align="center"> </p> <p> 19.6.3 Default Table Cell Renderer類</p> <p> </p> <p align="center"><b>例19-14 BulbRenderer</b></p> <hr noshade size="1"> import java.awt.*;<br> import javax.swing.*;<br> import javax.swing.table.*; <p>class BulbRenderer extends DefaultTableCellRenderer {<br> private ImageIcon darkBulb = new ImageIcon("button.jpg"),<br> brightBulb = new ImageIcon("button_lit.jpg");</p> <p> public BulbRenderer() {<br> setHorizontalAlignment(JLabel.CENTER);<br> }<br> public Component getTableCellRendererComponent(<br> JTable table, Object value,<br> boolean isSelected,<br> boolean hasFocus,<br> int row, int col) {<br> Boolean b = (Boolean)value;<br> setIcon(b.booleanValue() ? brightBulb : darkBulb);<br> return this;<br> }<br> }</p> <hr size="1" noshade> <p align="center"> </p> <p> 19.6.4 表格格式化繪制器</p> <p> </p> <p align="center"> </p> <p> 19.6.5 單元編輯器</p> <p> </p> <p align="center"> </p> <p> 19.6.6 表格單編輯器</p> <p> </p> <p align="center"> </p> <p> 19.6.7 實現TableCellEditor接口</p> <p> </p> <p align="center"><b>例19-15 AbstractCellEditor</b></p> <hr noshade size="1"> import java.awt.*;<br> import javax.swing.*;<br> import javax.swing.event.*;<br> import javax.swing.table.*;<br> import javax.swing.tree.*;<br> import java.awt.event.MouseEvent;<br> import java.util.EventObject; <p>abstract public class AbstractCellEditor <br> implements TableCellEditor {<br> protected EventListenerList listenerList = <br> new EventListenerList();<br> protected Object value;<br> protected ChangeEvent changeEvent = null;<br> protected int clickCountToStart = 1;</p> <p> public Object getCellEditorValue() {<br> return value;<br> }<br> public void setCellEditorValue(Object value) {<br> this.value = value;<br> }<br> public void setClickCo
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -