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/
  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要向 JTable 添加按钮,你需要创建一个自定义的 TableCellRenderer 和 TableCellEditor,以便显示和编辑该单元格的按钮。 以下是一个简单的例子,演示如何将按钮添加JTable 中: ```java 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.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; public class ButtonRendererEditorExample { public static void main(String[] args) { JFrame frame = new JFrame("JTable with Buttons"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Object[][] data = { {"Button 1", new JButton("Click 1")}, {"Button 2", new JButton("Click 2")}, {"Button 3", new JButton("Click 3")}, {"Button 4", new JButton("Click 4")} }; String[] columnNames = {"Button Name", "Button"}; JTable table = new JTable(data, columnNames); table.getColumn("Button").setCellRenderer(new ButtonRenderer()); table.getColumn("Button").setCellEditor(new ButtonEditor(new JButton())); JScrollPane scrollPane = new JScrollPane(table); frame.add(scrollPane); frame.pack(); frame.setVisible(true); } static class ButtonRenderer extends JButton implements TableCellRenderer { public ButtonRenderer() { setOpaque(true); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { setText((value == null) ? "" : value.toString()); return this; } } static class ButtonEditor extends AbstractCellEditor implements TableCellEditor, ActionListener { private JButton button; public ButtonEditor(JButton button) { this.button = button; this.button.addActionListener(this); } public Object getCellEditorValue() { return button.getText(); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { return button; } public void actionPerformed(ActionEvent e) { fireEditingStopped(); } } } ``` 在此示例中,我们将一个 JTable 填充了四个带有不同标签的 JButton 对象。我们使用自定义的 ButtonRenderer 类为 JTable 中的按钮单元格提供渲染,以便它们可以正确显示。我们使用自定义的 ButtonEditor 类作为单元格编辑器,以便用户可以在单元格上单击按钮。当用户单击按钮时,我们会触发 fireEditingStopped() 方法,以便通知 JTable 编辑已完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值