【发布时间】:2016-01-26 02:58:57
【问题描述】:
我查看了许多关于设置 JTable 标头对齐的问题/答案,但它们似乎并未涵盖这种情况。我希望我的 JTable 标题与它们下面的数据具有相同的对齐方式;让它们都居中对我来说看起来很奇怪,特别是对于那些为偶尔的长字符串留出空间但通常只包含短字符串的列——标题本身就在空间的中心。
我见过的许多解决方案都依赖于 DefaultCellTableRenderer —— 是所有表头都使用吗?我不想设置 default 渲染器,因为这会改变 all 列;我想编写代码来计算列中数据的水平对齐方式,并将标题设置为在水平对齐方面做同样的事情。
我是否必须从渲染器中获取组件(使用特定的行、列和值)并在组件上设置对齐方式?我是否必须为此编写标题的自定义渲染器?最干净的整体方法是什么?
--编辑
先生。 Camick 的解决方案很优雅,几乎可以满足我的要求;它拦截为列标题创建表格单元格渲染器。不知何故,我所做的事情消除了标题的正常格式,但是 - 我的标题上没有阴影和边框(尽管它们按照我的意愿对齐!)。
我目前有以下内容:我在哪里可以得到表头的渲染器,所以我可以改变它的对齐方式?
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
public class TableHeaderRenderer implements TableCellRenderer
{
TableCellRenderer olderRenderer = null;
public TableHeaderRenderer(TableCellRenderer givenRenderer)
{
olderRenderer = givenRenderer;
}
// // get the default renderer for the table header.
// JTableHeader header = table.getTableHeader();
// TableCellRenderer defaultRenderer = header.getDefaultRenderer();
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column)
{
try // if the casts fail, we end up in the catch below
{
// get the renderer for the first row
DefaultTableCellRenderer firstRowTableCellRenderer = (DefaultTableCellRenderer)table.getCellRenderer(0, column);
// get the renderer for this column header
JTableHeader tableHeader = table.getTableHeader();
TableColumnModel columnModel = tableHeader.getColumnModel();
TableColumn tableColumn = columnModel.getColumn(column);
DefaultTableCellRenderer headerRenderer = (DefaultTableCellRenderer)tableColumn.getCellRenderer();
// if the renderer for the column is null, create one
if (headerRenderer == null)
{ headerRenderer = new DefaultTableCellRenderer();
}
// finally -- set the header's horizontal alignment to be the same as
// that for the first row, then get the component
headerRenderer.setHorizontalAlignment(firstRowTableCellRenderer.getHorizontalAlignment());
Component result = headerRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
return result;
}
catch (ClassCastException cce)
{
// either the first row or the header has a renderer that isn't a DefaultTableCellRenderer
// just return the component we already have
return olderRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
}
}
--
好的,编辑 2:
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
@SuppressWarnings("serial")
public class TableHeaderRendererDemo extends JFrame
{
Object[][]data = { {new Integer(1), "two", "three"},
{ new Integer(4), "five", "six" }
};
Object[] columnNames = { "first", "second", "third" };
public static void main(String ... arguments)
{ new TableHeaderRendererDemo().go();
}
public void go()
{
JTable table = new JTable(data, columnNames);
JScrollPane scrollPane = new JScrollPane(table);
// set our own default renderer for the headers
JTableHeader header = table.getTableHeader();
try
{ DefaultTableCellRenderer defaultRenderer = (DefaultTableCellRenderer)header.getDefaultRenderer();
header.setDefaultRenderer(new TableHeaderRenderer(defaultRenderer));
}
catch (ClassCastException e)
{
System.err.println("Could not cast default renderer; table headers not aligned");
}
add(scrollPane, BorderLayout.CENTER);
pack();
setVisible(true);
}
}
你可以看到我所说的标题问题;我希望整数默认为右对齐,但由于某种原因他们没有。但是您可以从中看到我遇到的问题。
【问题讨论】:
-
您真正遇到的问题不是所有
TableCellRenders 都将基于DefaultCellRenderer并且可能每个单元格都有自己的对齐方式,这取决于数据而有所不同 -
我确实意识到了,其实...
标签: java swing jtable alignment jtableheader