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,一经查实,立即删除!

相关文章

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;先…

如何使用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;的节点&…

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…

Linux C 算法——排序

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

JSON.parse 解析json字符串时,遇换行符报错

Json字符串转换成Json对象时候&#xff0c;有两种方式&#xff1a; 假设d是json字符串&#xff1a; 1&#xff0c;eval(( d ))。 2&#xff0c;JSON.parse(d)&#xff1b; 但是以上方式有隐患&#xff0c;如果Json字符串有换行的话&#xff0c;这样转换就会报错。 假如有…

文件I/O和标准I/O的区别

一、先来了解下什么是文件I/O和标准I/O&#xff1a; 文件I/O&#xff1a;文件I/O称之为不带缓存的IO&#xff08;unbuffered I/O)。不带缓存指的是每个read&#xff0c;write都调用内核中的一个系统调用。也就是一般所说的低级I/O——操作系统提供的基本IO服务&#xff0c;与os…

程序集、应用程序配置及App.config和YourSoft.exe.config .

转自&#xff1a;http://www.cnblogs.com/luminji/archive/2010/10/21/1857339.html 什么是程序集 程序集标识属性 强名称的程序集 强名称工作原理配置文件使用 DEVPATH 查找程序集指定要使用的运行库版本Appconfig和YourSoftexeconfig本章概要&#xff1a; 1&#xff1a;什么是…

[Android]在Dagger 2中使用RxJava来进行异步注入(翻译)

以下内容为原创&#xff0c;欢迎转载&#xff0c;转载请注明 来自天天博客&#xff1a;http://www.cnblogs.com/tiantianbyconan/p/6236646.html 在Dagger 2中使用RxJava来进行异步注入 原文&#xff1a;http://frogermcs.github.io/async-injection-in-dagger-2-with-rxjava 几…

关于Go语言在服务端做Restful接口和socket通信

请到我的个人博客看golang rest相关文章 http://xiaorui.cc关于Go语言在服务端做Restful接口和socket通信已经转到: http://xiaorui.cc/2014/10/25/%E5%85%B3%E4%BA%8Ego%E8%AF%AD%E8%A8%80%E5%9C%A8%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%81%9Arestful%E6%8E%A5%E5%8F%A3%E5%92%8C…

UVa 11136 - Hoax or what

题目大意&#xff1a;超市进行促销活动&#xff0c;顾客可以把账单放到一个箱子里&#xff0c;每天超市会从箱子中抽出最高消费者和最低消费者&#xff0c;最高消费者可以得到&#xff08;最高消费-最低消费&#xff09;的金钱。询问超市在n天的促销活动结束后应支付多少钱。 找…

Winfrom实现圆角设计

主要代码 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Paint(object sender, PaintEventArgs e) { Type(this, 25, 0.1); } private void…

Linux 系统应用编程——进程基础

一、Linux下多任务机制的介绍 Linux有一特性是多任务&#xff0c;多任务处理是指用户可以在同一时间内运行多个应用程序&#xff0c;每个正在执行的应用程序被称为一个任务。 多任务操作系统使用某种调度(shedule)策略&#xff08;由内核来执行&#xff09;支持多个任务并发执行…

【Python文件处理】递归批处理文件夹子目录内所有txt数据

因为有个需求&#xff0c;需要处理文件夹内所有txt文件&#xff0c;将txt里面的数据筛选&#xff0c;重新存储。 虽然手工可以做&#xff0c;但想到了python一直主张的是自动化测试&#xff0c;就想试着写一个自动化处理数据的程序。 一.分析数据格式 需要处理的数据是txt格式存…

Windows Azure 之服务总线中继服务

Windows Azure的服务总线允许在Web服务内部与外部之间做成一个公共的连接点&#xff0c;在无需更改企业防火墙或者其他安全配置的情况下连接内部和外部的服务 而使用Azure云服务的时候由于缩放的原因通过IP来制定连接也是不科学的&#xff0c;而中继服务则可以充当很好的公共连…