TWaver - 专注UI技术

http://twaver.servasoft.com/
posts - 171, comments - 191, trackbacks - 0, articles - 2
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Renderer&Editor之Swing篇(三)

Posted on 2010-08-24 11:55 TWaver 阅读(1131) 评论(0)  编辑  收藏

上文实现了renderer复用editor的功能,那么反过来editor是否也可以复用renderer的功能呢?而且第一篇提到“通过Java2D来绘制各种天花乱坠的效果”如何实现?这俩个疑问在以下代码中都有了很好的解答,里面有不少技术细节,我就不多说了大家自己仔细看看。

其实Flex也有同样的机制,可参见Example: Using an item renderer as an item editor

1/**
2 *  A flag that indicates that the item renderer is also an item editor.
3 *  If this property is <code>true</code>, Flex
4 *  ignores the <code>itemEditor</code> property and uses the item
5 *  renderer for that item as the editor.
6 *
7 *  @default false
8 */

9public var rendererIsEditor:Boolean = false;

  1import java.awt.*;
  2import java.awt.geom.*;
  3import java.awt.event.*;
  4import javax.swing.*;
  5import javax.swing.border.*;
  6import javax.swing.table.*;
  7public class TableTest3 extends JFrame {
  8 JTable table;
  9 Double[] values = new Double[]{new Double(0.1), new Double(0.3), new Double(0.8)};
 10
 11 // model
 12 class TableModel extends AbstractTableModel{
 13  public int getColumnCount() {
 14   return 2;
 15  }

 16  public int getRowCount() {
 17   return values.length;
 18  }

 19  public Object getValueAt(int rowIndex, int columnIndex) {
 20   return values[rowIndex];
 21  }

 22  public void setValueAt(Object value, int rowIndex, int columnIndex) {
 23   values[rowIndex] = (Double)value;
 24   this.fireTableCellUpdated(rowIndex, 0);
 25  }

 26     public String getColumnName(int columnIndex) {
 27   if(columnIndex == 0){
 28    return "plain";
 29   }
else{
 30    return "beauty";
 31   }

 32     }

 33     public boolean isCellEditable(int rowIndex, int columnIndex) {
 34   if(columnIndex == 0){
 35    return false;
 36   }
else{
 37    return true;
 38   }

 39     }

 40 }

 41
 42 // cell editor
 43 class Editor extends AbstractCellEditor implements TableCellEditor, ActionListener {
 44  JSlider slider = new JSlider(JSlider.HORIZONTAL, 010050);
 45  TableCellRenderer renderer;
 46  JButton actionButton;
 47
 48     Object value;
 49     JTable table;
 50     int row;
 51     int column;
 52
 53     JPanel panel = new JPanel(new BorderLayout()); 
 54
 55     public Editor(TableCellRenderer renderer){
 56         this.renderer = renderer;
 57         actionButton = new JButton(new ImageIcon(TableTest3.class.getResource("dotdotdot.gif")));
 58         actionButton.addActionListener(this);
 59         actionButton.setFocusable(false);
 60         actionButton.setFocusPainted(false);
 61         actionButton.setMargin(new Insets(0000));
 62         panel.add(actionButton, BorderLayout.EAST);
 63     }
 
 64
 65     public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column){
 66      this.value = value;
 67         this.table = table;
 68         this.row = row;
 69         this.column = column;
 70         panel.add(renderer.getTableCellRendererComponent(table, value, true, isSelected, row, column));
 71         return panel;
 72     }
 
 73
 74     public Object getCellEditorValue(){
 75         return value;
 76     }

 77  public void actionPerformed(ActionEvent e) {
 78         int intValue = (int)(((Number)value).doubleValue() * 100);
 79         slider.setValue(intValue);
 80
 81         int result = JOptionPane.showOptionDialog(TableTest3.this,
 82                 slider, "change value",
 83                 JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, nullnullnull); 
 84
 85         if(result==JOptionPane.OK_OPTION) {
 86          this.value = new Double(slider.getValue()/100.0);
 87             this.fireEditingStopped();
 88         }
else{
 89          this.fireEditingCanceled();
 90         }

 91  }

 92 }

 93
 94 // cell render
 95 class Renderer extends JComponent implements TableCellRenderer{
 96  Border noFocusBorder = new EmptyBorder(1111);
 97  Border focusBorder = UIManager.getBorder("Table.focusCellHighlightBorder");
 98
 99  private boolean hasFocus;
100  private Double value;
101
102     public void paintComponent(Graphics g) {
103      super.paintComponent(g);
104
105      if(hasFocus){
106       this.setBorder(focusBorder);
107      }
else{
108       this.setBorder(noFocusBorder);
109      }

110      Dimension size = this.getSize();
111
112      Graphics2D g2 = (Graphics2D) g;
113      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
114         GradientPaint gp = new GradientPaint(00, Color.BLUE, size.width, 0, Color.YELLOW, true);
115         g2.setPaint(gp);
116         g2.fillRect(00, size.width, size.height);
117
118         g2.setColor(Color.GREEN);
119      double r = (size.height - <IMG class=wp-smiley alt=8) src="http://twaver.servasoft.com/wp-includes/images/smilies/icon_cool.gif"> / 2.0;
120      int centerX = (int)(size.width * value.doubleValue());
121      int centerY = (int)r;
122      g2.fill(new Ellipse2D.Double(centerX-r, centerY-r+4, r * 2, r * 2));
123     }

124
125  public Component getTableCellRendererComponent(JTable table, Object value,
126    boolean isSelected, boolean hasFocus, int row, int column) {
127   this.hasFocus = hasFocus;
128   this.value = (Double)value;
129      this.setToolTipText(value + "");
130   return this;
131  }

132 }

133
134 public TableTest3(){
135  super("renderer used by editor");
136  table = new JTable(new TableModel());
137  TableColumn tableColumn = table.getColumnModel().getColumn(1);
138  tableColumn.setCellRenderer(new Renderer());
139  tableColumn.setCellEditor(new Editor(new Renderer()));
140
141        this.getContentPane().setLayout(new BorderLayout());
142        this.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
143        this.setSize(500300);
144        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
145 }

146 public static void main(String[] args) {
147  new TableTest3().show();
148 }

149}

只有注册用户登录后才能发表评论。


网站导航: