zoukankan      html  css  js  c++  java
  • TableCellRenderer & TableCellEditor(三)

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


    import java.awt.*;
    import java.awt.geom.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.border.*;
    import javax.swing.table.*;
    public class TableTest3 extends JFrame {
     JTable table;
     Double[] values = new Double[]{new Double(0.1), new Double(0.3), new Double(0.8)};
     
     // model
     class TableModel extends AbstractTableModel{
      public int getColumnCount() {
       return 2;
      }
      public int getRowCount() {
       return values.length;
      }
      public Object getValueAt(int rowIndex, int columnIndex) {
       return values[rowIndex];
      }
      public void setValueAt(Object value, int rowIndex, int columnIndex) {
       values[rowIndex] = (Double)value;
       this.fireTableCellUpdated(rowIndex, 0);
      }
         public String getColumnName(int columnIndex) {
       if(columnIndex == 0){
        return "plain";
       }else{
        return "beauty";
       }
         }
         public boolean isCellEditable(int rowIndex, int columnIndex) {
       if(columnIndex == 0){
        return false;
       }else{
        return true;
       }
         }
     }
     
     // cell editor
     class Editor extends AbstractCellEditor implements TableCellEditor, ActionListener {
      JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 100, 50);
      TableCellRenderer renderer;
      JButton actionButton;
      
         Object value;
         JTable table;
         int row;
         int column;
        
         JPanel panel = new JPanel(new BorderLayout());
        
         public Editor(TableCellRenderer renderer){
             this.renderer = renderer;   
             actionButton = new JButton(new ImageIcon(TableTest3.class.getResource("dotdotdot.gif")));
             actionButton.addActionListener(this);
             actionButton.setFocusable(false);
             actionButton.setFocusPainted(false);
             actionButton.setMargin(new Insets(0, 0, 0, 0));         
             panel.add(actionButton, BorderLayout.EAST);
         }
     
         public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column){
          this.value = value;
             this.table = table;
             this.row = row;
             this.column = column;
             panel.add(renderer.getTableCellRendererComponent(table, value, true, isSelected, row, column));
             return panel;
         }
     
         public Object getCellEditorValue(){
             return value;
         }
      public void actionPerformed(ActionEvent e) {
             int intValue = (int)(((Number)value).doubleValue() * 100);
             slider.setValue(intValue);
             
             int result = JOptionPane.showOptionDialog(TableTest3.this,
                     slider, "change value",
                     JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, null, null);
            
             if(result==JOptionPane.OK_OPTION) {
              this.value = new Double(slider.getValue()/100.0);
                 this.fireEditingStopped();
             }else{
              this.fireEditingCanceled();
             }
      }
     }
     
     // cell render
     class Renderer extends JComponent implements TableCellRenderer{  
      Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);
      Border focusBorder = UIManager.getBorder("Table.focusCellHighlightBorder");
      
      private boolean hasFocus;
      private Double value;
      
         public void paintComponent(Graphics g) {
          super.paintComponent(g);
          
          if(hasFocus){
           this.setBorder(focusBorder);
          }else{
           this.setBorder(noFocusBorder);
          }
          Dimension size = this.getSize();
          
          Graphics2D g2 = (Graphics2D) g;
          g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
             GradientPaint gp = new GradientPaint(0, 0, Color.BLUE, size.width, 0, Color.YELLOW, true);
             g2.setPaint(gp);
             g2.fillRect(0, 0, size.width, size.height);
          
             g2.setColor(Color.GREEN);
          double r = (size.height - 8) / 2.0;
          int centerX = (int)(size.width * value.doubleValue());
          int centerY = (int)r;
          g2.fill(new Ellipse2D.Double(centerX-r, centerY-r+4, r * 2, r * 2));
         }
        
      public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column) {
       this.hasFocus = hasFocus;
       this.value = (Double)value;
          this.setToolTipText(value + "");
       return this;
      }
     }
     
     public TableTest3(){
      super("renderer used by editor");
      table = new JTable(new TableModel());
      TableColumn tableColumn = table.getColumnModel().getColumn(1);
      tableColumn.setCellRenderer(new Renderer());
      tableColumn.setCellEditor(new Editor(new Renderer()));
      
            this.getContentPane().setLayout(new BorderLayout());
            this.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
            this.setSize(500, 300);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     }
     public static void main(String[] args) {
      new TableTest3().show();
     }
    }


  • 相关阅读:
    Oracle中有大量的sniped会话
    Error 1130: Host '127.0.0.1' is not allowed to connect to this MySQL server
    汉字转换为拼音以及缩写(javascript)
    高效率随机删除数据(不重复)
    vs2010 舒服背景 优雅字体 配置
    mvc中的ViewData用到webfrom中去
    jquery ajax return值 没有返回 的解决方法
    zShowBox (图片放大展示jquery版 兼容性好)
    动感效果的TAB选项卡 jquery 插件
    loading 加载提示······
  • 原文地址:https://www.cnblogs.com/gwq369/p/5363206.html
Copyright © 2011-2022 走看看