JTable中的中心文本

时间:2018-02-07 15:36:20

标签: java swing jtable alignment

我的JTable出了问题。我试着像这样把文本集中在一起:

DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment( JLabel.CENTER );
table.setDefaultRenderer(String.class, centerRenderer);
table.setDefaultRenderer(Integer.class, centerRenderer);

第一次工作,但后来我让我的程序更大,然后它再也没有工作了。我在JTabbedPane中的JPane中使用了JTable。 我在JTabbedPane中还有其他一些JPane和其他JTable。

我的问题是,如果有办法让单元格中的文本居中。

1 个答案:

答案 0 :(得分:1)

您必须在TableModel中明确指定列类型。如果您使用DefaultTableModel,则getColumnClass方法返回的默认类型为 Object ,并且因为DefaultTableCellRenderer类使用JLabel来呈现单元格,此类型保留默认对齐方式。

您可以通过更改getColumnClass方法设置每列的类型或让java识别类型:

@Override
public Class<?> getColumnClass(int column) {
    System.out.println(getValueAt(0, column).getClass());
    return getValueAt(0, column).getClass();
}

但是,如果要为不同类型的多个列定义,setDefaultRenderer方法将无效,因为它仅定义参数传递的类型并应用于整个表。理想情况是识别列并分别为其定义对齐:

//change 0 for your column index
table.getColumnModel().getColumn(0).setCellRenderer(centerRenderer);

请参阅以下示例:

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.time.LocalDate;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class JTableCreatingDemo extends JFrame {

    public void createAndShowGUI() {

        Object columnNames[] = { "String-Column", "Number-Column", "Date-Column", "Boolean-Column" };

        Object rowData[][] = { { "some text", 89, LocalDate.now(), new Boolean(true) },
                { "other text", 546, LocalDate.now(), new Boolean(false) } };

        JTable table = new JTable(rowData, columnNames) {

            @Override
            public Class<?> getColumnClass(int column) {
                return getValueAt(0, column).getClass();
            }
        };

        DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
        centerRenderer.setHorizontalAlignment(JLabel.CENTER);

        table.getColumnModel().getColumn(0).setCellRenderer(centerRenderer);
        table.getColumnModel().getColumn(1).setCellRenderer(centerRenderer);

        JScrollPane scrollPane = new JScrollPane(table);
        this.add(scrollPane, BorderLayout.CENTER);
        this.setSize(350, 150);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }

    public static void main(String args[]) throws IllegalAccessException {

        EventQueue.invokeLater(() -> new JTableCreatingDemo().createAndShowGUI());
    }
}

见作品:

enter image description here