java 如何在 JTable 中居中单元格
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17157915/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to center cells in JTable
提问by Frakcool
I'm having an specific problem with my code.
我的代码有一个特定的问题。
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;
}
}
Then it happens what appears on the image. I need Kanji column to be CENTER alignment, but for some reason DefaultTableCellRenderer
, `tcr, is not working as it is supposed to be, but the default renderer is doing it as it is supposed to be.
然后它会发生图像上显示的内容。我需要汉字列居中对齐,但由于某种原因DefaultTableCellRenderer
,`tcr 没有按预期工作,但默认渲染器按预期执行。
Any suggestion / help?
有什么建议/帮助吗?
回答by trashgod
I've pared your example down to the essentials:
我已将您的示例缩减为要点:
Your custom renderer,
r
, should condition the alignment, as well as size and color.Override model methods in the model, not in the view.
Swing GUI objects should be constructed and manipulated onlyon the event dispatch thread.
Use
deriveFont()
as required.See also this tutorial section on how renderersare selected.
您的自定义渲染器
r
应调节对齐方式以及大小和颜色。覆盖模型中的模型方法,而不是视图中。
Swing GUI 对象应该只在事件分派线程上构造和操作。
deriveFont()
根据需要使用。另请参阅有关如何选择渲染器的教程部分。
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;
}
}