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

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

JTable 失去焦点时取消编辑状态相关推荐

  1. android tableview实现多选功能,iOS开发UI篇-tableView在编辑状态下的批量操作(多选)...

    先看下效果图 直接上代码 #import "MyController.h" @interface MyController () { UIButton *button; } @pr ...

  2. NSTextField 处于编辑状态时,点击return键 结束编辑,NSButton的return快捷方法不响应

    NSButton 设置快捷键 return, 当 NSTextField 处于编辑状态时, 点击return键 结束编辑,要求不响应button的return快捷方法 attributes inspe ...

  3. 【已解决】leaflet-geoman启用编辑模式时,map上所有(marker、polyline、Polygon等)元素处于编辑状态

    文章目录 leaflet-geoman启用编辑模式时,map上所有(marker.polyline.Polygon等)元素处于编辑状态特别影响体验,尤其是使用了L.motion后,由于切割较碎导致数据 ...

  4. 服务器文件夹取消只读,服务器上的excle文件有人打开文件编辑后关闭文件,别人再去打开文件时“**”正在编辑,用只读方式打开!excel怎样解除只读...

    在office2007 word excle PPT 中怎么设置权限为:禁止复制,禁止打印,禁止修改,仅只读功能呢?! 在工具----选项----安全性,根据你的要求设置相关密码即可! excel怎么 ...

  5. Excel表格在编辑状态时文字完整显示,但是预览和打印时表格内容显示不全问题,如何解决

    首先说明,目前还没找到完善的解决方案,可以通过以下方式暂时处理(虽然达不到预期效果o(╥﹏╥)o),欢迎大家评论区讨论完善. 复现场景: 1.在Excel中针对以下表格已经设置过自动调整行高,且编辑状 ...

  6. 使html表格可编辑状态,js+Html实现表格可编辑操作

    本文实例为大家分享了js+Html实现表格可编辑操作的具体代码,供大家参考,具体内容如下 功能描述:单击页面使单元格td变成可编辑状态,输入内容后,当单元格失去焦点时,保存输入的内容. 点击增加行,在 ...

  7. Qt QGraphicsTextItem 实现双击进入编辑状态

    要实现这个功能并不是很简单,因为QGraphicsTextItem的mousePressEvent和mouseDoubleClickEvent和其他类并不是很一样,重载senceEvent(QEven ...

  8. dateTimePicker编辑状态下,取值不正确的问题

    当对dateTimePicker进行编辑,回车,调用函数处理dateTimePicker的value值时,其取值结果是你编辑之前的值,而不是你编辑后的值,虽然dateTimePicker.text的值 ...

  9. EditText设置可以编辑和不可编辑状态

    1.首先想到在xml中设置android:editable="false",但是如果想在代码中动态设置可编辑状态,没有找到对应的函数 2.然后尝试使用editText.setFoc ...

最新文章

  1. js中replace未定义_js中replace的用法
  2. ESP8266 问题
  3. 《嵌入式系统开发之道——菜鸟成长日志与项目经理的私房菜》——第1章 系统•嵌入•硬件 01-01 Welcome on board!...
  4. python ssh登陆模块_Python sshh包_程序模块 - PyPI - Python中文网
  5. C++接口工程实践:有哪些实现方法?
  6. 产品经理,如何建立自己独特的产品观?(转)
  7. 一个脚本实现全量增量备份,并推送到远端备份中心服务器
  8. burpsuite全套使用教程
  9. deque冰淇淋_用冰淇淋解释组合爆炸:如何添加一点并获得很多
  10. TypeScript手册翻译系列1-基础类型
  11. 云开发打工人必备上班摸鱼划水微信小程序源码
  12. 基于自抗扰控制的高速列车自动驾驶速度控制
  13. Android:ViewPage使用教程
  14. log4j2.xml 配置文件详解
  15. 加班到凌晨三点?一张图看懂华为员工睡眠时间!!
  16. Matlab似然比检验函数,似然比检验 LRT
  17. 3台服务器+StarVCenter,搭建“超融合云平台”-完美体验-跑100台虚拟机
  18. 子网掩码的作用和用法
  19. 股票入门基础知识1:什么是股票和股份?
  20. bzoj3238 [ AHOI2013 ] --后缀自动机

热门文章

  1. Codeforces Round #381 (Div. 2) Codeforce_740
  2. uva 1615——Highway
  3. C/C++继承与派生
  4. 【C++学习笔记一】C++类和对象详解
  5. WinPcap笔记(7):分析数据包(1)
  6. java接口的修饰符可以为,附架构师必备技术详解
  7. SQL实现当前行等于前面两行数据之和
  8. 标线markLine的用法
  9. Django模型定义参考
  10. Mingw编译DLib