- 浏览: 63418 次
- 性别:
- 来自: 四川
最新评论
一、添加按钮显示效果
在JTable中,单元格的数据默认是Label的效果,也没有事件。
如果要为单元格添加一个按钮显示效果的话,那么就需要使用到一个swing的接口:javax.swing.table.TableCellRenderer,来改变单元桥格的默认默认渲染方法(DefaultTableCellRenderer),
实现的自定义的渲染器如下:
package org.sky.table.render; import java.awt.Component; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.table.TableCellRenderer; public class MyButtonRender implements TableCellRenderer { private JPanel panel; private JButton button; public MyButtonRender() { this.initButton(); this.initPanel(); // 添加按钮。 this.panel.add(this.button); } private void initButton() { this.button = new JButton(); // 设置按钮的大小及位置。 this.button.setBounds(0, 0, 50, 15); // 在渲染器里边添加按钮的事件是不会触发的 // this.button.addActionListener(new ActionListener() // { // // public void actionPerformed(ActionEvent e) // { // // TODO Auto-generated method stub // } // }); } private void initPanel() { this.panel = new JPanel(); // panel使用绝对定位,这样button就不会充满整个单元格。 this.panel.setLayout(null); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { // 只为按钮赋值即可。也可以作其它操作,如绘背景等。 this.button.setText(value == null ? "" : String.valueOf(value)); return this.panel; } }
修改表格的渲染器:this.table.getColumnModel().getColumn(2).setCellRenderer(new MyButtonRender());//只有获取到表格的列后才能添加渲染器。
二、添加事件
通过第一部已经为表格添加了默认的渲染器,但是还无法触发事件,触发事件是没有反应的,因为在点击表格时,会触发表格的编辑事件,而要想触发渲染的按钮的事件,还需要通过修改表格的默认编辑器来实现:
package org.sky.table.editor; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.DefaultCellEditor; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.JTextField; /** * 自定义一个往列里边添加按钮的单元格编辑器。最好继承DefaultCellEditor,不然要实现的方法就太多了。 * */ public class MyButtonEditor extends DefaultCellEditor { /** * serialVersionUID */ private static final long serialVersionUID = -6546334664166791132L; private JPanel panel; private JButton button; public MyButtonEditor() { // DefautlCellEditor有此构造器,需要传入一个,但这个不会使用到,直接new一个即可。 super(new JTextField()); // 设置点击几次激活编辑。 this.setClickCountToStart(1); this.initButton(); this.initPanel(); // 添加按钮。 this.panel.add(this.button); } private void initButton() { this.button = new JButton(); // 设置按钮的大小及位置。 this.button.setBounds(0, 0, 50, 15); // 为按钮添加事件。这里只能添加ActionListner事件,Mouse事件无效。 this.button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // 触发取消编辑的事件,不会调用tableModel的setValue方法。 MyButtonEditor.this.fireEditingCanceled(); // 这里可以做其它操作。 // 可以将table传入,通过getSelectedRow,getSelectColumn方法获取到当前选择的行和列及其它操作等。 } }); } private void initPanel() { this.panel = new JPanel(); // panel使用绝对定位,这样button就不会充满整个单元格。 this.panel.setLayout(null); } /** * 这里重写父类的编辑方法,返回一个JPanel对象即可(也可以直接返回一个Button对象,但是那样会填充满整个单元格) */ @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { // 只为按钮赋值即可。也可以作其它操作。 this.button.setText(value == null ? "" : String.valueOf(value)); return this.panel; } /** * 重写编辑单元格时获取的值。如果不重写,这里可能会为按钮设置错误的值。 */ @Override public Object getCellEditorValue() { return this.button.getText(); } }
修改表格的默认编辑器:
this.table.getColumnModel().getColumn(2).setCellEditor(new MyButtonEditor());
这样后就能基本达到效果了。但是还要注意,对列2来说,还需要启用可编辑功能,才行,不然仍然触发不了事件的。
代码片段:
@Override public boolean isCellEditable(int row, int column) { // 带有按钮列的功能这里必须要返回true不然按钮点击时不会触发编辑效果,也就不会触发事件。 if (column == 2) { return true; } else { return false; } }
三、测试代码:
测试代码的界面是由windowbuilder插件生成的,懒得自己去写干净的代码了,所以下边的代码有点冗余,大家看表格下边的那段代码即可:
package org.sky.table.frame; import java.awt.EventQueue; public class TestTable { private JFrame frame; private JTable table; /** * Launch the application. */ 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(); } } }); } /** * Create the application. */ public TestTable() { this.initialize(); } /** * Initialize the contents of the frame. */ private void initialize() { this.frame = new JFrame(); this.frame.setBounds(100, 100, 450, 300); this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.frame.getContentPane().setLayout(null); JPanel panel = new JPanel(); panel.setBounds(10, 10, 414, 242); this.frame.getContentPane().add(panel); panel.setLayout(null); JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(10, 10, 394, 222); panel.add(scrollPane); this.table = new JTable(); scrollPane.setViewportView(this.table); this.table.setModel(new DefaultTableModel() { @Override public Object getValueAt(int row, int column) { return (row + 1) * (column + 1); } @Override public int getRowCount() { return 3; } @Override public int getColumnCount() { return 3; } @Override public void setValueAt(Object aValue, int row, int column) { System.out.println(aValue + " setValueAt"); } @Override public boolean isCellEditable(int row, int column) { // 带有按钮列的功能这里必须要返回true不然按钮点击时不会触发编辑效果,也就不会触发事件。 if (column == 2) { return true; } else { return false; } } }); this.table.getColumnModel().getColumn(2).setCellEditor(new MyButtonEditor()); this.table.getColumnModel().getColumn(2).setCellRenderer(new MyButtonRender()); this.table.setRowSelectionAllowed(false);// 禁止表格的选择功能。不然在点击按钮时表格的整行都会被选中。也可以通过其它方式来实现。 } }
发表评论
-
struts2 中获取 web资源的方式
2016-01-08 17:02 533在struts2中获取 web资源的方式大致可分为获取扩展 ... -
sql server、db2、oracle 存储过程动态sql语句示例
2015-01-31 19:00 1839Oracle CREATE OR REPLACE PRO ... -
ie9 中出现不明的异常(参数是必选项 (Argument not optional)、尚未实现)等
2015-01-27 23:57 1311<script type="text/jav ... -
SAXParseException: The content of element type "configuration" must match
2014-09-15 23:57 1967在mybatis的配置文件中新增加<databaseI ... -
java.lang.ClassNotFoundException: Cannot find class: DB_VENDOR
2014-09-15 23:45 2007在mybatis 中使用databaseIdProvide ... -
spring mvc3 + fastjson 转换 REST 参数以及输出
2014-03-27 00:16 4253spring 3可以支持Rest风格参数,其内置了jack ... -
eclipse中编辑log4j 的xml配置文件时,自动提示
2014-03-27 00:05 894方法1. 配置log4j.dtd文件: Windows - ... -
java json 转换之 Jackson 框架
2013-08-01 21:50 1169转自:http://www.cnblogs.com/hooj ... -
eclipse/myeclise 自定义注释中的变量名称
2013-07-01 23:18 972eclipse/myeclipse中自带了 ... -
Eclipse Class Decompiler——Java反编译插件
2012-11-08 22:41 1241Eclipse Class Decompiler,整 ... -
struts+spring+hibernate整合问题解决方法 陆续更新中....
2009-01-01 10:33 882在整合ssh过程中出现的问题和解决方法: 一、 严重: Ser ... -
DWR通过Annotation与spring整合
2009-01-21 22:05 668DWR 2.0 增加了一个很有趣的新特性,Annotat ... -
div嵌套页面 div加载页面 (其中获取目标页面的内容是用dwr框架连接java程序做的)
2009-03-15 16:58 659前段时间因为有需要,要在div中加载一个页面。但是以前没做过, ... -
tapestry autocomplete 更改样式及定位
2009-07-09 19:02 721版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文 ... -
Java中的main()方法详解
2009-07-12 16:23 652源文作者:leizhimin 源文链接:http:/ ... -
tapestry5 集成 spring 的事务管理
2009-07-22 15:43 599说明:使用的是tapestry5.1.0.5 和spring ... -
tapestry5 布局 参数的处理
2009-07-23 17:24 431<?xml version="1.0" ... -
tapestry不支持 等html特殊符号的解决方法
2009-07-23 17:34 544在使用tapestry时,偶然发现使用 &a ... -
WebService大讲堂之Axis2(1):用POJO实现0配置的WebService
2009-07-28 15:01 430转自:http://space.itpub.net ... -
WebService大讲堂之Axis2(2):复合类型数据的传递
2009-07-28 15:25 519转自:http://space.itpub.net/12921 ...
相关推荐
Java Swing 实现 JTable 检测单元格数据变更事件的方法示例 Java Swing 中的 JTable 是一个功能强大且灵活的表格组件,广泛应用于各种桌面应用程序中。然而,在实际开发中,我们经常需要检测单元格数据的变更事件...
用改写 DefaultCellEditor 和 TableCellRenderer的方法实现,主要代码: table.getColumnModel().getColumn(2).setCellEditor(new MyButtonEditor()); table.getColumnModel().getColumn(2).setCellRenderer...
3. **监听单元格变化**:可以添加`TableCellListener`或`CellEditorListener`来监听单元格的编辑事件,以便在单元格值改变时执行特定操作。 4. **单元格格式化**:使用`DefaultTableCellRenderer`可以定制单元格的...
- 确保在添加按钮时考虑到单元格的大小,可能需要自定义单元格的宽度和高度。 - 考虑到性能问题,避免在`getTableCellRendererComponent`方法中进行耗时的操作,因为此方法会被频繁调用。 - 如果单元格需要可编辑...
将`JButton`添加到`JTable`中可以为用户提供更丰富的交互体验,例如编辑、删除或自定义操作。本文将详细讲解如何在`JTable`中添加`JButton`控件,并探讨其可能的拓展应用。 首先,我们需要理解`JTable`的基本结构。...
创建一个类,继承自`DefaultTableCellRenderer`,并在其中添加按钮。例如: ```java public class ButtonCellRenderer extends DefaultTableCellRenderer { private JPanel panel; private JButton[] buttons; ...
添加组件后,在组件上添加图片 1.设置Table的Model这个需要重写AbstractTableModel类, 2.设置Table的DefaultRenderer,这个根据个人需要选择将要添加到Table的cell里的 组件(JButton,JLable...)继承相应的组件...
JTable中加入复选框的两种方法 在Java中,JTable是一个常用的表格控件,用于显示和编辑表格...通过使用CheckBoxRenderer类和CheckButtonEditor类,我们可以轻松地将复选框添加到JTable中,并实现复杂的表格编辑功能。
使用 AbstractTableModel 构建Table 在表格中添加JButton按钮,之前在网上找了2天没有找到好用的程序,最终终于找到一个好用的例子。 不要使,我退你们分。。 sing the Swing JTable class can quickly become a ...
为了使`JTable`更具交互性,开发者还可以使用`MouseListener`和`KeyBindings`来处理用户的鼠标点击和键盘输入事件。`ActionListener`则可以用来处理表格中的按钮或菜单项的点击事件。 总的来说,这个"JTable 练习...
JTable不仅可以显示数据,还允许用户与数据进行交互,如编辑、排序和选择。在Java编程中,掌握JTable的使用对于创建功能丰富的图形化界面至关重要。 1. **JTable的基本结构** JTable由`DefaultTableModel`驱动,它...
`TableModel`负责存储和管理表格数据,并为`JTable`提供数据访问接口。要实现数据查询,你需要根据查询条件过滤`TableModel`中的数据。这可以通过实现`TableModel`的`getRowCount()`和`getValueAt(int row, int ...
它提供了添加行、列和单元格数据的方法,非常适合用于需要频繁更新数据的应用场景。 ##### 3. JScrollPane `JScrollPane`是一个可以滚动的面板,当表格内容较多时,使用`JScrollPane`可以实现滚动浏览的功能,避免...
除了基本操作,你可能还需要实现事件监听器,如MouseListener或KeyListener,以便响应用户的交互操作,例如点击“添加”、“删除”或“保存”按钮。同时,为了保持数据的一致性,事务管理是必要的,尤其是在进行多条...
通常,你需要先为特定列设置一个自定义的渲染器,然后在渲染器中指定单元格的对齐方式,使得多个单元格的边界重叠,从而达到合并的效果。 接下来,我们关注一下提供的文档资源。`Swing之JTable详解.doc`可能包含了`...
在`tabletest` 类中,你需要为按钮或菜单项添加`ActionListener`,当用户点击这些元素时,执行相应的操作,如添加新学生信息到表格和数据库,或者从表格和数据库中删除选中学生的信息。 通过以上步骤,你可以在...
有时,我们可能需要在JTable的某一列中添加自定义的按钮,以便为用户提供更多的交互功能。本篇将详细介绍如何在JTable列中自定义Button,并提供一个实际的示例代码。 首先,我们需要了解JTable的基本结构。JTable由...
Java中的表格事件主要涉及到Swing库中的JTable组件和相关的事件监听器。JTable是Java GUI应用程序中用于显示和操作二维表格数据的重要组件。在Java的GUI编程中,表格事件通常包括用户对表格进行的各种交互操作,如...
初始化了窗口、面板以及三个按钮,并分别为每个按钮设置了监听器,用于执行不同的功能:添加数据、删除数据、保存数据。 ##### 4. 设置表格模型 ```java model = new Table_Model(20); table = new JTable(model...
`TableCellRenderer` 和 `TableColumn` 可能用于自定义单元格的显示方式和列的宽度。`ActionPerformed` 方法处理用户触发的事件,比如点击按钮来执行添加或删除操作。 在实际应用中,`JTable`通常结合`JDBC`用于...