JTabel 单个单元格文本对齐
Posted
技术标签:
【中文标题】JTabel 单个单元格文本对齐【英文标题】:JTabel Individual Cell Text Alignment 【发布时间】:2013-02-07 14:18:37 【问题描述】:基本上我有一个JTable
,而这个JTabel
将在一个单元格中有一个产品,然后在它正下方的单元格中有成本。
产品名称应左对齐。 产品成本应向右对齐。
我实际上并不关心每一行中其他单元格的对齐方式。
所以我需要设置单个单元格或单个行的对齐方式。我找到了设置表格对齐方式和设置列对齐方式的方法,但从来没有找到行/单个单元格。
sscce:
public class Main extends JFrame
public static void main(String args[])
new Main();
public Main()
super("Demo");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setExtendedState(MAXIMIZED_BOTH);
setVisible(true);
setLayout(new BorderLayout());
TableModel dataModel = new AbstractTableModel()
Object rows[] = new Object[50];
public int getColumnCount()return 1;
public int getRowCount()return rows.length;
public Object getValueAt(int row, int col)
return rows[row];
public boolean isCellEditable(int row, int col)
return false;
public void setValueAt(Object value, int row, int col)
rows[row] = value;
fireTableCellUpdated(row,0);
;
JTable receipt = new JTable(dataModel);
receipt.setBorder(BorderFactory.createEtchedBorder());
receipt.setShowGrid(false);
add(receipt,BorderLayout.CENTER);
for(int i = 0; i < 10; i+=2)
receipt.setValueAt("ProductNameHere",i,0);
receipt.setValueAt("Cost",i+1,0);
validate();
repaint();
【问题讨论】:
安装自定义TableCellRenderer
,并根据您的单元格设置其中JLabel
的对齐方式。
根据传递给单元格渲染器的对象值,改变DefaultTableCellRenderer
的对齐方式
为sscce+1。
【参考方案1】:
Number
的 default renderer 是右对齐标签。在这个example 中,不需要特殊的渲染器来右对齐INT_COL
,它被标记为Index
,类型为Integer.class
。
如果这没有帮助,请编辑您的问题以包含一个 sscce,以显示您当前的方法和您的 cost
数据类型。
附录:或者,覆盖prepareRender()
,如here所示。
JTable receipt = new JTable(dataModel)
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int col)
JLabel c = (JLabel) super.prepareRenderer(renderer, row, col);
if (row % 2 == 0)
c.setHorizontalAlignment(JLabel.LEFT);
else
c.setHorizontalAlignment(JLabel.RIGHT);
return c;
;
SSCCE:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
public class Main extends JFrame
public static void main(String args[])
EventQueue.invokeLater(new Runnable()
@Override
public void run()
new Main();
);
public Main()
super("Demo");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
TableModel dataModel = new AbstractTableModel()
Object rows[] = new Object[10];
@Override
public int getColumnCount()
return 1;
@Override
public int getRowCount()
return rows.length;
@Override
public Object getValueAt(int row, int col)
return rows[row];
@Override
public boolean isCellEditable(int row, int col)
return false;
@Override
public void setValueAt(Object value, int row, int col)
rows[row] = value;
fireTableCellUpdated(row, 0);
;
JTable receipt = new JTable(dataModel)
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int col)
JLabel c = (JLabel) super.prepareRenderer(renderer, row, col);
if (row % 2 == 0)
c.setHorizontalAlignment(JLabel.LEFT);
else
c.setHorizontalAlignment(JLabel.RIGHT);
return c;
;
receipt.setBorder(BorderFactory.createEtchedBorder());
receipt.setShowGrid(false);
add(receipt, BorderLayout.CENTER);
for (int i = 0; i < 10; i += 2)
receipt.setValueAt("ProductNameHere", i, 0);
receipt.setValueAt(Integer.valueOf(i + 1), i + 1, 0);
pack();
setLocationByPlatform(true);
setVisible(true);
【讨论】:
我添加了一个sscce...正如我所说,我已经知道如何实现列的单独对齐,我需要单元格或行的单独对齐。 +1,用于实现 getColumnClass() 以便正确使用默认渲染器。 产品名称左对齐。产品成本应向右对齐。产品名称是一列,产品成本是第二列。根据您的要求,您需要列对齐,而不是单元格对齐。您的 SSCCE 仅显示 2 列,因此我不明白您对单元格对齐的评论。 @csga5000:或者,覆盖prepareRender()
;我听从 camickr 的 article 的主题。
我的 SSCCE 显示 1 列。我从未说过名称是一列,因为它不是,成本也不是。我说“一个单元格中的产品,然后在其正下方的单元格中的成本”,全部在 1 列中。以上是关于JTabel 单个单元格文本对齐的主要内容,如果未能解决你的问题,请参考以下文章