【发布时间】:2018-05-29 10:06:31
【问题描述】:
这应该很简单,但我不知道出了什么问题。我需要我的表格以相当大的字体大小显示,但表格画家不尊重单元格渲染器的高度。
我见过this post,当我的首选项窗口的字体大小发生变化时,它的效果非常好。但是尽管渲染器知道要使用什么字体大小,初始显示的表格使用的是标准行高 (16)。当然,桌面画家应该自动考虑渲染器的首选高度吗?还是我实际上必须手动告诉它要使用什么高度?
如下所示,我尝试调用doLayout(),但没有任何区别。
这里有一个 SSCCE 来演示这个问题:
public class IncorrectRowHeight extends JPanel
{
private class MyCellRenderer extends JTextField implements TableCellRenderer
{
private MyCellRenderer()
{
setFont(new Font("SansSerif", Font.PLAIN, 30));
setBorder(BorderFactory.createEmptyBorder());
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column)
{
setText(value.toString());
return this;
}
}
public IncorrectRowHeight()
{
super(new BorderLayout());
add(new JTextField(25), BorderLayout.PAGE_START);
String[][] data = {
{"a", "b", "c", "d", "e"},
{"f", "g", "h", "i", "j"},
{"k", "l", "m", "n", "o"},
{"p", "q", "r", "s", "t"}
};
String[] cols = {"h1", "h2", "h3", "h4", "h5"};
JTable t = new JTable(data, cols);
t.setGridColor(Color.GRAY);
t.setPreferredScrollableViewportSize(new Dimension(300, 65));
TableColumnModel model = t.getColumnModel();
for (int i = 0; i < model.getColumnCount(); i++)
{
TableColumn column = model.getColumn(i);
column.setCellRenderer(new MyCellRenderer());
}
JScrollPane scroller = new JScrollPane(t);
add(scroller, BorderLayout.CENTER);
//t.doLayout(); // doesn't help matters
}
private static void createAndShowGUI()
{
JFrame frame = new JFrame("IncorrectRowHeight");
JComponent newContentPane = new IncorrectRowHeight();
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args)
{
javax.swing.SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
}
}
它产生以下内容:
这不是火箭科学!我做错了什么?
【问题讨论】:
-
JTable使用rowHeight属性来确定行的高度。您可以考虑使用它来尝试估计行的最佳高度 -
所以,换句话说,我需要告诉 JTable 使用什么高度,它不可能足够聪明地从单元格渲染器中找出来???
标签: java swing tablecellrenderer