JTable 中的居中文本
Center text in JTable
我的 JTable 有问题。我试图像这样将文本居中:
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment( JLabel.CENTER );
table.setDefaultRenderer(String.class, centerRenderer);
table.setDefaultRenderer(Integer.class, centerRenderer);
第一次它能工作,但后来我把我的程序变大了,然后它就不再工作了。我在 JTabbedPane 中的 JPane 中有 JTable。
我在 JTabbedPane 中还有其他一些 JPanes 以及其他 JTable。
我的问题是,是否有任何方法可以使单元格中的文本居中。
您必须在 TableModel
中明确指定列类型。如果您使用 DefaultTableModel
,getColumnClass
方法返回的默认类型是类型 Object,并且因为 DefaultTableCellRenderer
class 使用一个 JLabel 来呈现单元格,默认对齐方式留给这种类型。
你可以设置每一列的类型或者让java通过改变getColumnClass
方法来识别类型:
@Override
public Class<?> getColumnClass(int column) {
System.out.println(getValueAt(0, column).getClass());
return getValueAt(0, column).getClass();
}
但是如果你想为多个不同类型的列定义,setDefaultRenderer
方法将不起作用,因为它只为参数传递的类型定义并且适用于整个table .理想的是识别列并为其单独定义对齐方式:
//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());
}
}
查看作品:
我的 JTable 有问题。我试图像这样将文本居中:
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment( JLabel.CENTER );
table.setDefaultRenderer(String.class, centerRenderer);
table.setDefaultRenderer(Integer.class, centerRenderer);
第一次它能工作,但后来我把我的程序变大了,然后它就不再工作了。我在 JTabbedPane 中的 JPane 中有 JTable。 我在 JTabbedPane 中还有其他一些 JPanes 以及其他 JTable。
我的问题是,是否有任何方法可以使单元格中的文本居中。
您必须在 TableModel
中明确指定列类型。如果您使用 DefaultTableModel
,getColumnClass
方法返回的默认类型是类型 Object,并且因为 DefaultTableCellRenderer
class 使用一个 JLabel 来呈现单元格,默认对齐方式留给这种类型。
你可以设置每一列的类型或者让java通过改变getColumnClass
方法来识别类型:
@Override
public Class<?> getColumnClass(int column) {
System.out.println(getValueAt(0, column).getClass());
return getValueAt(0, column).getClass();
}
但是如果你想为多个不同类型的列定义,setDefaultRenderer
方法将不起作用,因为它只为参数传递的类型定义并且适用于整个table .理想的是识别列并为其单独定义对齐方式:
//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());
}
}
查看作品: