Java Swing中JTable渲染器與編輯器用法示例
本文實例講述了Java Swing中JTable渲染器與編輯器用法。分享給大家供大家參考,具體如下:
JTable的內(nèi)容、外觀、事件響應(yīng)在很大程度上是由渲染器與編輯器控制的。具體說來,渲染器負(fù)責(zé)單元格的外觀比如前景色、背景色,以及單元格提示;編輯器負(fù)責(zé)單元格的內(nèi)容和事件響應(yīng)。編輯器默認(rèn)為文本框形式,也可以使用下拉菜單、按鈕、單選按鈕等形式。下面通過一個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.dhdzp.com");
//添加TableModel以及表格數(shù)據(jù)
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設(shè)置
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);
}
});
}
}
以上是主程序,構(gòu)造了GUI、table以及model。并設(shè)置了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;
}
}
定制的渲染器必須實現(xiàn)TableCellRenderer及getTableCellRendererComponent方法。在該方法中,可以指定渲染器的文字、單元格提示、顏色、字體等。注意,此處的文字僅為顯示的內(nèi)容,不是單元格的實際數(shù)據(jù)。
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 源于單元格數(shù)值
cellValue = (value == null) ? "" : value.toString();
return button;
}
public Object getCellEditorValue() {
return new String(cellValue);
}
}
本編輯器實現(xiàn)了一個按鈕,相應(yīng)的業(yè)務(wù)代碼均位于其事件響應(yīng)函數(shù)中。定制的渲染器必須繼承DefaultCellEditor,并重載其getTableCellEditorComponent方法。getTableCellEditorComponent的參數(shù)提供了表格對象、單元格數(shù)值、單元格選中標(biāo)志以及單元格的坐標(biāo),并返回代表該單元格的渲染器的JComponent組件。在該方法中,我們將單元格數(shù)值保存為成員變量cellValue,并返回一個按鈕。getCellEditorValue方法用于返回單元格數(shù)值,需要我們顯示地指定。在按鈕的事件響應(yīng)函數(shù)中,本demo通過彈出對話框輸出了相應(yīng)的單元格數(shù)值。然后,調(diào)用了fireEditingStopped方法刷新渲染器。注意,該步驟不必可少,因為渲染器中的業(yè)務(wù)代碼很有可能改變單元格數(shù)值,從而導(dǎo)致渲染器必須進(jìn)行刷新。
運行效果如下:

點擊button1后的效果如下:

更多關(guān)于java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java字符與字符串操作技巧總結(jié)》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
Go?Java算法之為運算表達(dá)式設(shè)計優(yōu)先級實例
這篇文章主要為大家介紹了Go?Java算法之為運算表達(dá)式設(shè)計優(yōu)先級實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
springboot+vue實現(xiàn)oss文件存儲的示例代碼
對象存儲服務(wù)是一種海量、安全、低成本、高可靠的云存儲服務(wù),本文主要介紹了springboot+vue實現(xiàn)oss文件存儲的示例代碼,具有一定的參考價值,感興趣的可以了解一下2024-02-02
SpringBoot2.x 參數(shù)校驗問題小結(jié)
這篇文章主要介紹了SpringBoot2.x 參數(shù)校驗一些問題總結(jié),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08

