以比例字体格式化的 JTable 列中的对齐日期部分
Posted
技术标签:
【中文标题】以比例字体格式化的 JTable 列中的对齐日期部分【英文标题】:Alignment date parts in JTable column formatted in propotional font 【发布时间】:2011-09-24 22:23:30 【问题描述】:我需要使日期部分(dd、MMMM、yyyy)垂直对齐。我在Fixed length of month and day in date format? 提出了一个问题来插入填充字母,但我发现在比例字体的情况下它没有帮助(字母的宽度不同)。例如,使用 Lucida Fax 字体:
正在考虑为不同的日期部分制作不同的标签,但这太手动了。如果列宽很小,很难使文本换行...... 谢谢
【问题讨论】:
问题是如何制作一个日期部分垂直对齐的日期列?正如您在所附图片中看到的那样,年份没有对齐,因为山的宽度不同。 【参考方案1】:请注意,对于所有渲染器(不包括preparedRenderer),您必须/确保您必须在JTable
中的任何列/行更改后调用它
TableColumnModel m = myTable.getColumnModel();
m.getColumn(5).setCellRenderer(new SubstDateRenderer());
这里可以设置TableCell的BackGround、ForeGround
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.table.DefaultTableCellRenderer;
public class SubstDateRenderer extends DefaultTableCellRenderer
private static final long serialVersionUID = 1L;
private Date dateValue;
private SimpleDateFormat sdfNewValue = new SimpleDateFormat("dd.MMMM.yyyy");
private String sdfNewValueString = "";
public SubstDateRenderer() // formating TableCell
super();
setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
@Override
public void setValue(Object value)
if ((value != null) && (value instanceof Date))
dateValue = (Date) value;
sdfNewValueString = sdfNewValue.format(dateValue);
value = sdfNewValueString;
super.setValue(value);
【讨论】:
对不起,我不明白这个答案。此代码为日期类型创建一个 TableCellRenderer。结果是居中对齐的文本。我需要的是日期部分(dd,MM,YYYY)垂直对齐。您可以在附图中看到,年份并没有很好地对齐。 您是否尝试将 ColumnRenderer 与您在问题中链接的线程放在一起,对我来说可以一起工作,并且也可以使用 html 语法 hmmm 可能不是我的纳瓦霍语 英语,将 Html 代码/语法放在 TableCell 中,TableCell 默认返回 JLabel,JLabel 是任何可能的 ZOO 中最好的 JComponents :-)【参考方案2】:正如@mKorbel 所建议的,合适的TableCellRenderer
是正确的选择,但您可能必须覆盖paintComponent()
并使用图形上下文的FontMetrics
呈现文本,如here 所示。
如果数字月份是可以接受的,大多数按比例间隔的字体会为数字字形提供相同的恒定提前量。
【讨论】:
【参考方案3】:感谢您的回答。我为自己找到了一个使用 JTextPane 作为 TableCellRenderer 的解决方案,然后定义制表位值,并在格式化日期中使用制表符。这似乎符合我的要求,并且还具有普通文本字段的其他功能,例如自动换行...
【讨论】:
以上是关于以比例字体格式化的 JTable 列中的对齐日期部分的主要内容,如果未能解决你的问题,请参考以下文章