Java 如何在JTable中居中单元格

Java 如何在JTable中居中单元格,java,swing,jtable,alignment,center,Java,Swing,Jtable,Alignment,Center,我的代码有一个特殊的问题 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.tabl

我的代码有一个特殊的问题

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;
    }
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入java.io.*;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.*;
导入java.awt.Color;
类ver\u his\u符号扩展了JFrame{
在他的标志上{
JTable table=新的JTable();
JScrollPane scroll=新建JScrollPane();
DefaultTableModel=新的DefaultTableModel(get_data(),get_header());
JFrame hk=新JFrame(“历史意义”);
Image icon=Toolkit.getDefaultToolkit().getImage(“JLPT.jpg”);
ImageIcon ima=新的ImageIcon(“JLPT.jpg”);
表=新JTable(型号){
公共布尔值可编辑(int行,int列){
开关(col){
案例0:
返回false;
案例1:
返回false;
案例2:
返回true;
违约:
返回false;
}
}
@凌驾
公共类getColumnClass(int列){
开关(列){
案例0:
返回字符串.class;
案例1:
返回字符串.class;
案例2:
返回Boolean.class;
违约:
返回Boolean.class;
}
}
};
table.setFont(新字体(“Microsoft JhengHei”,Font.BOLD,13));//使用特殊字体的自定义呈现程序
DefaultTableCellRenderer r=新的DefaultTableCellRenderer(){
Font Font=新字体(“Microsoft JhengHei”,Font.BOLD,50);
@凌驾
公共组件GetTableCellRenderComponent(JTable表、对象值、布尔isSelected、布尔hasFocus、int行、int列){
getTableCellRenderComponent(表、值、isSelected、hasFocus、行、列);
setFont(字体);
设置前景(颜色:蓝色);
归还这个;
}
};
table.getColumnModel().getColumn(0).setCellRenderer(r);
TableColumn=null;
DefaultTableCellRenderer tcr=新的DefaultTableCellRenderer();
tcr.设置水平对齐(JLabel.中心);
DefaultTableCellRenderer defaultRenderer=(DefaultTableCellRenderer)table.getDefaultRenderer(Object.class);
defaultRenderer.setHorizontalAlignment(JLabel.CENTER);
setFont(新字体(“MicrosoftJhenghei”,Font.BOLD,50));
tcr.setFont(新字体(“Microsoft JhengHei”,Font.BOLD,50));
对于(int i=0;i<3;i++){
column=table.getColumnModel().getColumn(i);
如果(i==0){
列。设置首选宽度(200);
}否则{
如果(i==1){
列。设置首选宽度(100);
}否则{
列。设置首选宽度(300);
}
}
}
table.setRowHeight(table.getRowHeight()+70);
表2.setModel(model);
滚动。添加(表格);
添加(滚动);
本集标题(“历史意义”);
这个.setSize(1350700);
此.setIconImage(图标);
此.setVisible(true);
此.setLocationRelativeTo(空);
滚动.setViewportView(表格);
}
对象[][]获取_数据(){
对象数据[][]=新对象[][]{
{“Uno,1”,“u4e00”,true},
{“Uno,1”,“u4e01”,true},
{“Uno,1”,“u4e02”,true},
{“Uno,1”,“u4e03”,true},
{“Uno,1”,“u4e04”,true}
};
返回数据;
}
字符串[]get_头(){
字符串头[]=新字符串[]{“汉字”、“有意义”、“Agregar”};
返回头;
}
}
然后发生图像上出现的情况。我需要汉字列居中对齐,但出于某种原因,`tcr'并没有按预期的方式工作,但默认的渲染器按预期的方式工作

有什么建议/帮助吗


我已将您的示例简化为要点:

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

  • 替代模型中的模型方法,而不是视图中的模型方法

  • Swing GUI对象应仅在上构造和操作

  • 根据需要使用
    deriveFont()

  • 另请参见本教程中有关如何选择的部分


我已将您的示例简化为要点:

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

  • 替代模型中的模型方法,而不是视图中的模型方法

  • Swing GUI对象应仅在上构造和操作

  • 根据需要使用
    deriveFont()

  • 另请参见本教程中有关如何选择的部分

+1用于接近完成的测试。:-)+1用于接近完成的测试。:-)
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;
    }
}