JTable 失去焦点时取消编辑状态
為什么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 失去焦点时取消编辑状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android中 MediaStore提
- 下一篇: 梦到屎弄到自己身上是什么意思啊