当前位置: 首页 > 知识库问答 >
问题:

如何在JTable中居中单元格

狄易安
2023-03-14

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

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;
    }
}

然后它会发生在图像上出现的事情。我需要汉字列是CENTER对齐,但出于某种原因DefaultTableCellRenader,'tcr,不工作,因为它应该是,但默认渲染器正在做它应该是。

有什么建议/帮助吗?

共有1个答案

呼延明朗
2023-03-14

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

>

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

    在模型中重写模型方法,而不是在视图中。

    Swing GUI对象应仅在事件分派线程上构造和操作。

    根据需要使用deriveFont()

    另请参见本教程中有关如何选择渲染器的部分。

    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;
        }
    }
    

  •  类似资料:
    • 问题内容: 如何在单元格中居中放置值?我正在使用Netbeans。 问题答案: 您需要自定义渲染器。要居中第一列,您可以执行以下操作: 要使所有列都以String数据为中心,您可以执行以下操作:

    • 问题内容: 我正在尝试实现本教程中描述的自定义TableRenderer 。我想让渲染器对每个给定单元格很长的文本进行换行。这个想法是,使用TextArea作为渲染器,因为它支持换行。但是,以下代码无法正常工作: 我将此渲染器设置为 但是单元格条目保持未包装状态。如果我添加到该方法,则所有单元格都按预期是黄色,但没有被包裹。 有任何想法吗? 更新: 正如Michael Borgwardt在评论中指

    • 问题内容: 我有一个无法解决的问题。 众所周知,我对使用JTables还是比较陌生,所以答案可能很简单,但是我找不到解决方案:/ 所以,我有一个使用AbstractTableModel的JTable,它重写了 方法,以告知要显示的每一列的类型。其中之一是布尔值。 当我创建一个简单的JTable时,使用 一切都很好,并且使用复选框(开/关)可以正确显示布尔值。 现在,我想将文本放在每个单元格的中心(

    • 我有个问题无法解决。 一切都很好,并且使用复选框(ON/OFF)正确显示布尔值。 现在,我想将文本居中放在每个单元格上(稍后可能还有更多选项)。 因此我为每个列定义了一个新的DefaultTableCellRenderer,如下所示: 编辑:谢谢你的所有澄清。事实上,我真正的问题是:“如何影响JTable的所有DefaultRenderer,使它们将结果集中在JTable的单元格中。”

    • 问题内容: 我正在寻找一种方法来在表格单元格中显示动画进度指示器(动画GIF,通过Java2D渲染的旋转轮等,此处没有首选项),直到计算或检索出最终显示的值为止。 到目前为止,我只是在尚未准备好加速显示的每个单元格中放置了一个静态的“待处理…”文本。当数据从后台线程到达时,我将其放入适当的单元格中并在表上调用repaint。 使用静态标签或图像可以很好地工作,但是由于单元格渲染仅将其用作橡皮图章,

    • 问题内容: 我已经做过一些研究,但是找不到关于如何水平放置UICollectionView中的单元格的代码示例。 而不是第一个单元格像这样的 X00 ,我希望它像这样的 0X0 。有什么办法可以做到这一点? 编辑: 可视化我想要的东西: 当CollectionView中只有一个元素时,我需要它看起来像版本B。当我获得多个元素时,它应该类似于版本A,但具有更多元素。 目前,当我只有1个元素时,它看起