简体   繁体   English

JTable中的中心文本

[英]Center text in JTable

I've a problem with my JTable. 我的JTable有问题。 I tried to center the text like this: 我试图像这样使文本居中:

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

at first time it worket, but then I made my program bigger and then it doesn't work anymore. 刚开始工作时,但是后来我把程序做大了,然后就不起作用了。 I've the JTable in a JPane that is in a JTabbedPane. 我在JTabbedPane中的JPane中有JTable。 I've in the JTabbedPane some other JPanes also with other JTable's. 我在JTabbedPane中还有其他一些JPanes和其他JTable。

My Question is, if there is any way to get the text in the cell's centered. 我的问题是,是否有任何方法可以使文本位于单元格的中心。

You must explicitly specify the column type in TableModel . 您必须在TableModel显式指定列类型。 If you are using DefaultTableModel , the default type returned by the getColumnClass method is type Object , and because the DefaultTableCellRenderer class uses a JLabel to render the cells, the default alignment is left for this type. 如果使用DefaultTableModel ,则getColumnClass方法返回的默认类型为Object ,并且由于DefaultTableCellRenderer类使用JLabel渲染单元格,因此该类型保留默认对齐方式。

You can set the type of each column or let java identify the type by changing the getColumnClass method: 您可以设置每个列的类型,或者通过更改getColumnClass方法让java标识类型:

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

But if you want to define for more than one column with different types, the setDefaultRenderer method will not work because it defines only for the type passed by parameter and applies to the whole table. 但是,如果要为多个类型不同的列进行定义,则setDefaultRenderer方法将不起作用,因为它仅针对通过参数传递的类型进行定义,并适用于整个表。 The ideal is to identify the column and define the alignment separately for it: 理想的是识别列并为其单独定义对齐方式:

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

See this applied on a example: 参见以下示例:

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

See works: 查看作品:

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM