上文实现了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();
 }
}

转载于:https://www.cnblogs.com/gwq369/p/5363206.html

TableCellRenderer TableCellEditor(三)相关推荐

  1. 用Java写一个PC端的WIFI-ADB管理软件

    废话 一直在用android studio做android开发,偶然一次机会接触到了wifi adb,试了好几个支持android studio的插件,各有优缺点,有一个本来用着好好的,突然就用不了, ...

  2. TableCellRenderer和TableCellEditor(一)

     转载:http://blog.sina.com.cn/s/blog_661a3fce0100mske.html 最近不少朋友问我TableCellRenderer和TableCellEditor的用 ...

  3. Java程序设计——Swing UI 高级组件(三)

    目录 Timer:计时器 JFileChooser:文件选择器 JColorChooser:颜色选择器 BorderFactory:边框 JTable:表格 JOptionPane:标准对话框 JTr ...

  4. 伍六七带你学算法 进阶篇-三数之和

    三数之和 难度-中等 题目:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意 ...

  5. 远程控制virtual box虚拟机系统的三种方式

    远程控制virtual box虚拟机系统的三种方式[阅读时间:5分钟] 1.使用现有的远程控制软件 2.使用SSH连接 3.使用远程桌面控制虚拟机系统 对于把虚拟机安装在寝室笔记本的人来说,能够远程控 ...

  6. 2022-2028年中国三轴陀螺仪行业市场深度分析及投资前景分析报告

    [报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了三轴陀螺仪行业相关概述.中国三轴陀螺仪行业运行环境.分析了中国三轴陀 ...

  7. TCP三次握手和四次挥手的解释

    基础知识 在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG. 其中,对于我们日常的分析有用的就是前面的五个字段. 它们的含义是: SYN ...

  8. python实现简单的用户密码登录控制(输入三次就锁定用户)

    问题描述 我们经常在登录一些网站的时候,发现我们如果连续的输错好几次密码,我们的帐号就被锁定起来了,那这个过程是如何实现的呢?本程序主要就是解决以下3件事情 1.输入用户名密码 2.认证成功并显示欢迎 ...

  9. 难忘的一天——装操作系统(三)

    谈我此次装机的曲折过程,本来我是打算win7,win8.1,win10这三个系统都装个遍,这样多装几次差不多就会了.刚开始装win7.我就卡壳了. 开始装了,进入了老毛桃的界面,浏览文件选中自己优盘里 ...

最新文章

  1. html word-wrap,CSS3 Word-wrap
  2. UseCase事件描述叙事流规范
  3. layui中onchange失效以及form动态渲染失效的问题
  4. 入门启发:音视频的简单理解
  5. 【完整可运行源码+GIF动画演示】十大经典排序算法系列——冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序
  6. 2021牛客暑期多校训练营1 J-Journey among Railway Stations(线段树+思维转化)
  7. Map 3D中通过程序删除图层及数据源
  8. java知识总结-13
  9. webpack 分离css html,【已解决】ReactJS中Webpack打包时分离css
  10. 小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_5、SpringBoot2.x的依赖默认Maven版本...
  11. python的类变量和成员变量用法_python中类变量和成员变量、局部变量总结
  12. Social Network Visualizer社交网络可视化,导入txt数据集
  13. 浙江新华书店的数字化新尝试
  14. Chromium OS?本土化气息的的Flint OS
  15. HTML语言中表格怎么弄,html语言中table表格内怎么换行
  16. 对称加密算法 Blowfish 和 Twofish
  17. 人类的智能是如何产生的
  18. 中国银行基金代销一览表
  19. Qt之Q_OBJECT
  20. 这就是iPhone 6的屏幕?

热门文章

  1. Affinity Photo中文版
  2. 【MYSQL】分组之后获取每组最新的数据
  3. python学习笔记--easy_install和pip
  4. 《Linux内核分析》实践4
  5. Git子模块引用外部项目
  6. [Linux][Hadoop] 将hadoop跑起来
  7. 最新的 PageValidate 类
  8. Android P FAQ第一弹:非SDK管控特性
  9. Vim命令之查找和替换
  10. Centos 7 修改内核启动顺序