Есть ли способ использовать Enum в JList? - PullRequest
0 голосов
/ 01 октября 2019

Я знаю, JList имеет конструктор с String и DefaultListModel. Я хочу найти способ использовать список с типом 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 Ответ

1 голос
/ 01 октября 2019

Вы можете добавить значения 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;
    }
});
...