问题描述
基本上我有一个JTable
,这个JTabel
将在一个单元格中有一个乘积,然后在其正下方的单元格中有成本.
Basically I have a JTable
, and this JTabel
will have a product in one cell, and then in the cell directly below it the cost.
产品名称应与左侧对齐.产品成本应与右侧对齐.
The product name should be aligned to the left.The product cost should be aligned to the right.
我实际上并不关心每行中其他单元格的对齐方式.
I don't actually care what the alignment of other cells in each row is.
所以我需要设置单个单元格或单个行的对齐方式.我找到了设置表格对齐方式的方法,以及设置列对齐方式的方法,但是没有找到行/单个单元格.
So I need to set the alignment of either individual cells, or individual rows. I've found ways to set the alignment of the table, and ways to set the alignment of the columns, but never the rows/individual cells.
场景:
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();
}
}
推荐答案
Number的nofollow noreferrer>默认渲染器是右对齐的标签.在此示例中,不需要特殊的渲染器即可将INT_COL
右对齐,该标签标记为Index
且类型为Integer.class
.
The default renderer for Number
is a right aligned label. In this example, no special renderer is required to right align INT_COL
, which is labeled Index
and has type Integer.class
.
如果这没有帮助,请编辑您的问题,以包含 sscce ,其中显示了您当前的做法和您的cost
数据类型.
If this is not helpful, please edit your question to include an sscce that shows your current approach and your cost
data type.
附录:或者,覆盖prepareRender()
,如此处所示.
Addendum: Alternatively, override prepareRender()
, as shown 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);
}
}
这篇关于JTabel单个单元格文本对齐的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!