有没有一种方法可以在JList中使用Enum?

时间:2019-10-01 07:50:31

标签: java swing enums jlist

我知道JList的构造函数包含StringDefaultListModel。我想找到一种使用enum类型的列表的方法,例如JList<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;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您可以像其他数组一样将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;
    }
});