JTable更改列字体

6
我正在制作一张表格,想要使第一列的字体大小更大。
例如,在第0列中,我希望字体大小为30,在第1-3列中,我希望字体大小为13。
以下是我的代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.*;

public class kanji_list extends JFrame {

    kanji_list(){

        JTable table = new JTable();
        JScrollPane scroll = new JScrollPane();
        Image icon = Toolkit.getDefaultToolkit().getImage("JLPT.jpg");
        ImageIcon ima = new ImageIcon("JLPT.jpg");

        DefaultTableModel model = new DefaultTableModel(get_data(), get_header());


        table = new JTable(model){
            public boolean isCellEditable(int rowIndex, int vColIndex){
                return false;
            }
        };
        JTableHeader th = table.getTableHeader();  
        TableColumnModel tcm = th.getColumnModel();
        TableColumn column = null;
        table.setFont(new Font("Microsoft JhengHei", Font.BOLD, 13));
        for (int i = 0; i < 4; i++) {
            column = table.getColumnModel().getColumn(i);
            DefaultTableCellRenderer tcr = new DefaultTableCellRenderer();
            tcr.setHorizontalAlignment(SwingConstants.CENTER);
            column.setCellRenderer(tcr);
            if (i==0) {
                column.setPreferredWidth(50);
            }
            else{
                if(i==1){
                    column.setPreferredWidth(175);
                }
                else{
                    if(i==2){
                        column.setPreferredWidth(200);
                    }
                    else{
                        column.setPreferredWidth(875);
                    }
                }
            }
        }       
        table.setRowHeight(table.getRowHeight()+30);
        table.setModel(model);
        scroll.add(table);
        this.add(scroll);
        this.setTitle("Katakana");
        this.setSize(1350, 700);
        this.setIconImage(icon);
        this.setVisible(true);
        this.setLocationRelativeTo(null);

        scroll.setViewportView(table);
    }
    Object [][]get_data(){
        Object data[][] = new Object[][]{
            {"\u4e00", "Uno, 1", "ICHI, ITSU", "hito-, hitotsu"}, 
            {"\u4e8c", "Dos, 2", "NI, JI", "futa, futatsu, futatabi"}, 
            {"\u4e09", "Tres, 3", "SAN, JOU", "mi, mitsu, mittsu"},
            {"\u99c5", "Estación", "EKI", ""}
        };
        return data;
    }
    String []get_header(){
        String header [] = new String[]{"KANJI", "SIGNIFICADO", "LECTURA ON", "LECTURA KUN"};
        return header;
    }
}

这是一个日语学习系统,但第一列上的汉字在我使用的13号字体下完全不可见。如果我将整个表格放大到更高的尺寸,所有其他列都会变大,看起来也不好看。
1个回答

19
在核心JTable中,您基本上需要一个自定义渲染器,将字体设置为与表格字体不同的内容,例如在DefaultTableCellRenderer的子类中。请注意,仅在实例化后一次设置DefaultTableCellRenderer上的字体是不起作用的,因为每次调用getTableCellRendererComponent都会重置它。
JTable table = new JTable(new AncientSwingTeam());
// the default renderer uses the table's font,
// so set it as appropriate
table.setFont(fontToUseForAllColumnsExceptFirst);
// a custom renderer which uses a special font
DefaultTableCellRenderer r = new DefaultTableCellRenderer() {
    Font font = fontToUseForFirstColumn;

    @Override
    public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus,
            int row, int column) {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus,
                row, column);
        setFont(font);
        return this;
    }

};
// doesn't work because the default renderer's font is reset
// to the table's font always
// r.setFont(font);
// set the custom renderer for first column
table.getColumnModel().getColumn(0).setCellRenderer(r);

一种替代方法是使用渲染器装饰方法,该方法得到 SwingX 项目的支持(个人有点偏见 :-)),那么上述代码将变成两行代码(假设表格类型为 JXTable):
Highlighter hl = new FontHighlighter(font);
table.getColumnExt(0).setHighlighter(hl);

3
table.getTableHeader().setFont(new Font(null, Font.PLAIN, 23)); 这段代码中(除了 Nimbus 主题),有什么问题? - mKorbel
@mKorbel 没问题 :-) 只是据我理解这与问题无关:它涉及每列字体,而不是表格字体。 - kleopatra
+1,抱歉,我甚至没有看到你的答案。我会删除我的答案,让你的答案先出现。 - camickr
@kleopatra 我尝试过了,但是出了很多问题。我还只是一个Java的学生,你能帮我把那段代码加入到我的代码中吗?或者用简单的语言解释一下它是如何工作的吗?因为我还是不太明白它是怎么工作的。 - Frakcool
@Frakcool 嗯... 没有更多需要解释的了,这是相当基础的,只需要做这些。如果你在使用过程中遇到问题,可以考虑阅读教程中关于渲染的章节(链接在swing标签维基中,即上方的信息选项卡)。 - kleopatra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接