0

私は今日早く質問を投稿し、MadProgrammer から ListCellRenderer を使用して目的の結果を得るように指示されました。ほとんど機能していますが、コンボボックスに同じエントリが 2 回表示されており、その理由がわかりません。このなぞなぞを解くのを手伝ってください。コード:

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

public class NotWorking extends JPanel {
    private JPanel editPanel;
    private JComboBox<String> editComboLevel;
    private JComboBox editCombo;
    private String[] levels = {"Level 1", "Level 2", "Level 3"}; 
    private static ArrayList<NotWorking> course = new ArrayList<NotWorking>();
    public static String courseNum, courseTitle, courseLevel;

    public JPanel createContentPane (){

        Integer[] intArray = new Integer[course.size()];
        for (int i = 0; i < course.size(); i++) {
            intArray[i] = new Integer(i);
        }

        editPanel = new JPanel(new GridLayout(4,2));
        editPanel.setPreferredSize(new Dimension(100,75));
        editPanel.add(editCombo = new JComboBox(intArray));
        ComboBoxRenderer renderer= new ComboBoxRenderer();
        editCombo.setRenderer(renderer);

        return editPanel;
        }

        NotWorking() {}
        NotWorking(String courseNum, String courseTitle, String courseLevel) {
            this.courseNum = courseNum;
            this.courseTitle = courseTitle;
            this.courseLevel = courseLevel;
        }
        @Override
        public String toString() {
            String courseInfo = getCourseNum() + ", " + getCourseTitle() + ", " + getCourseLevel();
            return courseInfo; 
        }
        public String getCourseNum() {
            return this.courseNum;          
        }
        public String getCourseTitle() {
            return this.courseTitle;
        }
        public String getCourseLevel() {
            return this.courseLevel;
        }
        public void setCourseNum(String courseNum) {
            this.courseNum = courseNum;
        }
        public void setCourseTitle(String courseTitle) {
            this.courseTitle = courseTitle; 
        }
        public void setCourseLevel(String courseLevel) {
            this.courseLevel = courseLevel;
        }

        private static void createAndShowGUI() {
            JFrame frame = new JFrame("Example of Code Snippet");
            NotWorking myCourse = new NotWorking();
            frame.setContentPane(myCourse.createContentPane());
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo(null);
            frame.pack();
            frame.setVisible(true);
        }

        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
            course.add(new NotWorking("Course1", "Course1 desc", "Level 1"));
            course.add(new NotWorking("Course2", "Course2 desc", "Level 2"));
            createAndShowGUI();
            for(NotWorking item : course)
                System.out.println(item);
            }
        });
    }
    class ComboBoxRenderer extends JLabel
                           implements ListCellRenderer {
        public ComboBoxRenderer() {
            setOpaque(true);
            setHorizontalAlignment(CENTER);
            setVerticalAlignment(CENTER);
        }

        public Component getListCellRendererComponent(
                                           JList list,
                                           Object value,
                                           int index,
                                           boolean isSelected,
                                           boolean cellHasFocus) {
            int selectedIndex = ((Integer)value).intValue();

            if (isSelected) {
                setBackground(list.getSelectionBackground());
                setForeground(list.getSelectionForeground());
            } else {
                setBackground(list.getBackground());
                setForeground(list.getForeground());
            }

            setText(getCourseNum());

            return this;
        }
    }
}

ご覧のとおり、ArrayList に 2 つの追加があります。コース番号のみを表示するようにコンボボックスの表示を制限していますが、Course2 が 2 回表示され、ArrayList の内容を印刷すると、Course2 のすべての詳細が 2 回表示され、Course1 の詳細は表示されません。どんな助けでも大歓迎です。乾杯

4

1 に答える 1

3

カスタム レンダラーの使用は、ソリューションの半分にすぎません。カスタム レンダラーは、コンボ ボックスのキーボードを使用して、既定の項目の選択を解除します。詳細およびより完全なソリューションについては、カスタム レンダラーを使用したコンボ ボックスを参照してください。

コードの主な問題は NotWorking クラスです。このクラスは JPanel を拡張してはなりません。クラスの 3 つのプロパティを保持するために使用されるクラスです。コース番号、タイトル、およびレベルは、静的変数であってはなりません。Swing コンポーネントへの参照があってはなりません。

デザインは、NotWorking クラス用の 1 つのクラスと、GUI を作成するための別のクラスである必要があります。

より良い設計のために、コンボ ボックスの使用方法に関する Swing チュートリアルのセクションから始めます。次に、チュートリアルのサンプル コードをカスタマイズして、ComboBoxDemo.java文字列データを追加する代わりに NotWorking クラスをコンボ ボックスに追加します。

于 2013-12-07T06:16:38.603 に答える