天天看點

Java Swing JTable 表格【11:表格使用自定義渲染器】

TableCellRenderer接口定義了JTable渲染器接口:

貼圖如下:
Java Swing JTable 表格【11:表格使用自定義渲染器】
Java Swing JTable 表格【11:表格使用自定義渲染器】
渲染器對象作為一個方法的參數來實作針對表格中的單元格的不同設定的方法之一:
public void setDefaultRenderer(Class columnClass,TableCellRenderer Renderer);

一下是一個自定義渲染器的代碼,在第二行第三列内置一個表格:

package com.acconsys.swing.chapter14;

import java.awt.BorderLayout;
import java.awt.Component;

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

/**
 * 展示如何利用渲染器在表中再插入一個表格
 * 
 * @author Administrator
 * 
 */
public class Test13 extends JTable {

    public Test13() {
        JFrame f = new JFrame("測試視窗");
        f.setVisible(true);
        f.setSize(, );
        // f.pack();
        Object[][] p = { { "王鵬", "91", "100", "191" },
                { "朱學蓮", "82", "100", "182" }, { "梅婷", "47", "100", "147" },
                { "趙龍", "61", "100", "161" }, { "李兵", "90", "100", "190" }, };
        String[] n = { "姓名", "國文", "數學", "總分" };

        // 界面元件
        JScrollPane scroPanel = new JScrollPane(this);// 中底層滾動面闆
        f.getContentPane().add(scroPanel, BorderLayout.CENTER);
        setModel(new DefaultTableModel(p, n));
        // 将第2行噶偶設定寬一些,使潛入的表格顯示起來好看些
        setRowHeight(, super.getRowHeight() * );
    }

    @Override
    public TableCellRenderer getCellRenderer(int row, int column) {
        // 重載getCellRenderer提供自己的TableCellRenderer
        if (row ==  && column == ) {
            return new TableCellRenderer() {
                // 在第2行,第3列提供一個子表的渲染器
                JTable subTable = new JTable(new DefaultTableModel(, ));

                // 子表可以自己定制内容
                @Override
                public Component getTableCellRendererComponent(JTable table,
                        Object value, boolean isSelected, boolean hasFocus,
                        int row, int column) {
                    // 實作TableCellRender的方法,提供該子表渲染器
                    return subTable;
                }
            };
        } else if (column == ) {
            return new TableCellRenderer() {
                // 在第2行,第3列提供一個子表的渲染器
                JCheckBox checkBox = new JCheckBox();

                // 子表可以自己定制内容
                @Override
                public Component getTableCellRendererComponent(JTable table,
                        Object value, boolean isSelected, boolean hasFocus,
                        int row, int column) {
                    // 實作TableCellRender的方法,提供該子表渲染器
                    return checkBox;
                }
            };
        } else {
            return super.getCellRenderer(row, column);
            // 如果是其他地方的表格,沿用父類中提供的渲染器
        }
    }

    public static void main(String[] args) {
        new Test13();
    }
}
           

運作如圖:

Java Swing JTable 表格【11:表格使用自定義渲染器】