gpt4 book ai didi

java - JTable 中的居中文本

转载 作者:行者123 更新时间:2023-12-01 19:58:31 25 4
gpt4 key购买 nike

我的 JTable 有问题。我尝试像这样将文本居中:

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

第一次它可以工作,但是后来我把我的程序变大了,然后它就不再工作了。我的 JTable 位于 JTabbedPane 中的 JPane 中。我在 JTabbedPane 中还有一些其他 JPanes 以及其他 JTable。

我的问题是,是否有任何方法可以使单元格中的文本居中。

最佳答案

您必须在 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

关于java - JTable 中的居中文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48667656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com