如何在 JTable 中将单元格居中

Posted

技术标签:

【中文标题】如何在 JTable 中将单元格居中【英文标题】:How to center cells in JTable 【发布时间】:2013-06-14 00:29:34 【问题描述】:

我的代码存在特定问题。

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.*;
import java.awt.Color;

class ver_his_sign extends JFrame 

    ver_his_sign() 

        JTable table = new JTable();
        JScrollPane scroll = new JScrollPane();

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

        JFrame hk = new JFrame("Historial de Significados");
        Image icon = Toolkit.getDefaultToolkit().getImage("JLPT.jpg");
        ImageIcon ima = new ImageIcon("JLPT.jpg");
        table = new JTable(model) 
            public boolean isCellEditable(int row, int col) 
                switch (col) 
                    case 0:
                        return false;
                    case 1:
                        return false;
                    case 2:
                        return true;
                    default:
                        return false;
                
            

            @Override
            public Class getColumnClass(int column) 
                switch (column) 
                    case 0:
                        return String.class;
                    case 1:
                        return String.class;
                    case 2:
                        return Boolean.class;
                    default:
                        return Boolean.class;
                
            
        ;
        table.setFont(new Font("Microsoft JhengHei", Font.BOLD, 13)); // a custom renderer which uses a special font
        DefaultTableCellRenderer r = new DefaultTableCellRenderer() 
            Font font = new Font("Microsoft JhengHei", Font.BOLD, 50);

            @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);
                setForeground(Color.blue);
                return this;
            
        ;
        table.getColumnModel().getColumn(0).setCellRenderer(r);
        TableColumn column = null;
        DefaultTableCellRenderer tcr = new DefaultTableCellRenderer();
        tcr.setHorizontalAlignment(JLabel.CENTER);
        DefaultTableCellRenderer defaultRenderer = (DefaultTableCellRenderer) table.getDefaultRenderer(Object.class);
        defaultRenderer.setHorizontalAlignment(JLabel.CENTER);
        defaultRenderer.setFont(new Font("Microsoft JhengHei", Font.BOLD, 50));
        tcr.setFont(new Font("Microsoft JhengHei", Font.BOLD, 50));
        for (int i = 0; i < 3; i++) 
            column = table.getColumnModel().getColumn(i);
            if (i == 0) 
                column.setPreferredWidth(200);
             else 
                if (i == 1) 
                    column.setPreferredWidth(100);
                 else 
                    column.setPreferredWidth(300);
                
            
        
        table.setRowHeight(table.getRowHeight() + 70);
        table.setModel(model);
        scroll.add(table);
        this.add(scroll);
        this.setTitle("Historial de Significados");
        this.setSize(1350, 700);
        this.setIconImage(icon);
        this.setVisible(true);
        this.setLocationRelativeTo(null);

        scroll.setViewportView(table);
    

    Object[][] get_data() 
        Object data[][] = new Object[][]
            "Uno, 1", "\u4e00", true,
            "Uno, 1", "\u4e01", true,
            "Uno, 1", "\u4e02", true,
            "Uno, 1", "\u4e03", true,
            "Uno, 1", "\u4e04", true
        ;
        return data;
    

    String[] get_header() 
        String header[] = new String[]"KANJI", "SIGNIFICADO", "Agregar";
        return header;
    

然后它会发生图像上显示的内容。我需要 Kanji 列居中对齐,但由于某种原因 DefaultTableCellRenderer, `tcr, 没有按预期工作,但默认渲染器按预期工作。

有什么建议/帮助吗?

【问题讨论】:

+1 表示几乎完整的sscce。 :-) 【参考方案1】:

我已将您的示例精简为基本要素:

您的自定义渲染器 r 应该调整对齐方式以及大小和颜色。

在模型中覆盖模型方法,而不是在视图中。

Swing GUI 对象应在event dispatch thread 上构造和操作。

根据需要使用deriveFont()

另请参阅本教程部分,了解如何选择 renderers。

import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.*;
import java.awt.Color;
import javax.swing.JLabel;

class ver_his_sign extends JFrame 

    public static void main(String[] args) 
        EventQueue.invokeLater(new Runnable() 
            @Override
            public void run() 
                new ver_his_sign();
            
        );
    

    ver_his_sign() 

        DefaultTableModel model = new DefaultTableModel(get_data(), get_header()) 
            @Override
            public boolean isCellEditable(int row, int col) 
                switch (col) 
                    case 0:
                        return false;
                    case 1:
                        return false;
                    case 2:
                        return true;
                    default:
                        return false;
                
            

            @Override
            public Class getColumnClass(int column) 
                switch (column) 
                    case 0:
                        return String.class;
                    case 1:
                        return String.class;
                    case 2:
                        return Boolean.class;
                    default:
                        return Boolean.class;
                
            
        ;
        DefaultTableCellRenderer r = new DefaultTableCellRenderer() 
            @Override
            public Component getTableCellRendererComponent(JTable table, Object
                value, boolean isSelected, boolean hasFocus, int row, int column) 
                super.getTableCellRendererComponent(
                    table, value, isSelected, hasFocus, row, column);
                setForeground(Color.blue);
                setHorizontalAlignment(JLabel.CENTER);
                setFont(getFont().deriveFont(50f));
                return this;
            
        ;
        JTable table = new JTable(model);
        table.setRowHeight(table.getRowHeight() + 50);
        table.getColumnModel().getColumn(1).setCellRenderer(r);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.add(new JScrollPane(table));
        this.pack();
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    

    Object[][] get_data() 
        Object data[][] = new Object[][]
            "Uno, 1", "\u4e00", true,
            "Uno, 1", "\u4e01", true,
            "Uno, 1", "\u4e02", true,
            "Uno, 1", "\u4e03", true,
            "Uno, 1", "\u4e04", true
        ;
        return data;
    

    String[] get_header() 
        String header[] = new String[]"SIGNIFICADO", "KANJI", "Agregar";
        return header;
    

【讨论】:

以上是关于如何在 JTable 中将单元格居中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UICollectionView 中将单元格居中?

如何在数据网格中将单元格的内容居中?

如何在表格视图单元格的内容视图中居中 UILabel?

如何使用自定义 JTable 单元格编辑器和单元格渲染器

找到 JTable 单元格并绘制它

java的swing编程,Jtable的单元格如何赋值