gpt4 book ai didi

java - JTable 列标题居中时的外观问题

转载 作者:行者123 更新时间:2023-12-02 07:34:44 24 4
gpt4 key购买 nike

我正在使用以下代码:

public final class TableCellRendererCenter extends DefaultTableCellRenderer {

public static final TableCellRenderer INSTANCE
= new TableCellRendererCenter();

protected TableCellRendererCenter() {

// Calling super
super();

this.setHorizontalAlignment(SwingConstants.CENTER);

}

}

在 JTable 列上:

    TableColumnModel retrMod = ChartItemsTable.getColumnModel();
TableColumn retrCol = retrMod.getColumn(2);

retrCol.setHeaderRenderer(TableCellRendererCenter.INSTANCE);
retrCol.setCellRenderer(TableCellRendererCenter.INSTANCE);

并且外观与其他列标题不再匹配:

enter image description here

为什么?我该如何解决这个问题?

编辑

NetBeans 似乎正在使用 DefaultTableCellHeaderRenderer,它来自 package sun.swing.table;

我到处都读到我不应该使用 sun 软件包。 Grrrrr...这没有帮助!

编辑2

0verbose 的建议产生以下结果:

enter image description here

解决方案

根据 eugener 的建议,我更新了代码如下:

public final class TableCellRendererCenter extends DefaultTableCellRenderer {

@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {

// returns component used for default header rendering
// makes it independent on current L&F

Component retr = table.getTableHeader().getDefaultRenderer().
getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, column);

if ( JLabel.class.isAssignableFrom(retr.getClass()) ) {

JLabel jl = (JLabel) retr;
jl.setHorizontalAlignment(SwingConstants.CENTER);

}

return retr;

}

@Override
public void validate() {}

@Override
public void revalidate() {}

@Override
public void firePropertyChange(
String propertyName, boolean oldValue, boolean newValue) {}

@Override
public void firePropertyChange(
String propertyName, Object oldValue, Object newValue) {}

}

我明白了:

enter image description here

外观和感觉得到保留,列标题居中! (其他列标题也居中,但我可以通过对 int row, int column 参数进行进一步测试来控制这一点)。

最佳答案

问题是您使用的单元渲染器与 LAF 使用的单元渲染器不同。 IMO 实现正确 LAF 的唯一方法是使用 LAF 本身已经提供的渲染器,例如:

public class TableHeaderRenderer extends JComponent implements TableCellRenderer {

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {

// returns component used for default header rendering
// makes it independent on current L&F

return table.getTableHeader().getDefaultRenderer().
getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

}

// following methods are overriden for performance reasons

@Override
public void validate() {}

@Override
public void revalidate() {}

@Override
public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}

@Override
public void firePropertyChange(String propertyName, Object oldValue, Object newValue) {}

}

显然,一旦您拥有适当的渲染器,您就可以将其转换为 JLabel(当然,在检查它是否正确之后),然后将文本居中或执行其他操作。

关于java - JTable 列标题居中时的外观问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6528299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com