gpt4 book ai didi

java - JTable-在应用默认 Nimbus 样式时覆盖prepareRenderer?

转载 作者:行者123 更新时间:2023-12-02 04:57:25 25 4
gpt4 key购买 nike

我正在使用 Nimbus。为了通过在 JTable 上重写prepareRenderer 来使事情变得简单,我通常做的第一件事是从 super 方法获取组件,这样我就可以只调整我想要的属性,同时保持其他所有内容不变。

问题是,一旦我更改该组件上的样式属性(例如背景颜色),它就会使用该颜色执行此后的每个渲染,因为它显然正在重用该 JLabel。因此,每个渲染的新单元格都会变成红色,而不仅仅是我想要的单元格。

我一直使用 HTML 来避免这种情况,但我需要操作 JLabel 的前景/背景属性。是否有人有一段代码可以设置渲染器的所有默认属性,并且我可以在下面的 applyDefaults 方法占位符中使用它?

我正在使用 Nimbus,所以我不知道这是否会让事情变得更困难。但我希望将选定/未选定和奇数/偶数行的前景/背景渲染为其默认值,然后对所有内容进行操作。

@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int col) {

final Component c =super.prepareRenderer(renderer, row, col);
applyDefaults(c, row, col); //what do I need to restore default styles here?

boolean highlightRed condtion == //some boolean condition
boolean isSelected = //calculate whether row is selected

if (c instanceof JLabel) {
if (isSelected == false && highlightRed) {
((JLabel) c).setBackground(Color.RED);
}
}

更新:按照 camickr 的建议,我为 Nimbus JTables 构建了一个方便的默认界面。 RestoreDefaultRenderer 将所有属性重置为默认的 Nimbus 颜色和对齐方式。

public interface JTableCustomRender {
static final Color foreGround = Color.black;
static final Color oddBackGround = new Color(255,255,255);
static final Color evenBackGround = new Color(242,242,242);
static final Color selectedForeGround = new Color(255,255,255);
static final Color selectedBackGround = new Color(57,105,138);

//static final ImmutableList<Class<?>> leftAlignTypes = ImmutableList.of(String.class, Date.class, DateTime.class);
static final ImmutableList<Class<?>> rightAlignTypes = ImmutableList.of(Integer.class, Double.class, Float.class, BigDecimal.class);

public Component prepareRenderer(TableCellRenderer renderer, int viewRow, int viewCol);

public default Component restoreDefaultRenderer(JTable table, Component c, int viewRow, int viewCol) {

if (c instanceof JLabel) {
final boolean rowSelected = Arrays.stream(table.getSelectedRows()).filter(i -> i == viewRow).findAny().isPresent();

JLabel label = (JLabel) c;
if (rowSelected) {
label.setForeground(selectedForeGround);
label.setBackground(selectedBackGround);
}
else {
if (viewRow % 2 == 0) {
label.setBackground(evenBackGround);
}
else {
label.setBackground(oddBackGround);
}
label.setForeground(foreGround);
}
Object value = table.getValueAt(viewRow, viewCol);

if(rightAlignTypes.contains(value.getClass())) {
label.setHorizontalAlignment(SwingConstants.RIGHT);
}
else {
label.setHorizontalAlignment(SwingConstants.LEFT);
}
}

return c;
}

}

最佳答案

it does every single render after that with that color because it apparently is reusing that JLabel.

正确,这就是为什么您需要 else 语句将背景重置回表格默认值。

查看Table Row Rendering有关如何执行此操作的示例,以便您也考虑行的选择颜色。

Does anybody have a block of code that sets all the default properties for a renderer

基本代码是:

c.setBackground( getBackground() );
c.setForeground( getForeground() );

您可以对手动绑定(bind)要覆盖的任何属性执行此操作。

关于java - JTable-在应用默认 Nimbus 样式时覆盖prepareRenderer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28635778/

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