Jtable 添加Jbutton

2024-06-07 00:58
文章标签 jbutton jtable

本文主要是介绍Jtable 添加Jbutton,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

花痴痴的网站 | 女程序员园地

分享互联网技术&产品知识,还有一个工科女硕士的生活。

java中JTable 为单元格添加按钮显示效果和按钮响应事件

有时候我们需要在JTable中嵌入JButton,使得点击某个JTable单元格时,用户感觉通过JButton触发了响应事件。下面我们看看为JTable单元格添加按钮效果和响应事件的方法。以下示例实现的效果为:点击jtable中的button,button上的数字自动加1,并将加1后得到的数字正确显示在button上。

一、添加按钮显示效果

JTable中,单元格的数据显示默认是JTable的效果。如果我们想要按钮显示的效果的话,需要实现swing接口:javax.swing.table.TableCellRenderer,来改变单元格默认的渲染方法。

自定义渲染器如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package  TableButton ;

import  java.awt.BorderLayout ;
import  java.awt.Component ;

import  javax.swing.JButton ;
import  javax.swing.JPanel ;
import  javax.swing.JTable ;
import  javax.swing.table.TableCellRenderer ;

public  class MyButtonRenderer  implements  TableCellRenderer  {
     private  JPanel panel ;

     private  JButton button ;
    
     private  int num ;

     public MyButtonRenderer ( )  {
        initButton ( ) ;

        initPanel ( ) ;

        panel. add (button,  BorderLayout. CENTER ) ;
     }

     private  void initButton ( )  {
        button  =  new  JButton ( ) ;

     }

     private  void initPanel ( )  {
        panel  =  new  JPanel ( ) ;

        panel. setLayout ( new  BorderLayout ( ) ) ;
     }

     public  Component getTableCellRendererComponent ( JTable table,  Object value,
             boolean isSelected,  boolean hasFocus,  int row,  int column )  {
        num  =  ( Integer ) value ;
        
        button. setText (value  ==  null  ?  ""  :  String. valueOf (value ) ) ;

         return panel ;
     }

}

二、添加按钮响应事件

第1步中我们为表格添加了渲染器,但是渲染器只负责显示效果,要想点击”按钮“之后有响应,还得跟单元格的编辑器有关。点击表格是会触发表格的编辑时间,所以我们按钮的响应事件可以写在编辑器中,我们需要修改表格的默认编辑器实现。

swing中有个类javax.swing.DefaultCellEditor提供对单元格内插入JTextField/JComboBox/JCheckbox这3种控件,但是不提供对JButton的支持(1.7里不支持,不代表以后不会支持),所以我们得用到另外一个类自己写TableCellEditor,这个类是avax.swing.AbstractCellEditor。是不是类名弄晕了?我也是。。。

自定义编辑器如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package  TableButton ;

import  java.awt.BorderLayout ;
import  java.awt.Component ;
import  java.awt.event.ActionEvent ;
import  java.awt.event.ActionListener ;

import  javax.swing.AbstractCellEditor ;
import  javax.swing.JButton ;
import  javax.swing.JOptionPane ;
import  javax.swing.JPanel ;
import  javax.swing.JTable ;
import  javax.swing.table.TableCellEditor ;

public  class MyButtonEditor  extends  AbstractCellEditor  implements
         TableCellEditor  {

     /**
     * serialVersionUID
     */

     private  static  final  long serialVersionUID  =  -6546334664166791132L ;

     private  JPanel panel ;

     private  JButton button ;

     private  int num ;

     public MyButtonEditor ( )  {

        initButton ( ) ;

        initPanel ( ) ;

        panel. add ( this. buttonBorderLayout. CENTER ) ;
     }

     private  void initButton ( )  {
        button  =  new  JButton ( ) ;

        button. addActionListener ( new  ActionListener ( )  {
             public  void actionPerformed ( ActionEvent e )  {
                 int res  =  JOptionPane. showConfirmDialog ( null,
                         "Do you want to add 1 to it?""choose one",
                         JOptionPane. YES_NO_OPTION ) ;
                
                 if (res  ==   JOptionPane. YES_OPTION ) {
                    num ++;
                 }
                 //stopped!!!!
                fireEditingStopped ( ) ;

             }
         } ) ;

     }

     private  void initPanel ( )  {
        panel  =  new  JPanel ( ) ;

        panel. setLayout ( new  BorderLayout ( ) ) ;
     }

    @Override
     public  Component getTableCellEditorComponent ( JTable table,  Object value,
             boolean isSelected,  int row,  int column )  {
        num  =  ( Integer ) value ;
        
        button. setText (value  ==  null  ?  ""  :  String. valueOf (value ) ) ;

         return panel ;
     }

    @Override
     public  Object getCellEditorValue ( )  {
         return num ;
     }

}

需要注意的是得重写TableModel的isCellEditable方法,因为只有为重写Editor的列开启了可编辑功能,单元格才能被编辑,也就才能出发按钮单击事件。在下一段代码中有体现。
另外要注意得禁止掉JTable的行选中功能。否则我们再点击按钮时,JTable不知道是响应为”行选中“还是”按钮单击事件“。

三、测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package  TableButton ;

import  java.awt.Color ;
import  java.awt.EventQueue ;

import  javax.swing.JFrame ;
import  javax.swing.JPanel ;
import  javax.swing.JScrollPane ;
import  javax.swing.JTable ;
import  javax.swing.table.DefaultTableModel ;

public  class TestTable  {

     private  JFrame frame ;
     private  JTable table ;
    
     private  Object [ ] [ ] data  =  {
             { 123 },
             { 456 },
             { 789 } } ;

     public  static  void main ( String [ ] args )  {
         EventQueue. invokeLater ( new  Runnable ( )  {
             public  void run ( )  {
                 try  {
                    TestTable window  =  new TestTable ( ) ;
                    window. frame. setVisible ( true ) ;
                 }  catch  ( Exception e )  {
                    e. printStackTrace ( ) ;
                 }
             }
         } ) ;
     }


     public TestTable ( )  {
        frame  =  new  JFrame ( ) ;
        frame. setBounds ( 100100450300 ) ;
        frame. setDefaultCloseOperation ( JFrame. EXIT_ON_CLOSE ) ;
        frame. getContentPane ( ). setLayout ( null ) ;

         JPanel panel  =  new  JPanel ( ) ;
        panel. setBounds ( 1010414242 ) ;
        frame. getContentPane ( ). add (panel ) ;
        panel. setLayout ( null ) ;

         JScrollPane scrollPane  =  new  JScrollPane ( ) ;
        scrollPane. setBounds ( 1010394222 ) ;
        panel. add (scrollPane ) ;

        table  =  new  JTable ( ) ;
        scrollPane. setViewportView (table ) ;

        table. setModel ( new  DefaultTableModel ( )  {
            @Override
             public  Object getValueAt ( int row,  int column )  {
                 return data [row ] [column ] ;
             }

            @Override
             public  int getRowCount ( )  {
                 return  3 ;
             }

            @Override
             public  int getColumnCount ( )  {
                 return  3 ;
             }
            @Override
             public  void setValueAt ( Object aValue,  int row,  int column ) {
                data [row ] [column ]  = aValue ;
                fireTableCellUpdated (row, column ) ;
             }
            
            @Override
             public  boolean isCellEditable ( int row,  int column )  {
                 if  (column  ==  2 )  {
                     return  true ;
                 }  else  {
                     return  false ;
                 }
             }
         } ) ;

        table. getColumnModel ( ). getColumn ( 2 ). setCellEditor (
                 new MyButtonEditor ( ) ) ;

        table. getColumnModel ( ). getColumn ( 2 ). setCellRenderer (
                 new MyButtonRenderer ( ) ) ;

        table. setRowSelectionAllowed ( false ) ;
     }
}

效果图:
jtable中显示按钮且能够响应
四、总结

这个部分真的很复杂很容易出错,可能一个不经意的误用就达不到理想效果。建议使用者对着示例代码好好看好好比对。

五、参考文章

From Java Tutorials:How to User Table
From CSDN:JTable 为单元格添加按钮效果和事件效果

想第一时间看到本站更新?请订阅RSS:花痴痴的网站 | 女程序员园地

原创文章,转载请注明: 转载自花痴痴的网站 | 女程序员园地

本文链接地址: java中JTable 为单元格添加按钮显示效果和按钮响应事件

Tagged on:  jtable添加按钮



http://huachichi.info/2013/05/17/add-button-to-jtable-cell/

这篇关于Jtable 添加Jbutton的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1037736

相关文章

坑爹的JTable.getSelectedRows()

还是在搞课程设计,今天遇到一个很蛋疼的问题,我想实现同时删除JTable上的多条数据,于是写了如下代码 int[] selRow = jTable.getSelectedRows(); //jTable是我的表格 for (int i=0;i<selRow.length;i++){ tm.removeRow(selRow[i]); //tm是我的TableModel; } 然后一

Java swing JTable 示例

代码, import java.awt.Container;import javax.swing.JFrame;import javax.swing.JScrollPane;import javax.swing.JTable;public class Mylmlk{public static void main(String[] agrs){JFrame frame=new JFrame

java Swing之JTabbedPane用法实例 JTable用法实例

一款用JTabbedPane选项卡实现的实例,其功能领域有:笑话、新闻、星座运势、成语、解梦。询问不同领域的问题,自动切换至对应的选项卡来输出答案。用到的技术主要有:javax.swing.JFrame,javax.swing.JTabbedPane,javax.swing.JScrollPane,javax.swing.GroupLayout,javax.swing.JTable,Jsoup。

JAVA SWING编程技术应用:JTABLE表格案例分享

Java Swing编程技术应用:JTable表格案例分享       表格是GUI编程中使用较多,但也是最麻烦的一个控件之一。表格是用来显示二维数据,提供编辑,选择等功能。如果只是显示水泵数据,这还是非常easy的,只要在JTable中传入二维数组或集合就可以了 public class SimpleTable  {      JFrame jf = new JFrame("简

Java读取excel表格添加到Jtable中

1,本文在查看了网上一些猿友的代码!本猿用了30分钟终于调试出来了一个可以运行的程序,程序写的比价粗糙 import javax.swing.*; import java.awt.*; import javax.swing.table.DefaultTableModel; import java.io.File; import jxl.Cell; import jxl.Sheet; im

如何将jTABLE的数据写入EXCEL中

2008-07-27 19:31:59|  分类: JAVA|举报|字号 订阅 package com.jiandian.zhuangwaiyun.db.dao; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import

创建并置表,第 1 部分: 使用 Flex 创建 JTable

基于 Adobe® Flex 的并置表(juxtaposition table)是一个二维可视化辅助工具,可用于排列、分类和比较大量数据。使用并置表可以在一个方便紧凑的视图中定义自己的透视图。本文演示如何动态地创建表的列和修改表的内容。此外,您还将了解到如何在一个单元格中显示多个项,以及如何改变单元格的形状和颜色。 查看本系列更多内容 | 0 评论: Sophia Kra

Jtable加入jpanel

代码一: package bt;import java.awt.*;import java.awt.event.*;import java.util.EventObject;import javax.swing.*;import javax.swing.table.*;public class bt1 {private JFrame frame;private JTable Comp

关于jTable

先看代码 Object rows[][] = { { "王明", "中国", 44 }, { "姚明", "中国", 25 },{ "赵子龙", "西蜀", 1234 }, { "曹操", "北魏", 2112 },{ "Bill Gates", "美国", 45 }, { "Mike", "英国", 33 },{ "姚明", "中国", 25 }, { "赵子龙", "西蜀", 1234

jbutton 按钮 圆角 渐变色

效果图 没按压时背景渐变色 鼠标按压时背景色改变 下面是可用的源码 package com.beijin.robot.utils;import javax.swing.*;import javax.swing.border.Border;import java.awt.*;import java.awt.event.MouseAdapter;import java.awt.ev