文档章节

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

莫忆往西
 莫忆往西
发布于 2013/08/17 00:39
字数 949
阅读 66
收藏 0

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();
    }

    @Override
    public 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;
    }

    @Override
    public 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;
        }
    }

    @Override
    public 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() {
            @Override
            public 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();

    }
}

© 著作权归作者所有

上一篇: Markdown学习
莫忆往西
粉丝 2
博文 14
码字总数 17277
作品 0
西安
私信 提问
关于JTable中的jcombobox关联

如下图所示,想实现jtable中的单元格的值和jcomboBox的选择(可多选)关联: 1、从jcomboBox选择多个或者一个选项,jcomboBox失去焦点的时候,对应的单元格显示jcomboBox选择的值 2、表中的单...

一个凡人
2013/10/22
405
0
swing如何获取容器中组件的实例

问题是这样的 有一个JTabbedPane里面加了很多个标签,每个标签里面是一个JTable 现在有一个事件会触发 刷新所有也签中的JTable的数据。 请问有什么方法可以遍历这个JTabbedPane中所有的JTabl...

zzbutcher
2014/06/23
791
0
Java Swing控件样式设置

1.设置JTable的背景色 一般情况下,设置JTable背景色的时候,只能设置有数据行的背景色,对于默认的底色部分还是没法设置,默认为灰色,这时需要设置JTable上层容器jScrollPane1的背景色才能...

YuanyuanL
2014/08/01
1K
0
在JTable中,点击表头实现排序?

private JTable table=new JTable(); // 存放DefaultTableModel private DefaultTableModel tableModel=new DeafaultTableModel() // 存放数据 TableRowSorter tableRowSorter=new TableRow......

wangaowell
2013/09/13
2.9K
2
用JTree子节点触发添加一个JTabbedPane选项卡

用AWT/Swing写了一个签到系统,遇到一个问题百思不得其解啊- - 编写的服务端界面分为三块,左上为一个JTree的面板,左下是一个JTable的面板,右边是一个JEditorPane用来显示客户端和服务端操...

Loblood
2011/09/19
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
11
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部