JTable 失去焦点时取消编辑状态

为什么80%的码农都做不了架构师?>>>   hot3.png

reference: http://tips4java.wordpress.com/2008/12/12/table-stop-editing/

当JTable的单元格处于编辑状态时,如果用户触发以下事件,表格就会退出编辑状态,进而调用TableModel的

public void setValueAt(Object aValue, int row, int column)

1. 回车确认

2. 使用方向键或tab移动到别的单元格

3. 鼠标点击别的单元格

但是,如果用户点击了表格之外的控件,表格中单元格还是处于编辑状态,此时如果点击的是“保存”按钮,由于单元格并没有接受用户的输入,导致当前编辑的单元格的值为null,用户输入的数据没有保存。

同时,由于表格中的所有单元格是共用一个CellEditor,当用户新建一行时,通常会让光标移动到新建的行的某一个单元格,此时原来正在编辑的单元格就会替换到新增加的行中,而之前单元格的输入的内容没有保存。

因此,在触发其他操作之前,最好能够取消表格正在编辑的状态。

方法1.

JTable table = new JTable(...);
table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);

当其他控件获取焦点后,表格会停止编辑,但是点击最小化时没有效果。

方法2.

if (table.isEditing())
    table.getCellEditor().stopCellEditing();

在需要取消表格编辑状态的按钮等控件的事件响应中根据具体情况来取消表格的编辑状态。

原文说点击表格的表头,使用第一种方法,表格不会退出编辑状态,但是经测试也是会退出编辑状态的。

表格Model简单继承DefaultTableModel

package com.aquar.table;import com.aquar.data.Movie;import javax.swing.table.DefaultTableModel;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Vector;/*** Created with IntelliJ IDEA.* User: Edison* Date: 13-8-16* Time: 下午10:46* A table model for movies.*/
public class TableModelMovie extends DefaultTableModel {private static final int COL_NAME = 0;private static final int COL_PREMIERE = COL_NAME + 1;private static final int COL_DIRCTOR = COL_PREMIERE + 1;public TableModelMovie() {init();mockData();}private void init() {columnIdentifiers.add("Name");columnIdentifiers.add("Premiere");columnIdentifiers.add("Director");}/*** make some movies.*/private void mockData() {List<Movie> list = new ArrayList<>();list.add(new Movie("The Shawshank Redemption", new Date(), "Frank Darabont"));list.add(new Movie("The Godfather", new Date(), " Francis Ford Coppola"));list.add(new Movie("Pulp Fiction", new Date(), "Quentin Tarantino"));list.add(new Movie("The Dark Knight", new Date(), "Frank Darabont"));fillTableData(list);}private void fillTableData(List<Movie> movies) {dataVector.clear();for (Movie movie : movies) {Vector rowVector = new Vector();rowVector.add(movie);dataVector.add(rowVector);}fireTableDataChanged();}@Overridepublic Object getValueAt(int row, int column) {Object ret = "";if (row > dataVector.size()) {return ret;}// Get one row data.Vector rowData = (Vector) dataVector.elementAt(row);Movie movie = (Movie) rowData.elementAt(0);switch (column) {case COL_NAME:ret = movie.getName();break;case COL_PREMIERE:ret = movie.getPremiere().toString();break;case COL_DIRCTOR:ret = movie.getDirector();break;default:break;}return ret;}@Overridepublic void setValueAt(Object aValue, int row, int column) {if (row > dataVector.size()) {return ;}// Get one row data.Vector rowData = (Vector) dataVector.elementAt(row);Movie movie = (Movie) rowData.elementAt(0);switch (column) {case COL_NAME:movie.setName(aValue.toString());break;case COL_DIRCTOR:movie.setDirector(aValue.toString());break;default:break;}}@Overridepublic boolean isCellEditable(int row, int column) {return column == COL_NAME || column == COL_DIRCTOR;}
}

数据对象

package com.aquar.data;import java.util.Date;
import java.util.List;/*** Created with IntelliJ IDEA.* User: Edison* Date: 13-8-16* Time: 下午10:30* To change this template use File | Settings | File Templates.*/
public class Movie {private String name;private Date premiere;private String publisher;private String director;private List<String> starrings;public Movie(String movName, Date movPremiere, String movDirector) {this.name = movName;this.premiere = movPremiere;this.director = movDirector;}public String getName() {return name;}public Date getPremiere() {return premiere;}public String getPublisher() {return publisher;}public String getDirector() {return director;}public List<String> getStarrings() {return starrings;}public void setName(String name) {this.name = name;}public void setPremiere(Date premiere) {this.premiere = premiere;}public void setPublisher(String publisher) {this.publisher = publisher;}public void setDirector(String director) {this.director = director;}public void setStarrings(List<String> starrings) {this.starrings = starrings;}
}

程序入口和UI

package com.aquar.main;import com.aquar.table.TableModelMovie;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;/*** Created with IntelliJ IDEA.* User: Edison* Date: 13-7-14* Time: 下午11:55* To change this template use File | Settings | File Templates.*/
public class MainFrame {private final int width = 800;private final int height = 600;private JFrame mFrame;private JTable movTable;public MainFrame() {mFrame = new JFrame();mFrame.setLayout(new BorderLayout(0, 0));mFrame.setSize(new Dimension(width, height));mFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);initUI();mFrame.setVisible(true);}private void initUI() {TableModelMovie modelMovie = new TableModelMovie();movTable = new JTable(modelMovie);movTable.setRowHeight(20);movTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);JScrollPane scrollPane = new JScrollPane(movTable);mFrame.add(scrollPane, BorderLayout.CENTER);JPanel footPanel = new JPanel();JButton newBtn = new JButton("New");newBtn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {
//                if (movTable.isEditing()) {
//                    movTable.getCellEditor().stopCellEditing();
//                }}});footPanel.add(newBtn);mFrame.add(footPanel, BorderLayout.SOUTH);}public void show() {}public static void main(String[] args) {new MainFrame();}
}

转载于:https://my.oschina.net/aquar/blog/153242

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS中的array和Object的区别

区别&#xff1a; 数组表示有序数据的集合&#xff0c;对象表示无需数据的集合。如果数据顺序很重要的话&#xff0c;就用数组&#xff0c;否则就用对象的好。 数组的数据没有名称name 对象的数据有名称 name 但是在很多编程语言中有个叫关联数组的&#xff0c;这种数组中的…

Linux C 数据结构——栈

还是先把这张图贴出来&#xff0c;以便对比和理解 栈是限制在一段进行插入操作和删除操作的线性表&#xff08;俗称堆栈&#xff09;&#xff0c;允许进行操作的一端称为“栈顶”&#xff0c;另一固定端称为“栈底”&#xff0c;当栈中没有元素称为“空栈”。特点&#xff1a;先…

常用的HTTP状态码

2019独角兽企业重金招聘Python工程师标准>>> 第一、成功的状态码&#xff1a; 1&#xff09;200 OK – 服务器成功返回网页 2&#xff09;304 Not Modified – 未修改 第二、失败的状态码&#xff1a; 3&#xff09;404 Not F…

Linux C 数据结构——队列

还是先放这张图&#xff0c;以便对比和理解&#xff1a; 队列是限制在两端进行插入操作和删除操作的线性表&#xff0c;允许进行存入操作的一端称为“队尾”&#xff0c;允许进行删除操作的一端称为“队头”。当线性表中没有元素时&#xff0c;称为“空队”。特点&#xff1a;先…

MySQL视图查询报错:Prepared statement needs to be re-prepared

From: https://www.ywnds.com/?p12609 今天公司的项目视图查询报错&#xff0c;报错如&#xff1a;ERROR 1615 (HY000): Prepared statement needs to be re-prepared 网上找了一圈&#xff0c;都说调整以下值就好了&#xff1a; mysql> set global table_open_cache163…

如何使用FF的Firebug组件中的net工具查看页面元素加载消耗时间

1.安装FF的Firebug组件&#xff1a;点击FF的Tools的Add-ons菜单&#xff0c;输入Firebug关键字&#xff0c;并选择合适的版本Install。 2.安装完毕后地址栏右边会出现一个小虫图标&#xff0c;右边还有一个下拉箭头。如下图&#xff1a; 3.点击下拉箭头&#xff0c;选择“on fo…

Linux C 数据结构——二叉树

先放这张图&#xff1a; 可以看出&#xff0c;树是非线性结构&#xff1b; 一、树的概念 树&#xff08;tree&#xff09;是n(n>0)个节点的有限集合T&#xff0c;它满足两个条件&#xff1a; 1&#xff09;有且仅有一个特定的称为根&#xff08;root&#xff09;的节点&…

antd 表单域验证规则 - 只能输入数字字符,去除前导0

<Form {...formItemLayout}><Form.Item label用户Id>{getFieldDecorator(uid, {initialValue: undefined,rules: [{ required: true, message: 请输入用户id, pattern: new RegExp(/^[1-9]\d*$/, g) }],getValueFromEvent: e > e.target.value.replace(/\D/g, )…

2013 822 划分子网

子网的划分是为了节省我们的网络的ip地址的分配,如我们有200台电脑需要一个子网段,我在这个192.168.0.1网段我们有254个地址,我们可以将我们的计算机划分成不同的子网,来进行使用,这样的话就是节省了大量的IP地址.补充下上次忘记总结的东西,就是如192.168.10.101/24 24表示我们…

BZOJ 3224: Tyvj 1728 普通平衡树

3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9629 Solved: 4091[Submit][Status][Discuss]Description 您需要写一种数据结构&#xff08;可参考题目标题&#xff09;&#xff0c;来维护一些数&#xff0c;其中需要提供以下操作&#xff1a;…

springboot中配置mybatis数据源,使用阿里的 Druid 数据库连接池

参考了很多文章&#xff0c;记录下自己的学习过程&#xff01; 参考&#xff1a;https://blog.csdn.net/weixin_40776321/article/details/99633110 1. 在pom.xml中添加依赖&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>dr…

Linux C 算法——查找

所谓“查找”记为在一个含有众多的数据元素&#xff08;或记录&#xff09;的查找表中找出某个“特定的”数据&#xff0c;即在给定信息集上寻找特定信息元素的过程。 为了便于讨论&#xff0c;必须给出这个“特定的”词的确切含义。首先&#xff0c;引入一个“关键字”的概念&…

SharePoint项目中新建类库的错误处理及项目建设中遇到的问题总结

第一次SP项目总监遇到各种问题&#xff0c;以下是总结&#xff1a;问题1.创建SP项目的时候“场解决方案”跟“沙盒解决方案”是有区别的&#xff0c;具体可以看MSDN官方文档&#xff0c;这里简单摘抄如下&#xff1a;1&#xff09;场解决方案&#xff1a;承载与W3WP.exe中&…

ECharts学习(1)--简单图表的绘制

1.获取ECharts 官网 下载&#xff1a;http://echarts.baidu.com/download.html 2.在html页面中引入ECharts文件 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>ECharts练习</title><script type"text/javas…

php配置xdebug断点调试

环境&#xff1a;mac 10.15.4 zcmzcmdeMacBook-Pro 20190902 % php -v PHP 7.4.9 (cli) (built: Aug 7 2020 19:23:06) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologieswith Xdebug v2.9.6, Copyright (c) 2002-2020, by Derick R…

Linux C 算法——排序

排序(Sort)是将无序的记录序列&#xff08;或称文件&#xff09;调整成有序的序列。 为了方便讨论&#xff0c;在此首先要对排序下一个确切的定义&#xff1a; 假设含有n个记录的序列为 { R1、R2、&#xff0c;。。。Rn } 其相应的关键字序列为 {K1、K2&#xff0c;。。。。Kn}…

HTTP错误代码

服务器错误代码大全 400 - 错误的请求。 401 - 访问被拒绝。IIS 定义了许多不同的 401 错误&#xff0c;它们指明更为具体的错误原因。这些具体的错误代码在浏览器中显示&#xff0c;但不在 IIS 日志中显示&#xff1a; 401.1 - 登录失败。 401.2 - 服务器配置导致登录失败。 4…

UIKit封装的系统动画

简介 在UIKit中&#xff0c;对UIView封装了很多类方法来进行简单的动画实现&#xff0c;在动画过程中&#xff0c;通过对属性值的修改来完成一系列的效果。 在IOS4以前&#xff0c;主要通过 beginAnimation setAnimationDuration:设置动画时长 setAnimationDelay:设置延迟时…

MS SQL Server2008大数、小数转varchar

HTJE在表中的字段类型为float(53) 试了下str, cast和convert&#xff0c;发现对于小数或大数&#xff0c;多少都存在一些问题&#xff0c;最后经过尝试终于找到一种满意的答案&#xff1a; select cast(HTJE as decimal(20,2)) from T_HTGL where ID 1002993 对于金额部分&…

oracle那些基本知识

Oracle创建表空间、创建用户以及授权 、查看权限 rownum 分页查询 它是oracle系统顺序分配为从查询返回的行的编号&#xff0c;返回的第一行分配的是1&#xff0c;第二行是2&#xff0c;依此类推&#xff0c;这个伪字段可以用于限制查询返回的总行数&#xff0c;而且rownum不能…