【问题标题】:Color a ROW and still be able to select other Rows after it?为 ROW 着色后仍然可以选择其他行?
【发布时间】:2013-10-05 22:44:25
【问题描述】:

我遇到了一个真正的大问题,而且问题如此之大,因为我到处搜索,但找不到解决方案。

我想把一整行永远染成黄色。黄色行表示客户已经付款。在那之后,我仍然需要能够选择行(他们选择的应该是蓝色的,其他的应该是白色的)来用它们做其他事情(更新、删除等)。但这一切都变得一团糟,最后,我刚刚按下的每一行都变黄了,我不明白为什么。我正在使用自定义 tableCellRenderer。

我是否必须在每次按下某一行时证明该行是否已付款?然后把它涂成黄色或蓝色?

teilnehmertable.setDefaultRenderer(Object.class, new MyTableCellRender(teilnehmertable.getSelectedRow()));
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://10.0.0.1:3306/askoedb", "name", "pw");
            stmt = con.createStatement();
            rs1 = stmt.executeQuery("SELECT bezahlt FROM askoedb.teilnehmer");
            while (rs1.next()) {
                System.out.println(rs1.getString(1));
                if (rs1.getString(1) != null) {
                    if (selectedRow != -1) {
                        if (row == selectedRow) {
                            setForeground(Color.black);
                            setBackground(Color.yellow);
                        } else {
                            setForeground(Color.black);
                            setBackground(Color.white);
                        }
                    }
                    setText(value != null ? value.toString() : "");
                } else {
                    if (selectedRow != -1) {
                        if (row == selectedRow) {
                            setForeground(Color.white);
                            setBackground(Color.blue);
                        } else {
                            setForeground(Color.black);
                            setBackground(Color.white);
                        }
                    }
                }
            }

            return this;
        } catch (ClassNotFoundException | SQLException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                con.close();
            } catch (SQLException ex) {
                Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return this;
    }

【问题讨论】:

  • Manuel 你应该提供一个SSCCE。证明问题的有效代码。你试过什么。
  • 请提供您的自定义 tableCellRenderer 的代码,问题可能出在它的逻辑上。很可能永远的黄色应该是“布尔支付”之类的条件,而不是基于选择/行位置。
  • JTable 对每个单元格反复使用相同的单元格渲染器。我的猜测是,如果付费条件为真,您将背景设置为黄色,但您没有编写 else 块来将渲染器的颜色设置为 JTable 的默认背景付费条件为假。
  • TableModel 还必须存储每行的paid 状态。
  • 我已经编辑了代码。我只需要一些关于 getTableCellRenderComponent 方法的确切作用的帮助。我已经阅读了文档,但它并没有告诉我我需要什么。如果我设置 table.setDefaultRender,该方法会被调用多少次?如果我制作一个 system.out.println,我会得到它 100 次,但我不知道为什么......

标签: java swing jtable


【解决方案1】:

我是否必须在每次按下某一行时证明该行是否已付款?然后把它涂成黄色或蓝色?

是的,每次选择/取消选择时都会呈现该行。

请参阅Table Row Rendering 了解一种方法,该方法允许您根据特定列中的值为整行着色。

【讨论】:

    猜你喜欢
    • 2012-10-19
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    相关资源
    最近更新 更多