Я пытаюсь разработать графический интерфейс на Java, и когда я добавил следующий код, у меня возникла ошибка времени выполнения во время инициализации класса:

public class Search_Album_Main_Tab extends JPanel{
    JComboBox   search_list;
    JTextArea   searched_data;
    JButton     search_button;
    Results_Main_Tab rmt;
    Search_Action_Listener listener;

    public Search_Album_Main_Tab(Results_Main_Tab results_main_tab)
    {
        String[] search_options = {"Album", "Artist", "Genre", "ID", "Year"};
        setLayout(new GridLayout(3,1));
        rmt = results_main_tab;
        listener = new Search_Action_Listener();

        /*  Searched data   */
        searched_data = new JTextArea();

        /*  Search button   */
        search_button = new JButton("Search Album");
        search_button.addActionListener(listener);

        /*  Drop down menu  */
        search_list = new JComboBox(search_options);

        add(search_list);
        add(searched_data);
        add(search_button);     
    }

    private class Search_Action_Listener implements ActionListener
    {

        public void actionPerformed(ActionEvent event) 
        {
            if (event.getSource() == search_button)
            {

            }

        }

    }

}

Я получаю следующую ошибку:

dcm_gui.GUI at localhost:53806  
    Thread [main] (Suspended (exception NullPointerException))  
        CUIAquaComboBox.applySizeFor(JComponent, CoreUIConstants$Size) line: 454    
        CUIAquaUtilControlSize.applyUISizing(JComponent, CoreUIConstants$Size) line: 99 
        CUIAquaUtilControlSize.access$200(JComponent, CoreUIConstants$Size) line: 13    
        CUIAquaUtilControlSize$PropertySizeListener.applyComponentSize(JComponent, Object) line: 121    
        CUIAquaUtilControlSize.addSizePropertyListener(JComponent) line: 25 
        CUIAquaComboBox.installListeners() line: 47 
        CUIAquaComboBox(BasicComboBoxUI).installUI(JComponent) line: 229    
        CUIAquaComboBox.installUI(JComponent) line: 30  
        JComboBox(JComponent).setUI(ComponentUI) line: 653  
        JComboBox.setUI(ComboBoxUI) line: 238   
        JComboBox.updateUI() line: 247  
        JComboBox.init() line: 212  
        JComboBox.<init>(Object[]) line: 178    
        Search_Album_Main_Tab.<init>(Results_Main_Tab) line: 36 
        GUI.main(String[]) line: 28 
    Daemon Thread [AWT-AppKit] (Running)    
/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/bin/java (Oct 10, 2010 11:55:27 PM) 

Кто-нибудь знает, почему?

Биньямин

3
MByD 11 Окт 2010 в 02:05
Вы пытаетесь вызвать метод или получить доступ к полю объекта null где-нибудь в конструкторе Search_Album_Main_Tab. Что в строке 36?
 – 
Matt Ball
11 Окт 2010 в 02:08
Спасибо, я это вижу, но не вижу ничего, что я не инициализировал перед использованием. В этом конкретном случае я использовал конструктор с определенным строковым массивом.
 – 
MByD
11 Окт 2010 в 02:11
Строка 36 - это search_list = new JComboBox(search_options);, а search_options - это строковый массив: String[] search_options = {"Album", "Artist", "Genre", "ID", "Year"};
 – 
MByD
11 Окт 2010 в 02:23
Вы пытаетесь использовать нестандартный внешний вид?
 – 
I82Much
11 Окт 2010 в 02:37
Это моя первая реализация графического интерфейса, поэтому я не совсем уверен, я не использовал ничего, кроме пакетов AWT и Swing, считаются ли они частью «внешнего вида»?
 – 
MByD
11 Окт 2010 в 03:05

2 ответа

Лучший ответ

Это похоже на проблему с вашим индивидуальным внешним видом. Я уже сталкивался с подобной проблемой раньше, когда использовал нестандартный внешний вид. Это описано здесь:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4711700

Это было для виджета JFileChooser, а не для поля со списком, но это могло быть связано.

Первое, что вы должны попробовать, это вернуться к стандартному «металлическому» виду и ощущениям. Если это сработает, то это может быть проблема с конкретным L&F. Я раньше не использовал CUIAqua L&F, но думаю, что это официальный Apple Java L&F. Вы также можете попробовать заменить его на QuaQua. Это альтернативный Mac-подобный L&F, который может (в зависимости от фактической ошибки) избежать проблемы.

2
Erica 11 Окт 2010 в 02:53

Думаю, Эрика права насчет нестандартного внешнего вида. CUIAquaComboBox не похоже на стандартный элемент.

Если вы не уверены, какой внешний вид (LAF) вы используете, позвоните System.out.println(UIManager.getLookAndFeel());, чтобы проверить.

Что еще более важно, попробуйте вызвать это в своем основном методе до запуска графического интерфейса и посмотрите, имеет ли это значение:

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

Это будет использовать собственный LAF для вашей текущей операционной системы (если он может быть найден - и это должно работать нормально, если вы используете Windows, Mac, Linux, Solaris и т. Д.)

1
BoffinBrain 15 Дек 2010 в 15:43