java jtable 单击进去编辑_Java Swing中JTable渲染器与编辑器用法示例

本文实例讲述了Java Swing中JTable渲染器与编辑器用法。分享给大家供大家参考,具体如下:

JTable的内容、外观、事件响应在很大程度上是由渲染器与编辑器控制的。具体说来,渲染器负责单元格的外观比如前景色、背景色,以及单元格提示;编辑器负责单元格的内容和事件响应。编辑器默认为文本框形式,也可以使用下拉菜单、按钮、单选按钮等形式。下面通过一个demo程序来说明渲染器与编辑器的基本用法。

JButtonTableExample.java

package awtDemo;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import javax.swing.JCheckBox;

import javax.swing.JFrame;

import javax.swing.JScrollPane;

import javax.swing.JTable;

import javax.swing.table.DefaultTableModel;

@SuppressWarnings("serial")

public class JButtonTableExample extends JFrame {

public JButtonTableExample() {

super("JButtonTable Example - www.jb51.net");

//添加TableModel以及表格数据

DefaultTableModel dm = new DefaultTableModel();

dm.setDataVector(new Object[][] { { "button 1", "foo" },

{ "button 2", "bar" } }, new Object[] { "Button", "String" });

JTable table = new JTable(dm);

//添加渲染器

table.getColumn("Button").setCellRenderer(new ButtonRenderer());

//添加编辑器

table.getColumn("Button").setCellEditor( new ButtonEditor(new JCheckBox()));

//GUI设置

JScrollPane scroll = new JScrollPane(table);

getContentPane().add(scroll);

setSize(400, 100);

setVisible(true);

}

public static void main(String[] args) {

JButtonTableExample frame = new JButtonTableExample();

frame.addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e) {

System.exit(0);

}

});

}

}

以上是主程序,构造了GUI、table以及model。并设置了table的渲染器和编辑器。

ButtonRenderer.java

package awtDemo;

import java.awt.Color;

import javax.swing.JButton;

import javax.swing.JComponent;

import javax.swing.JTable;

import javax.swing.table.TableCellRenderer;

@SuppressWarnings("serial")

class ButtonRenderer extends JButton implements TableCellRenderer {

public JComponent getTableCellRendererComponent(JTable table, Object value,

boolean isSelected, boolean hasFocus, int row, int column) {

//value 源于editor

String text = (value == null) ? "" : value.toString();

//按钮文字

setText(text);

//单元格提示

setToolTipText(text);

//背景色

setBackground(Color.BLACK);

//前景色

setForeground(Color.green);

return this;

}

}

定制的渲染器必须实现TableCellRenderer及getTableCellRendererComponent方法。在该方法中,可以指定渲染器的文字、单元格提示、颜色、字体等。注意,此处的文字仅为显示的内容,不是单元格的实际数据。

ButtonEditor.java

package awtDemo;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.DefaultCellEditor;

import javax.swing.JButton;

import javax.swing.JCheckBox;

import javax.swing.JComponent;

import javax.swing.JOptionPane;

import javax.swing.JTable;

@SuppressWarnings("serial")

class ButtonEditor extends DefaultCellEditor {

protected JButton button;//represent the cellEditorComponent

private String cellValue;//保存cellEditorValue

public ButtonEditor(JCheckBox checkBox) {

super(checkBox);

button = new JButton();

button.setOpaque(true);

button.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

JOptionPane.showMessageDialog(button, cellValue + ": Ouch!");

//刷新渲染器

fireEditingStopped();

}

});

}

public JComponent getTableCellEditorComponent(JTable table, Object value,

boolean isSelected, int row, int column) {

//value 源于单元格数值

cellValue = (value == null) ? "" : value.toString();

return button;

}

public Object getCellEditorValue() {

return new String(cellValue);

}

}

本编辑器实现了一个按钮,相应的业务代码均位于其事件响应函数中。定制的渲染器必须继承DefaultCellEditor,并重载其getTableCellEditorComponent方法。getTableCellEditorComponent的参数提供了表格对象、单元格数值、单元格选中标志以及单元格的坐标,并返回代表该单元格的渲染器的JComponent组件。在该方法中,我们将单元格数值保存为成员变量cellValue,并返回一个按钮。getCellEditorValue方法用于返回单元格数值,需要我们显示地指定。在按钮的事件响应函数中,本demo通过弹出对话框输出了相应的单元格数值。然后,调用了fireEditingStopped方法刷新渲染器。注意,该步骤不必可少,因为渲染器中的业务代码很有可能改变单元格数值,从而导致渲染器必须进行刷新。

运行效果如下:

2f4f21ed4a56cb7bb931ff2340209aff.png

点击button1后的效果如下:

1d4ba47725139e4a0492f29223f50115.png

希望本文所述对大家java程序设计有所帮助。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值