如何在 JTable 中将单元格居中
Posted
技术标签:
【中文标题】如何在 JTable 中将单元格居中【英文标题】:How to center cells in JTable 【发布时间】:2013-06-14 00:29:34 【问题描述】:我的代码存在特定问题。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.*;
import java.awt.Color;
class ver_his_sign extends JFrame
ver_his_sign()
JTable table = new JTable();
JScrollPane scroll = new JScrollPane();
DefaultTableModel model = new DefaultTableModel(get_data(), get_header());
JFrame hk = new JFrame("Historial de Significados");
Image icon = Toolkit.getDefaultToolkit().getImage("JLPT.jpg");
ImageIcon ima = new ImageIcon("JLPT.jpg");
table = new JTable(model)
public boolean isCellEditable(int row, int col)
switch (col)
case 0:
return false;
case 1:
return false;
case 2:
return true;
default:
return false;
@Override
public Class getColumnClass(int column)
switch (column)
case 0:
return String.class;
case 1:
return String.class;
case 2:
return Boolean.class;
default:
return Boolean.class;
;
table.setFont(new Font("Microsoft JhengHei", Font.BOLD, 13)); // a custom renderer which uses a special font
DefaultTableCellRenderer r = new DefaultTableCellRenderer()
Font font = new Font("Microsoft JhengHei", Font.BOLD, 50);
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
setFont(font);
setForeground(Color.blue);
return this;
;
table.getColumnModel().getColumn(0).setCellRenderer(r);
TableColumn column = null;
DefaultTableCellRenderer tcr = new DefaultTableCellRenderer();
tcr.setHorizontalAlignment(JLabel.CENTER);
DefaultTableCellRenderer defaultRenderer = (DefaultTableCellRenderer) table.getDefaultRenderer(Object.class);
defaultRenderer.setHorizontalAlignment(JLabel.CENTER);
defaultRenderer.setFont(new Font("Microsoft JhengHei", Font.BOLD, 50));
tcr.setFont(new Font("Microsoft JhengHei", Font.BOLD, 50));
for (int i = 0; i < 3; i++)
column = table.getColumnModel().getColumn(i);
if (i == 0)
column.setPreferredWidth(200);
else
if (i == 1)
column.setPreferredWidth(100);
else
column.setPreferredWidth(300);
table.setRowHeight(table.getRowHeight() + 70);
table.setModel(model);
scroll.add(table);
this.add(scroll);
this.setTitle("Historial de Significados");
this.setSize(1350, 700);
this.setIconImage(icon);
this.setVisible(true);
this.setLocationRelativeTo(null);
scroll.setViewportView(table);
Object[][] get_data()
Object data[][] = new Object[][]
"Uno, 1", "\u4e00", true,
"Uno, 1", "\u4e01", true,
"Uno, 1", "\u4e02", true,
"Uno, 1", "\u4e03", true,
"Uno, 1", "\u4e04", true
;
return data;
String[] get_header()
String header[] = new String[]"KANJI", "SIGNIFICADO", "Agregar";
return header;
然后它会发生图像上显示的内容。我需要 Kanji 列居中对齐,但由于某种原因 DefaultTableCellRenderer
, `tcr, 没有按预期工作,但默认渲染器按预期工作。
有什么建议/帮助吗?
【问题讨论】:
+1 表示几乎完整的sscce。 :-) 【参考方案1】:我已将您的示例精简为基本要素:
您的自定义渲染器 r
应该调整对齐方式以及大小和颜色。
在模型中覆盖模型方法,而不是在视图中。
Swing GUI 对象应仅在event dispatch thread 上构造和操作。
根据需要使用deriveFont()
。
另请参阅本教程部分,了解如何选择 renderers。
import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.*;
import java.awt.Color;
import javax.swing.JLabel;
class ver_his_sign extends JFrame
public static void main(String[] args)
EventQueue.invokeLater(new Runnable()
@Override
public void run()
new ver_his_sign();
);
ver_his_sign()
DefaultTableModel model = new DefaultTableModel(get_data(), get_header())
@Override
public boolean isCellEditable(int row, int col)
switch (col)
case 0:
return false;
case 1:
return false;
case 2:
return true;
default:
return false;
@Override
public Class getColumnClass(int column)
switch (column)
case 0:
return String.class;
case 1:
return String.class;
case 2:
return Boolean.class;
default:
return Boolean.class;
;
DefaultTableCellRenderer r = new DefaultTableCellRenderer()
@Override
public Component getTableCellRendererComponent(JTable table, Object
value, boolean isSelected, boolean hasFocus, int row, int column)
super.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, column);
setForeground(Color.blue);
setHorizontalAlignment(JLabel.CENTER);
setFont(getFont().deriveFont(50f));
return this;
;
JTable table = new JTable(model);
table.setRowHeight(table.getRowHeight() + 50);
table.getColumnModel().getColumn(1).setCellRenderer(r);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.add(new JScrollPane(table));
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
Object[][] get_data()
Object data[][] = new Object[][]
"Uno, 1", "\u4e00", true,
"Uno, 1", "\u4e01", true,
"Uno, 1", "\u4e02", true,
"Uno, 1", "\u4e03", true,
"Uno, 1", "\u4e04", true
;
return data;
String[] get_header()
String header[] = new String[]"SIGNIFICADO", "KANJI", "Agregar";
return header;
【讨论】:
以上是关于如何在 JTable 中将单元格居中的主要内容,如果未能解决你的问题,请参考以下文章