Swing-JTable的渲染器與編輯器使用demo


JTable的內容、外觀、事件響應在很大程度上是由渲染器與編輯器控制的。具體說來,渲染器負責單元格的外觀比如前景色、背景色,以及單元格提示;編輯器負責單元格的內容和事件響應。編輯器默認為文本框形式,也可以使用下拉菜單、按鈕、單選按鈕等形式。下面通過一個demo程序來說明渲染器與編輯器的基本用法。

JButtonTableExample.java

package JButtonTableExample;


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;


public class JButtonTableExample extends JFrame {

    public JButtonTableExample() {
        super("JButtonTable Example");

        //添加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 JButtonTableExample;

import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

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 JButtonTableExample;

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;

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方法刷新渲染器。注意,該步驟不必可少,因為渲染器中的業務代碼很有可能改變單元格數值,從而導致渲染器必須進行刷新。

運行效果如下:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM