java - JTabel 单个单元格文本对齐

标签 java swing jtable alignment tablecellrenderer

基本上我有一个 JTable,这个 JTabel 将在一个单元格中有一个产品,然后在它正下方的单元格中有成本。

产品名称应左对齐。 产品成本应右对齐。

我实际上并不关心每行中其他单元格的对齐方式。

所以我需要设置单个单元格或单个行的对齐方式。我找到了设置表格对齐方式的方法,以及设置列对齐方式的方法,但从来没有找到行/单个单元格的对齐方式。

sscce:

public class Main extends JFrame{
    public static void main(String args[]){
        new Main();
    }
    public Main(){
        super("Demo");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setExtendedState(MAXIMIZED_BOTH);
        setVisible(true);
        setLayout(new BorderLayout());
        TableModel dataModel = new AbstractTableModel() {
             Object rows[] = new Object[50];
             public int getColumnCount(){return 1;}
             public int getRowCount(){return rows.length;}
             public Object getValueAt(int row, int col){ 
                 return rows[row];
             }
             public boolean isCellEditable(int row, int col){
                 return false; 
             }
             public void setValueAt(Object value, int row, int col) {
                 rows[row] = value;
                 fireTableCellUpdated(row,0);
             }
         };

        JTable receipt = new JTable(dataModel);
        receipt.setBorder(BorderFactory.createEtchedBorder());
        receipt.setShowGrid(false);
        add(receipt,BorderLayout.CENTER);
        for(int i = 0; i < 10; i+=2){
            receipt.setValueAt("ProductNameHere",i,0);
            receipt.setValueAt("Cost",i+1,0);
        }
        validate();
        repaint();
    }
}

最佳答案

default renderer Number 是右对齐标签。在这个example ,不需要特殊的渲染器来右对齐标记为 Index 且类型为 Integer.classINT_COL

image

如果这没有帮助,请编辑您的问题以包含 sscce显示您当前的方法和您的 cost 数据类型。

附录:或者,覆盖prepareRender(),如图here .

image

JTable receipt = new JTable(dataModel) {
    @Override
    public Component prepareRenderer(TableCellRenderer renderer, int row, int col) {
        JLabel c = (JLabel) super.prepareRenderer(renderer, row, col);
        if (row % 2 == 0) {
            c.setHorizontalAlignment(JLabel.LEFT);
        } else {
            c.setHorizontalAlignment(JLabel.RIGHT);

        }
        return c;
    }
};

中南合作:

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;

public class Main extends JFrame {

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

    public Main() {
        super("Demo");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        TableModel dataModel = new AbstractTableModel() {
            Object rows[] = new Object[10];

            @Override
            public int getColumnCount() {
                return 1;
            }

            @Override
            public int getRowCount() {
                return rows.length;
            }

            @Override
            public Object getValueAt(int row, int col) {
                return rows[row];
            }

            @Override
            public boolean isCellEditable(int row, int col) {
                return false;
            }

            @Override
            public void setValueAt(Object value, int row, int col) {
                rows[row] = value;
                fireTableCellUpdated(row, 0);
            }
        };

        JTable receipt = new JTable(dataModel) {
            @Override
            public Component prepareRenderer(TableCellRenderer renderer, int row, int col) {
                JLabel c = (JLabel) super.prepareRenderer(renderer, row, col);
                if (row % 2 == 0) {
                    c.setHorizontalAlignment(JLabel.LEFT);
                } else {
                    c.setHorizontalAlignment(JLabel.RIGHT);

                }
                return c;
            }
        };
        receipt.setBorder(BorderFactory.createEtchedBorder());
        receipt.setShowGrid(false);
        add(receipt, BorderLayout.CENTER);
        for (int i = 0; i < 10; i += 2) {
            receipt.setValueAt("ProductNameHere", i, 0);
            receipt.setValueAt(Integer.valueOf(i + 1), i + 1, 0);
        }
        pack();
        setLocationByPlatform(true);
        setVisible(true);
    }
}

关于java - JTabel 单个单元格文本对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15016139/

相关文章:

java - 使用 TableModelListener 设置 JComboBox 编辑器

java - 为什么 "selectedCountry"、 "selectedAge"、 "selectedGender"返回 null ?

java - 什么时候用线程,什么时候用 WAR?

java - 未出现启动窗口 - Swing

java - 创建一个 JTable

java - 为什么在向 DefaultTableModel 添加新行时 JTable 不更新其 View ?

java - Exchange.getIn().getBody() 在第二次调用时以 Camel 形式返回空字符串

java - 如果我们记录一个对象的不可变性,我们能否将其视为不可变的?

java - 从表模型中删除行后恢复 jTable 焦点和位置

java - 双态 Action 的最佳方法