How to center cells in JTable

I am having a 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 what happens in the image happens. I need the Kanji column to be CENTER alignment, but for some reason DefaultTableCellRenderer , `tcr, doesn't work as it should, but the default rendering does it the way it should be.

Any suggestion / help?

enter image description here

+1
java alignment center swing jtable
source share
1 answer

I compared your example with the basic principles:

  • Custom rendering r should set the alignment as well as the size and color.

  • Override model methods in the model, not in the view.

  • Swing GUI objects should only be created and processed in the event dispatch thread .

  • Use deriveFont() as needed.

  • See also this section of the tutorial on how renderers are selected.

image

 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; } } 
+8
source share

All Articles