是否有在JList中使用Enum的方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否有在JList中使用Enum的方法相关的知识,希望对你有一定的参考价值。

我知道JList具有带有StringDefaultListModel的构造函数。我想找到一种使用枚举类型的JList的方法,例如JLisl<SomeEnum> jlist。有没有办法实现这一目标。这是一个小的运行示例:

import javax.swing.*;
import java.awt.*;

public class Example implements Runnable {
    private JPanel jPanel;
    private JFrame jFrame;
    private JList<Algorithm> diagnosisList;
    public static void main(String[] args) {
        EventQueue.invokeLater(new Example());
    }
    @Override
    public void run() {
        jFrame = new JFrame();
        jPanel = new JPanel();
        jPanel.setLayout(new FlowLayout());
        jFrame.getContentPane().add(jPanel);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jPanel.setPreferredSize(new Dimension(500, 300));
        DefaultListModel defaultListModel = new DefaultListModel();
        defaultListModel.add(0, "Decision Tree");
        defaultListModel.add(1, "Random Forest");
        diagnosisList = getJList(defaultListModel);

        jPanel.add(diagnosisList);

        jFrame.pack();
        jFrame.setVisible(true);
    }
    // I want to use Algorithm enum for parameter instaed of DefaultListModel
    private JList<Algorithm> getJList(DefaultListModel algorithms) {
        JList<Algorithm> jlist = new JList<Algorithm>(algorithms);
        return jlist;
    }


    enum Algorithm {
        DECISION_TREE_CLASSIFIER_DIAGNOSTIC("Decision Tree Classifier (D)", "Diagnostic"),
        RANDOM_FOREST_DIAGNOSTIC("Random Forest (D)", "Diagnostic"),
        LOGISTIC_REGRESSION_DIAGNOSTIC("Logistic Regression (D)", "Diagnostic"),
        K_MEANS_DIAGNOSTIC("KMeans (D)", "Diagnostic");

        private final String name;
        private final String type;

        Algorithm(final String name, final String type) {
            this.name = name;
            this.type = type;
        }

        @Override public String toString() {
            return name;
        }
    }
}
答案

您可以像其他数组一样将enum的值添加到JList中。例如:

public class Example implements Runnable {
    private JPanel jPanel;
    private JFrame jFrame;
    private JList<Algorithm> diagnosisList;
    private DefaultListModel<Algorithm> model;

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

    @Override
    public void run() {
        jFrame = new JFrame();
        jPanel = new JPanel();
        jPanel.setLayout(new FlowLayout());
        jFrame.getContentPane().add(jPanel);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jPanel.setPreferredSize(new Dimension(500, 300));
        model = new DefaultListModel<>();
        diagnosisList = new JList<Algorithm>(model);

        for (Algorithm a : Algorithm.values())
            model.addElement(a);

        jPanel.add(diagnosisList);

        jFrame.pack();
        jFrame.setVisible(true);
    }

    public static enum Algorithm {
        BFS, DFS, A_STAR
    }
}

而且,如果您不喜欢其呈现方式,则可以随时添加自己的ListCellRenderer

diagnosisList.setCellRenderer(new DefaultListCellRenderer() {
    private static final long serialVersionUID = 1L;

    @Override
    public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected,
            boolean cellHasFocus) {
        JLabel renderer = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        renderer.setText(renderer.getText().toLowerCase()); //something
        return renderer;
    }
});

以上是关于是否有在JList中使用Enum的方法的主要内容,如果未能解决你的问题,请参考以下文章

java和sql到JList

是否可以更改 Java Swing jList 中项目的名称*显示*?

从 JList 取回数据

C/C++ 中enum枚举量的介绍:介绍enum枚举量在C/C中的作用和使用方法

是否可以使用 jtextfield 和 Jlist 进行自动完成?

是否有在 Apache Tomcat 6.x 启动期间执行代码以执行初始化例程等的方法?