DefaultListCellRenderer工作正常,但无法使ListCellRenderer工作

时间:2018-08-10 12:57:39

标签: java swing icons renderer

我尝试扩展"styles": [ "node_modules/bootstrap/dist/css/bootstrap.css", "src/styles.css" ], "scripts": [ "node_modules/jquery/dist/jquery.min.js", "node_modules/bootstrap/dist/js/bootstrap.js" ] 来更改文本颜色,它应该可以正常工作。但是我无法在正在渲染的DefaultListCellRenderer中显示图标。然后我尝试实现{{ 1}},而我什至无法显示JList的内容。我将渲染器设置为在ListCellRenderer上单击鼠标,如果使用JList,则单击鼠标后列表消失,但是如果使用JList,则效果很好。

我的第一个问题是为什么ListCellRenderer的内容在鼠标单击时消失了,第二个问题是为什么在DefaultListCellRenderer的情况下我无法通过添加以下代码来添加图标。

JList

以下是我渲染器的全部代码。

DefaultListCellRenderer

ImageIcon imageIcon = new ImageIcon(getClass().getResource("/images/im.png")); setIcon(imageIcon); 的代码如下:

public class RCellRenderer extends JLabel implements ListCellRenderer {

    String runm = "";

    public RCellRenderer(String runm) {
        this.runm = runm;

    }

    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
    //    Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

        if (value.equals(runm)) {
            Color fg = Color.BLACK;
            setForeground(fg);
        }

     //   return c;
     return this;
    }

}

在我的程序中执行此操作时的堆栈跟踪如下:

DefaultListCellRenderer

2 个答案:

答案 0 :(得分:0)

您尝试通过从ListCellRenderer扩展来从头实现JLabel接口 (而不是从DefaultListCellRenderer扩展 依次从JLabel开始)。

因此,您将需要实现所有方法 DefaultListCellRenderer.getListCellRendererComponent做到了, 最重要的是,这涉及将value传递给此方法 并将其放入JLabel.setText调用中。

简而言之,建议您从DefaultListCellRenderer扩展渲染器:

public class RCellRenderer extends DefaultListCellRenderer {

    String runm = "";

    public RCellRenderer2(String runm) {
        this.runm = runm;
    }

    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

        if (value.equals(runm)) {
            Color fg = Color.BLACK;
            c.setForeground(fg);
        }

        return c;
    }
}

答案 1 :(得分:0)

我刚刚删除了getClass()。getResource(...),它工作得很好。我不知道为什么,但是确实如此。工作代码如下。

public class RCellRenderer extends DefaultListCellRenderer {

    String runm = "";

    public RCellRenderer(String runm) {
        this.runm = runm;

    }

    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        ImageIcon imageIcon = new ImageIcon("images/in.png");
        setIcon(imageIcon);
        if (value.equals(runm)) {
            Color fg = Color.BLACK;
            setForeground(fg);
        }

        return c;
    }

}

此问题解决后,我还有另一个问题,可以将此图像添加到JList的最右边。