TableCellRenderer和TableCellEditor(一)
生活随笔
收集整理的這篇文章主要介紹了
TableCellRenderer和TableCellEditor(一)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?轉(zhuǎn)載:http://blog.sina.com.cn/s/blog_661a3fce0100mske.html 最近不少朋友問(wèn)我TableCellRenderer和TableCellEditor的用法,趁今天周末有空寫了幾個(gè)麻雀雖小五臟俱全的例子供大家參考。
簡(jiǎn)單來(lái)說(shuō): TableCellRenderer就是用來(lái)繪制展示當(dāng)前cell單元數(shù)值內(nèi)容的,你可以用文字、數(shù)值或者圖片來(lái)表示內(nèi)容,當(dāng)然最強(qiáng)大展示方式的就是通過(guò)自定義自己的renderer組件,通過(guò)Java2D來(lái)繪制各種天花亂墜的效果。
TableCellEditor主要是用來(lái)當(dāng)用戶點(diǎn)擊在具體cell時(shí)進(jìn)行編輯的組件,所以 TableCellEditor除了具有TableCellRenderer一樣的繪制功能外還可以進(jìn)行交互動(dòng)作,例如在cell上出現(xiàn)下拉框、勾選框甚 至通過(guò)按鈕彈出更復(fù)雜的對(duì)話框讓用戶進(jìn)行輸入編輯。
以下是在cell中嵌入start、stop兩個(gè)按鈕的表格,注意這里的renderer只是用來(lái)顯示效果,并沒(méi)有進(jìn)行交互動(dòng)作,真正進(jìn)行動(dòng)作的是當(dāng)你將鼠標(biāo)點(diǎn)擊在cell上時(shí),JTable定位上去的editor,所以不要徒勞在renderer上做點(diǎn)擊事項(xiàng)處理,renderer是不會(huì)接受到交互事項(xiàng)的,renderer只是個(gè)畫筆,你看到的start、stop按鈕只是這個(gè)畫筆畫出來(lái)的內(nèi)容,是虛的并沒(méi)有真正的組件在上面。
import java.awt.*;
import java.awt.event.*; import javax.swing.*;
import javax.swing.table.*; public class TableTest1 extends JFrame { ?JTable table;
?String[] states = new String[]{"stop", "stop", "stop"};
?
?// model
?class TableModel extends AbstractTableModel{
??public int getColumnCount() {
???return 2;
??}
??public int getRowCount() {
???return states.length;
??}
??public Object getValueAt(int rowIndex, int columnIndex) {
???if(columnIndex == 0){
????return states[rowIndex];
???}
???return null;
??}
???? public String getColumnName(int columnIndex) {
???if(columnIndex == 0){
????return "state";
???}else{
????return "operate";
???}
???? }
???? public boolean isCellEditable(int rowIndex, int columnIndex) {
???if(columnIndex == 0){
????return false;
???}else{
????return true;
???}
???? }
?}
?
?// cell editor
?class Editor extends AbstractCellEditor implements TableCellEditor, ActionListener {
??int row;
??JTable table;
??JPanel panel;
??JButton start;
??JButton stop;
??Editor(){
???panel = new JPanel();
???panel.setLayout(new GridLayout(1, 2));
???start = new JButton("start");
???stop = new JButton("stop");
???start.addActionListener(this);
???stop.addActionListener(this);
???panel.add(start);
???panel.add(stop);
??}
???? public Object getCellEditorValue() {
???????? return null;
???? }
???? public Component getTableCellEditorComponent(JTable table,
????????????????????????????????????????????????? Object value,
????????????????????????????????????????????????? boolean isSelected,
????????????????????????????????????????????????? int row,
????????????????????????????????????????????????? int column) {
???? ?this.table = table;
???? ?this.row = row;
???? ?return panel;
???? }
????
??public void actionPerformed(ActionEvent e) {
???if(e.getSource() == start){
????states[row] = "start";
???}else{
????states[row] = "stop";
???}
???((AbstractTableModel)table.getModel()).fireTableCellUpdated(row, 0);
??}
??
?}
?
?// cell render
?class Renderer extends JComponent implements TableCellRenderer{
??JPanel panel;
??JButton start;
??JButton stop;
??Renderer(){
???panel = new JPanel();
???panel.setLayout(new GridLayout(1, 2));
???start = new JButton("start");
???stop = new JButton("stop");
???panel.add(start);
???panel.add(stop);
??}
??public Component getTableCellRendererComponent(JTable table, Object value,
????boolean isSelected, boolean hasFocus, int row, int column) {
???return panel;
??}
?} ?
?public TableTest1(){
??super("renderer and editor self-existent");
??table = new JTable(new TableModel());
??TableColumn tableColumn = table.getColumnModel().getColumn(1);
??tableColumn.setCellRenderer(new Renderer());
??tableColumn.setCellEditor(new Editor());
??
??????? this.getContentPane().setLayout(new BorderLayout());
??????? this.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
??????? this.setSize(500, 300);
??????? this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
?} ?public static void main(String[] args) {
??new TableTest1().show(); ?} }
簡(jiǎn)單來(lái)說(shuō): TableCellRenderer就是用來(lái)繪制展示當(dāng)前cell單元數(shù)值內(nèi)容的,你可以用文字、數(shù)值或者圖片來(lái)表示內(nèi)容,當(dāng)然最強(qiáng)大展示方式的就是通過(guò)自定義自己的renderer組件,通過(guò)Java2D來(lái)繪制各種天花亂墜的效果。
TableCellEditor主要是用來(lái)當(dāng)用戶點(diǎn)擊在具體cell時(shí)進(jìn)行編輯的組件,所以 TableCellEditor除了具有TableCellRenderer一樣的繪制功能外還可以進(jìn)行交互動(dòng)作,例如在cell上出現(xiàn)下拉框、勾選框甚 至通過(guò)按鈕彈出更復(fù)雜的對(duì)話框讓用戶進(jìn)行輸入編輯。
以下是在cell中嵌入start、stop兩個(gè)按鈕的表格,注意這里的renderer只是用來(lái)顯示效果,并沒(méi)有進(jìn)行交互動(dòng)作,真正進(jìn)行動(dòng)作的是當(dāng)你將鼠標(biāo)點(diǎn)擊在cell上時(shí),JTable定位上去的editor,所以不要徒勞在renderer上做點(diǎn)擊事項(xiàng)處理,renderer是不會(huì)接受到交互事項(xiàng)的,renderer只是個(gè)畫筆,你看到的start、stop按鈕只是這個(gè)畫筆畫出來(lái)的內(nèi)容,是虛的并沒(méi)有真正的組件在上面。
import java.awt.*;
import java.awt.event.*; import javax.swing.*;
import javax.swing.table.*; public class TableTest1 extends JFrame { ?JTable table;
?String[] states = new String[]{"stop", "stop", "stop"};
?
?// model
?class TableModel extends AbstractTableModel{
??public int getColumnCount() {
???return 2;
??}
??public int getRowCount() {
???return states.length;
??}
??public Object getValueAt(int rowIndex, int columnIndex) {
???if(columnIndex == 0){
????return states[rowIndex];
???}
???return null;
??}
???? public String getColumnName(int columnIndex) {
???if(columnIndex == 0){
????return "state";
???}else{
????return "operate";
???}
???? }
???? public boolean isCellEditable(int rowIndex, int columnIndex) {
???if(columnIndex == 0){
????return false;
???}else{
????return true;
???}
???? }
?}
?
?// cell editor
?class Editor extends AbstractCellEditor implements TableCellEditor, ActionListener {
??int row;
??JTable table;
??JPanel panel;
??JButton start;
??JButton stop;
??Editor(){
???panel = new JPanel();
???panel.setLayout(new GridLayout(1, 2));
???start = new JButton("start");
???stop = new JButton("stop");
???start.addActionListener(this);
???stop.addActionListener(this);
???panel.add(start);
???panel.add(stop);
??}
???? public Object getCellEditorValue() {
???????? return null;
???? }
???? public Component getTableCellEditorComponent(JTable table,
????????????????????????????????????????????????? Object value,
????????????????????????????????????????????????? boolean isSelected,
????????????????????????????????????????????????? int row,
????????????????????????????????????????????????? int column) {
???? ?this.table = table;
???? ?this.row = row;
???? ?return panel;
???? }
????
??public void actionPerformed(ActionEvent e) {
???if(e.getSource() == start){
????states[row] = "start";
???}else{
????states[row] = "stop";
???}
???((AbstractTableModel)table.getModel()).fireTableCellUpdated(row, 0);
??}
??
?}
?
?// cell render
?class Renderer extends JComponent implements TableCellRenderer{
??JPanel panel;
??JButton start;
??JButton stop;
??Renderer(){
???panel = new JPanel();
???panel.setLayout(new GridLayout(1, 2));
???start = new JButton("start");
???stop = new JButton("stop");
???panel.add(start);
???panel.add(stop);
??}
??public Component getTableCellRendererComponent(JTable table, Object value,
????boolean isSelected, boolean hasFocus, int row, int column) {
???return panel;
??}
?} ?
?public TableTest1(){
??super("renderer and editor self-existent");
??table = new JTable(new TableModel());
??TableColumn tableColumn = table.getColumnModel().getColumn(1);
??tableColumn.setCellRenderer(new Renderer());
??tableColumn.setCellEditor(new Editor());
??
??????? this.getContentPane().setLayout(new BorderLayout());
??????? this.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
??????? this.setSize(500, 300);
??????? this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
?} ?public static void main(String[] args) {
??new TableTest1().show(); ?} }
轉(zhuǎn)載于:https://www.cnblogs.com/gwq369/p/5363193.html
總結(jié)
以上是生活随笔為你收集整理的TableCellRenderer和TableCellEditor(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 上海二手车为什么便宜?
- 下一篇: web.xml中load-on-star