Java JTable右对齐标题

Java JTable右对齐标题,java,swing,user-interface,jtable,jtableheader,Java,Swing,User Interface,Jtable,Jtableheader,基本上,我有一个JTable,它包含的列有右对齐的单元格,但左对齐的标题看起来非常糟糕。我想右对齐这些列的标题,而不改变标题的“外观” 谢谢试试这个: ((DefaultTableCellRenderer)table.getTableHeader().getDefaultRenderer()) .setHorizontalAlignment(JLabel.RIGHT); for(int i=0;i

基本上,我有一个JTable,它包含的列有右对齐的单元格,但左对齐的标题看起来非常糟糕。我想右对齐这些列的标题,而不改变标题的“外观”

谢谢

试试这个:

((DefaultTableCellRenderer)table.getTableHeader().getDefaultRenderer())
    .setHorizontalAlignment(JLabel.RIGHT);
for(int i=0;i
下面是修改表的
TableCellRenderer
的另一种方法。对于这种用法来说,这不是绝对必要的,但它将对UI委托外观的影响降至最低

典型用法:

JTable table = new JTable(…);
JTableHeader header = table.getTableHeader();
header.setDefaultRenderer(new HeaderRenderer(table));
自定义标题渲染器:

private static class HeaderRenderer implements TableCellRenderer {

    DefaultTableCellRenderer renderer;

    public HeaderRenderer(JTable table) {
        renderer = (DefaultTableCellRenderer)
            table.getTableHeader().getDefaultRenderer();
        renderer.setHorizontalAlignment(JLabel.CENTER);
    }

    @Override
    public Component getTableCellRendererComponent(
        JTable table, Object value, boolean isSelected,
        boolean hasFocus, int row, int col) {
        return renderer.getTableCellRendererComponent(
            table, value, isSelected, hasFocus, row, col);
    }
}

上面显示的HeaderRenderer(垃圾神2011/9/21)与来自Heisenbug(2011/9/21)的代码相结合,只有在所有标题对齐相同的情况下才能正常工作

如果要以不同方式对齐不同的标题,则必须使用以下代码:

int[] alignments = new int[] { JLabel.LEFT, JLabel.RIGHT, JLabel.RIGHT };
for (int i = 0 ; i < jTable.getColumnCount(); i++){
  jTable.getTableHeader().getColumnModel().getColumn(i)
    .setHeaderRenderer(new HeaderRenderer(jTable, alignments[i]));
}
即:
GetTableCellRenderComponent
中设置对齐方式,而不是在
HeaderRenderer
构造函数中设置对齐方式

DefaultTableCellRenderer renderer = (DefaultTableCellRenderer) your_jtable.getTableHeader().getDefaultRenderer();
renderer.setHorizontalAlignment(0);
其中
0
为中心。

尝试此代码

JTableHeader jtableHeader = jtable.getTableHeader();
DefaultTableCellRenderer rend = (DefaultTableCellRenderer) jtable.getTableHeader().getDefaultRenderer();
rend.setHorizontalAlignment(JLabel.CENTER);
jtableHeader.setDefaultRenderer(rend);

我基于pvbemmelen62的解决方案创建了一个类,可以非常轻松地使用,例如:

AlignHeaderRenderer.install(myTable, new int[] { SwingConstants.RIGHT,
                        SwingConstants.RIGHT, SwingConstants.LEFT });

代码如下:

public class AlignHeaderRenderer implements TableCellRenderer {

private final TableCellRenderer renderer;
private final int alignment;

public static void install(final JTable table, final int[] alignments) {
    for (int i = 0; i < alignments.length; ++i)
        install(table, i, alignments[i]);
}

public static void install(final JTable table, final int row,
        final int alignment) {
    table.getTableHeader().getColumnModel().getColumn(row)
            .setHeaderRenderer(new AlignHeaderRenderer(table, alignment));
}

private AlignHeaderRenderer(final JTable table, final int alignment) {
    renderer = table.getTableHeader().getDefaultRenderer();
    this.alignment = alignment;
}

@Override
public Component getTableCellRendererComponent(final JTable table,
        final Object value, final boolean isSelected,
        final boolean hasFocus, final int row, final int col) {
    final Component c = renderer.getTableCellRendererComponent(table,
            value, isSelected, hasFocus, row, col);
    ((JLabel) c).setHorizontalAlignment(alignment);
    return c;
}

}
table.getTableHeader().setDefaultRenderer(new DefaultTableCellRenderer() {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
        Component c2 = dummy.getTableHeader().getDefaultRenderer().getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
        if (table.getRowCount() > 0) {
            Component c3 = table.getCellRenderer(0, col).getTableCellRendererComponent(table, value, isSelected, hasFocus, 0, col);
            if (c2 instanceof JLabel && c3 instanceof JLabel)
                ((JLabel)c2).setHorizontalAlignment(((JLabel)c3).getHorizontalAlignment());
        }
        return c2;
    }
    private final JTable dummy = new JTable();
});
公共类AlignHeaderRenderer实现TableCellRenderer{
私人最终表格;
私人最终int校准;
公共静态无效安装(最终JTable表格、最终int[]对齐){
对于(int i=0;i

其中
msisdantable
是您的表

包装默认表头时要记住的一点:不要保留它们的引用

如果您(或您的用户)在Windows 7和您的应用程序上使用Windows经典主题,@trashgood发布的内容可能会给您带来问题

它受到十年前发布的(严重)的影响。如果您的表格正在显示,并且您将Windows首选项中的主题从Aero主题切换到Windows Classic,将会出现大量NPE。您不应该保留渲染器的引用,因为它可能在某个时间点变得无效。包装应该以动态的方式完成,正如bug报告的注释中所建议的那样。我从那里获取了代码,并创建了以下可运行示例:

import java.awt.*;
导入java.lang.ref.WeakReference;
导入javax.swing.*;
导入javax.swing.table.*;
公共类TestFrame扩展了JFrame{
private static final boolean I_WANT__BUG_TO_occurse=true;
公共静态void main(字符串[]args)抛出IllegaAccessException、ClassNotFoundException、InstanceionException、UnsupportedLookandFeelexException{
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
int res=JOptionPane.showConfirmDialog(null,“您想使用XP L&F吗?”,“laffo”,JOptionPane.YES\u NO\u选项);
if(res==JOptionPane.YES\u选项){
试一试{
UIManager.setLookAndFeel(“com.sun.java.swing.plaf.windows.WindowsLookAndFeel”);
}捕获(例外情况除外){
}
}
新建TestFrame().setVisible(true);
}
});
}
公共类MyModel扩展了AbstractTableModel{
public int getRowCount(){
返回10;
}
public int getColumnCount(){
返回10;
}
公共对象getValueAt(int行索引、int列索引){
返回“+”行索引“+”X“+列索引;
}
}
公共类MyJTable扩展了JTable{
/**
*
*/
私有静态最终长serialVersionUID=-233098459210523146L;
公共MyJTable(表模型){
超级(模型);
}
公共无效剂量测定法(){
System.out.println(“呵呵”);
}
}
公共类MyAlternativeJTable扩展了JTable{
私有WeakReference WrappedHeaderRenderRef=null;
私有TableCellRenderer wrapperHeaderRenderer=null;
公共MyAlternativeJTable(表格模型){
超级(模型);
}
私有类MyAlternativeTableColumn扩展了TableColumn{
MyAlternativeTableColumn(int modelIndex){
超级(模型索引);
}
@凌驾
公共表格提交程序getHeaderRenderer(){
TableCell渲染器defaultHeaderRenderer
=MyAlternativeJTable.this.getTableHeader().getDefaultRenderer();
如果(WrappedHeaderRenderRef==null
||WrappedHeaderRenderRef.get()!=DefaultHeaderRenderRef){
WrappedHeaderRenderRef
=新的WeakReference(defaultHeaderRenderer);
包装机
=新装饰的HeaderRenderer(默认HeaderRenderer);
}
AlignHeaderRenderer.install(myTable, 0, SwingConstants.RIGHT);
AlignHeaderRenderer.install(myTable, 1, SwingConstants.RIGHT);
public class AlignHeaderRenderer implements TableCellRenderer {

private final TableCellRenderer renderer;
private final int alignment;

public static void install(final JTable table, final int[] alignments) {
    for (int i = 0; i < alignments.length; ++i)
        install(table, i, alignments[i]);
}

public static void install(final JTable table, final int row,
        final int alignment) {
    table.getTableHeader().getColumnModel().getColumn(row)
            .setHeaderRenderer(new AlignHeaderRenderer(table, alignment));
}

private AlignHeaderRenderer(final JTable table, final int alignment) {
    renderer = table.getTableHeader().getDefaultRenderer();
    this.alignment = alignment;
}

@Override
public Component getTableCellRendererComponent(final JTable table,
        final Object value, final boolean isSelected,
        final boolean hasFocus, final int row, final int col) {
    final Component c = renderer.getTableCellRendererComponent(table,
            value, isSelected, hasFocus, row, col);
    ((JLabel) c).setHorizontalAlignment(alignment);
    return c;
}

}
((JLabel)mTabBOM.getTableHeader().getDefaultRenderer()).setHorizontalAlignment( JLabel.CENTER );
DefaultTableCellRenderer renderer = (DefaultTableCellRenderer) 
MSISDNTable.getTableHeader().getDefaultRenderer();
renderer.setHorizontalAlignment(JLabel.RIGHT);
table.getTableHeader().setDefaultRenderer(new DefaultTableCellRenderer() {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
        Component c2 = dummy.getTableHeader().getDefaultRenderer().getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
        if (table.getRowCount() > 0) {
            Component c3 = table.getCellRenderer(0, col).getTableCellRendererComponent(table, value, isSelected, hasFocus, 0, col);
            if (c2 instanceof JLabel && c3 instanceof JLabel)
                ((JLabel)c2).setHorizontalAlignment(((JLabel)c3).getHorizontalAlignment());
        }
        return c2;
    }
    private final JTable dummy = new JTable();
});
  ((DefaultTableCellRenderer)jTable2.getTableHeader().getDefaultRenderer())
    .setHorizontalAlignment(JLabel.CENTER);
DefaultTableCellRenderer defaultHeaderRenderer = (DefaultTableCellRenderer) getTableHeader().getDefaultRenderer();
defaultHeaderRenderer.setHorizontalAlignment(JLabel.CENTER);         
getTableHeader().setDefaultRenderer(defaultHeaderRenderer);