TableCellRenderer和TableCellEditor(一)
生活随笔
收集整理的這篇文章主要介紹了
TableCellRenderer和TableCellEditor(一)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?轉載:http://blog.sina.com.cn/s/blog_661a3fce0100mske.html 最近不少朋友問我TableCellRenderer和TableCellEditor的用法,趁今天周末有空寫了幾個麻雀雖小五臟俱全的例子供大家參考。
簡單來說: TableCellRenderer就是用來繪制展示當前cell單元數值內容的,你可以用文字、數值或者圖片來表示內容,當然最強大展示方式的就是通過自定義自己的renderer組件,通過Java2D來繪制各種天花亂墜的效果。
TableCellEditor主要是用來當用戶點擊在具體cell時進行編輯的組件,所以 TableCellEditor除了具有TableCellRenderer一樣的繪制功能外還可以進行交互動作,例如在cell上出現下拉框、勾選框甚 至通過按鈕彈出更復雜的對話框讓用戶進行輸入編輯。
以下是在cell中嵌入start、stop兩個按鈕的表格,注意這里的renderer只是用來顯示效果,并沒有進行交互動作,真正進行動作的是當你將鼠標點擊在cell上時,JTable定位上去的editor,所以不要徒勞在renderer上做點擊事項處理,renderer是不會接受到交互事項的,renderer只是個畫筆,你看到的start、stop按鈕只是這個畫筆畫出來的內容,是虛的并沒有真正的組件在上面。
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(); ?} }
簡單來說: TableCellRenderer就是用來繪制展示當前cell單元數值內容的,你可以用文字、數值或者圖片來表示內容,當然最強大展示方式的就是通過自定義自己的renderer組件,通過Java2D來繪制各種天花亂墜的效果。
TableCellEditor主要是用來當用戶點擊在具體cell時進行編輯的組件,所以 TableCellEditor除了具有TableCellRenderer一樣的繪制功能外還可以進行交互動作,例如在cell上出現下拉框、勾選框甚 至通過按鈕彈出更復雜的對話框讓用戶進行輸入編輯。
以下是在cell中嵌入start、stop兩個按鈕的表格,注意這里的renderer只是用來顯示效果,并沒有進行交互動作,真正進行動作的是當你將鼠標點擊在cell上時,JTable定位上去的editor,所以不要徒勞在renderer上做點擊事項處理,renderer是不會接受到交互事項的,renderer只是個畫筆,你看到的start、stop按鈕只是這個畫筆畫出來的內容,是虛的并沒有真正的組件在上面。
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(); ?} }
轉載于:https://www.cnblogs.com/gwq369/p/5363193.html
總結
以上是生活随笔為你收集整理的TableCellRenderer和TableCellEditor(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上海二手车为什么便宜?
- 下一篇: UE3 ExampleGame Andr