当前位置: 首页 > 面试题库 >

雨云和备用行颜色

司空朝
2023-03-14
问题内容

我不明白Nimbus中交替行着色的工作方式。好像疯了!!!我想在这里清理一下。

对于演示,假设 我们想要一个JTable来交替显示红色和粉红色的行 (我不在乎哪种颜色是第一种)。

在不重新定义 执行自己的“模2”操作的 自定义cellRenderer 且没有从JTable覆盖任何方法的情况下,我想列出在启动应用程序和
仅使用Nimbus属性 获取具有自定义备用行颜色的JTable之间的强制性步骤。

这是我希望遵循的步骤:

  1. 安装Nimbus PLAF
  2. 自定义“ Table.background” nimbus属性
  3. 自定义“ Table.alternateRowColor” nimbus属性
  4. 用简单的数据/标题创建一个JTable
  5. 将jTable包裹在JScrollPane中,并将其添加到JFrame中
  6. 显示JFrame

这里的源代码:

public class JTableAlternateRowColors implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new JTableAlternateRowColors());
    }

    @Override
    public void run() {
        try {
            UIManager.setLookAndFeel(new NimbusLookAndFeel());
        } catch (UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }

        UIManager.getDefaults().put("Table.background", Color.RED);
        UIManager.getDefaults().put("Table.alternateRowColor", Color.PINK);

        final JFrame jFrame = new JFrame("Nimbus alternate row coloring");
        jFrame.getContentPane().add(new JScrollPane(new JTable(new String[][] {
                {"one","two","three"},
                {"one","two","three"},
                {"one","two","three"}
        }, new String[]{"col1", "col2", "col3"}
        )));
        jFrame.setSize(400, 300);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jFrame.setVisible(true);
    }
}

这是JDK6代码。有人可以告诉我这里出问题了吗?

根据@kleopatra的评论和整个社区的贡献,这是仅使用Nimbus属性获得替代行着色的一种/方法

公共类JTableAlternateRowColors实现Runnable {

public static void main(String[] args) {
    SwingUtilities.invokeLater(new JTableAlternateRowColors());
}

@Override
public void run() {
    try {
        UIManager.setLookAndFeel(new NimbusLookAndFeel());
    } catch (UnsupportedLookAndFeelException e) {
        e.printStackTrace();
    }

    UIManager.put("Table.background", new ColorUIResource(Color.RED));
    UIManager.put("Table.alternateRowColor", Color.PINK);
    UIManager.getLookAndFeelDefaults().put("Table:\"Table.cellRenderer\".background", new ColorUIResource(Color.RED));

    final JFrame jFrame = new JFrame("Nimbus alternate row coloring");
    final JTable jTable = new JTable(new String[][]{
            {"one", "two", "three"},
            {"one", "two", "three"},
            {"one", "two", "three"}
    }, new String[]{"col1", "col2", "col3"});
    jTable.setFillsViewportHeight(true);
    jFrame.getContentPane().add(new JScrollPane(jTable));
    jFrame.setSize(400, 300);
    jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    jFrame.setVisible(true);
}

}


问题答案:

似乎是几个错误的干扰…

为了同时更改默认表背景和默认条带化,UIManager的预期配置(不仅是您的,也是我的)(对于所有遵循alternateRow属性的LAF都是相同的):

UIManager.put("Table.background", Color.RED);
UIManager.put("Table.alternateRowColor", Color.PINK);

对Metal和Nimbus均无效

  • 金属色:无条纹,桌子全红色
  • 在雨云中:条纹白色/粉红色,即表格背景被忽略

可以在DefaultTableCellRenderer中找到第一个的根本原因:

Color background = unselectedBackground != null
                        ? unselectedBackground
                        : table.getBackground();
if (background == null || background instanceof javax.swing.plaf.UIResource) {
    Color alternateColor = DefaultLookup.getColor(this, ui, "Table.alternateRowColor");
    if (alternateColor != null && row % 2 != 0) {
        background = alternateColor;
    }
}

它的逻辑是歪曲的:仅当 表格 的背景是​​colorUIResource 时才采用替代颜色,这是一个相当微弱的区别。无论如何,它引导我们进行下一个尝试:

UIManager.put("Table.background", new ColorUIResource(Color.RED));
UIManager.put("Table.alternateRowColor", Color.PINK);

对于金属来说,这看起来不错(除了复选框渲染器的典型问题,但这是另一个错误故事;-),对于Nimbus来说仍然没有运气。

下一步是查找可能相关的Nimbus默认值,并应用(在设置LAF之后!):

UIManager.getLookAndFeelDefaults().put("Table:\"Table.cellRenderer\".background", 
    new ColorUIResource(Color.RED));

编辑 (按照评论的要求)

JXTable试图完全避开该问题-
它的剥离方法是从HighlighterFactory中检索到的Highlighter。需要通过从lookAndFeelDefaults中删除AlternativeRowColor属性并使用新的键“
UIColorHighlighter.stripingBackground”添加它来使Nimbus变得肮脏



 类似资料:
  • 问题内容: 如何为小部件设置样式,以使交替的行具有不同的背景颜色,例如,行1,3,5具有白色背景,行2,4,6具有浅蓝灰色背景? 我也想定一下。 问题答案: 几个月前我也遇到过同样的问题。 从tk文档: 基本上,您将一个标签应用于所有奇数行,将一个标签应用于每个偶数行,然后配置这些标签。 在树视图中创建项目时,请向其中添加标签: 这段代码在中创建了一个元素,并且参数将标签“ oddrow”分配给了

  • 更新时间:2018-09-15 13:45:08 概述 Link Develop开发平台为开发者提供了便捷的在线调试工具,您在开发过程中,可以选择测试设备,对设备的功能进行调试,包括查看设备上报的数据、设置某条属性的值、调用设备服务、获取设备事件等。调试过程中,您可以通过实时日志查看到调试的结果。 在“设备开发”页面点击“在线调试”,或直接选择要调试的设备,在列表中点击“调试”,进入在线调试页面。

  • 本文向大家介绍pygame实现烟雨蒙蒙下彩虹雨,包括了pygame实现烟雨蒙蒙下彩虹雨的使用技巧和注意事项,需要的朋友参考一下 学习了一天的深度学习,略有疲惫,我们用pygame搞个小游戏放松放松吧。今天我们的游戏主体是烟雨蒙蒙下彩虹雨,仿佛置身江南水乡。 游戏描述 我们希望看到江南水乡下起彩虹雨。这里背景是江南水乡,烟雨蒙蒙,雨滴颜色五颜六色,大小不一。 解决思路 烟雨蒙蒙彩虹雨的意思很明确,有

  • 1.本软件为安卓平台软件 2.通过高德地图定位获取当前的地理信息,通过地理信息获取天气信息和PM2.5信息 3.主要功能,当日天气,近期天气预报,当日空气质量,24小时天气预报              .    

  • 更新时间:2018-09-14 20:34:55 CloudClient 模块可以让设备直接与 Link Develop 平台直接相连,将设备端的属性/事件上报到 LD 平台上,也可以接收从云端(LD)下发命令和函数。CloudClient 模块直接使用TinyEngine的MQTT本地扩展对象的API。 接口说明 start(config, cb) 启动CloudClient,根据传递的配置参

  • 我建立了一套喷口和螺栓的Storm拓扑,也使用Spring进行依赖注入。 不幸的是,尽管我已经将所有的喷口和螺栓声明为@Components,但没有一个字段自动连接。 然而,在我声明拓扑的地方,Spring运行良好,所有依赖项都被正确注入。 是因为集群吗。submitTopology(“test”,conf,builder.createTopology())将拓扑提交到自动布线不起作用的集群(在本