[英]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.