JTable中嵌套JButton并加入JButton的事件处理

2024-02-25 18:32

本文主要是介绍JTable中嵌套JButton并加入JButton的事件处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用JTable还是挺麻烦的,特别是当需要嵌套其他的控件时,现在想在button上添加事件每次按钮一点击就会有获取到点击到的行和列,废话不多说,直接进入正题:

原理

要在JTable中嵌套其他的控件需要修改TableColumnModel的渲染器和编辑器,所以只要实现TableCellRenderer和TableCellEditor,然后通过表格获取TableColumnModel,再通过TableColumnModel设置渲染器和编辑器,分别是这两个方法,一个是setCellRenderer()方法,一个是setCellEditor()方法。

代码

TableCellRenderer的实现类MyButtonRender.java:

package test6;import java.awt.Component;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;public class MyButtonRender implements TableCellRenderer{private JButton button;public MyButtonRender() {button = new JButton("确认");}@Overridepublic Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus, int row, int column) {return button;}}

上面的没有什么需要介绍的,重点是下面的编辑器:MyButtonEditor.java:

package test6;import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultCellEditor;
import javax.swing.JTable;
import javax.swing.JTextField;public class MyButtonEditor extends DefaultCellEditor{private MyButton button;private MyEvent event;public MyButtonEditor() {super(new JTextField());button = new MyButton("确认");button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//这里调用自定义的事件处理方法event.invoke(e);}});}public MyButtonEditor(MyEvent e) {this();this.event = e;}/*重写编辑器方法,返回一个按钮给JTable*/@Overridepublic Component getTableCellEditorComponent(JTable table, Object value,boolean isSelected, int row, int column) {
//      setClickCountToStart(1);
//将这个被点击的按钮所在的行和列放进button里面button.setRow(row);button.setColumn(column);return button;}}

在那里面的,我引用了我自定义的MyButton,从JButton继承而来的,里面我方了两个属性,分别记录了每一个按钮的行和列。
MyButton.java:

package test6;import javax.swing.JButton;public class MyButton extends JButton{private int row;private int column;public int getRow() {return row;}public void setRow(int row) {this.row = row;}public int getColumn() {return column;}public void setColumn(int column) {this.column = column;}public MyButton() {}public MyButton(String name) {super(name);}}

在MyButtonEditor中还有一个我自己定义的MyEvent,里面只定义了一个方法,public abstract void invoke(ActionEvent e);这个方法是要在按钮的事件处理方法被调用,接下来是主函数:
Main.java;

package test6;import java.awt.event.ActionEvent;
import javax.swing.JFrame;
import javax.swing.JTable;public class Main {public static void main(String[] args) {JFrame frame = new JFrame("test");JTable table = new JTable(5, 4);//实例化MyEvent,这里的invoke写你自己处理按钮被点击的逻辑MyEvent e = new MyEvent() {@Overridepublic void invoke(ActionEvent e) {MyButton button = (MyButton)e.getSource();//打印被点击的行和列System.out.println("row:" + button.getRow() + "column :" + button.getColumn());}};//设置表格的渲染器table.getColumnModel().getColumn(2).setCellRenderer(new MyButtonRender());MyButtonEditor editor = new MyButtonEditor(e);//设置表格的编辑器table.getColumnModel().getColumn(2).setCellEditor(editor);frame.getContentPane().add(table);frame.setSize(400, 300);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}
}

这里写图片描述

点击之后的运行结果:

row:0column :2
row:0column :2
row:1column :2
row:1column :2
row:2column :2
row:2column :2
row:3column :2
row:3column :2
row:4column :2
row:4column :2
row:4column :2

这篇关于JTable中嵌套JButton并加入JButton的事件处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Window Server2016加入AD域的方法步骤

《WindowServer2016加入AD域的方法步骤》:本文主要介绍WindowServer2016加入AD域的方法步骤,包括配置DNS、检测ping通、更改计算机域、输入账号密码、重启服务... 目录一、 准备条件二、配置ServerB加入ServerA的AD域(test.ly)三、查看加入AD域后的变

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

JavaScript DOM操作与事件处理方法

《JavaScriptDOM操作与事件处理方法》本文通过一系列代码片段,详细介绍了如何使用JavaScript进行DOM操作、事件处理、属性操作、内容操作、尺寸和位置获取,以及实现简单的动画效果,涵... 目录前言1. 类名操作代码片段代码解析2. 属性操作代码片段代码解析3. 内容操作代码片段代码解析4.

SpringBoot嵌套事务详解及失效解决方案

《SpringBoot嵌套事务详解及失效解决方案》在复杂的业务场景中,嵌套事务可以帮助我们更加精细地控制数据的一致性,然而,在SpringBoot中,如果嵌套事务的配置不当,可能会导致事务不生效的问题... 目录什么是嵌套事务?嵌套事务失效的原因核心问题:嵌套事务的解决方案方案一:将嵌套事务方法提取到独立类

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

Cortex-A7:ARM官方推荐的嵌套中断实现机制

0 参考资料 ARM Cortex-A(armV7)编程手册V4.0.pdf ARM体系结构与编程第2版 1 前言 Cortex-M系列内核MCU中断硬件原生支持嵌套中断,开发者不需要为了实现嵌套中断而进行额外的工作。但在Cortex-A7中,硬件原生是不支持嵌套中断的,这从Cortex-A7中断向量表中仅为外部中断设置了一个中断向量可以看出。本文介绍ARM官方推荐使用的嵌套中断实现机

自我提升社团成立啦,欢迎各位同学加入~

欢迎加入 大家好,我是马丁,我们的自我提升社团成立啦,欢迎有新的朋友加入!! 我们的社团主要目标是帮助每个人实现自我成长、自我提升,不论他是什么年龄、什么经验、什么专业,只要有一个好学和想进步的心,都可以加入。 为了提升帮助每个人实现自我成长,目前社团选择的是做一个智能客服系统,我们希望通过搭建一个企业级的智能客服系统来帮助每个人实现自我成长。后续,还会开发更多系统~ 目前群里大多是Jav

多个,多层嵌套module,打aar包

参考https://blog.51cto.com/4259297/1699714 1.在要打包的module中下添加fat-aar.gradle文件。(该文件只能在项目个gradle是2.3.3是才可食用) 2.把项目的gradle修改为2.3.3,但是不打包的gradle依然是以前的。 3.由于打包的的gradle和不打包的是不一样的,所以需要在修改gradle的文件中的添加判断标志

Android studio jar包多层嵌套,Add library '__local_aars__:...@jar' to classpath问题

在添加jar包,早app下的build.gradle中的 implementation files('libs/jar包的名字.jar') 修改为 api files('libs/jar包的名字.jar') implementation 单层引用,只引用当前jar包层, api 多层引用,应用当前jar包层,已经jar包引用的jar包层

Android触摸事件处理机制之requestDisallowInterceptTouchEvent

一、触摸事件传递的规则 当手指触摸到屏幕时,系统就会调用相应的View的onTouchEvent,并传入一系列的action。当有多个层级的View时,在父层级允许的情况下,这个action会一直向下传递直到遇到最深层的View。所以touch事件最先调用的是最底层View的onTouchEvent,如果View的onTouchEvent接收到某个touchaction并做了相应处理,最后有两种