【问题标题】:Modify text alignment in a JTable cell修改 JTable 单元格中的文本对齐方式
【发布时间】:2013-12-19 05:55:22
【问题描述】:

我找到了一种在表格中分配单元格的方法,好像是Component

JTable table = new JTable(...)
{
    public Component prepareRenderer(
        TableCellRenderer renderer, int row, int column)
    {
        Component c = super.prepareRenderer(renderer, row, column);

        //  add custom rendering here

        return c;
    }
};

在代码中,c 是组件,但我在Component 中找不到修改文本对齐方式的方法。这种方法有什么问题吗?

【问题讨论】:

    标签: java swing jtable alignment renderer


    【解决方案1】:

    为此使用DefaultTableCellRenderer,它有setHorizontalAlignment() 方法:

    DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(){
        @Override
        public Component getTableCellRendererComponent(JTable arg0,Object arg1, boolean arg2, boolean arg3, int arg4, int arg5) {
             Component tableCellRendererComponent = super.getTableCellRendererComponent(arg0, arg1, arg2, arg3, arg4, arg5);
             int align = DefaultTableCellRenderer.CENTER;
             if(condition){
                 align = DefaultTableCellRenderer.LEFT;
             }
            ((DefaultTableCellRenderer)tableCellRendererComponent).setHorizontalAlignment(align);
             return tableCellRendererComponent;
        }
    };
    t.getColumnModel().getColumn(COLUMN).setCellRenderer(renderer);
    

    COLUMN是目标列,condition是切换条件。

    【讨论】:

    • 你可以将方法应用于单个单元格,而不是整列或整行吗?
    【解决方案2】:

    (J)Component还没有在 API 中实现此方法

    有两种方法

    1. 通过将(J)Component 转换为JLabel

    2. 为由getColumnClass管理的class设置此值

    .

    DefaultTableCellRenderer stringRenderer = (DefaultTableCellRenderer)
         table.getDefaultRenderer(String.class);
    stringRenderer.setHorizontalAlignment(SwingConstants.CENTER);
    

    【讨论】:

    • 我没有做(JLabel)c.**。 Eclipse拒绝了我。有什么线索吗?
    • 你可以通过两种方式进行转换 1. JLabel label = (JLabel) c; 作为下一行并从Component c = super.prepareRenderer(renderer, row, column); 开始,然后returns label 而不是return c;, 2 在代码中转换,什么时候真的需要((JLabel) c).setHorizontalAlignment(SwingConstants.CENTER); prepareRenderer 的其余部分保持不变
    • 我试过你的代码,好像我不能把'c'转换成JLabel,而把它转换成DefaultTableCellRenderer是可行的。
    【解决方案3】:

    我要下结论了。

    对于这个具体的问题,我们可以分为两种:

    1. 分配单元格
    2. 调整其对齐方式

    分配单元格,我原来的方式和alex2410的方式应该都有用。

    JTable table = new JTable(...)
    {
        public Component prepareRenderer(
            TableCellRenderer renderer, int row, int column)
        {
            Component c = super.prepareRenderer(renderer, row, column);
    
            //  add custom rendering here
    
            return c;
        }
    };
    

    另一个

    DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(){
        @Override
        public Component getTableCellRendererComponent(
                 JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
             Component c = super.getTableCellRendererComponent(arg0, arg1, arg2, arg3, arg4, arg5);
    
             //  add custom rendering here
    
             return c;
        }
    };
    t.getColumnModel().getColumn(COLUMN).setCellRenderer(renderer);
    

    对于对齐,我发现唯一有用的方法是:

    ((DefaultTableCellRenderer)c).setHorizontalAlignment(SwingConstants.center);
    

    在 mKorbel 的建议中,您可以将 Component c 转换为 JLabel,但我没有做到这一点。

    【讨论】:

      猜你喜欢
      • 2013-10-03
      • 1970-01-01
      • 2023-04-02
      • 2011-01-25
      • 1970-01-01
      • 2014-01-10
      • 2014-05-25
      • 2016-11-28
      • 2016-02-27
      相关资源
      最近更新 更多