Странная ошибка доступности во время компиляции Swing - PullRequest
2 голосов
/ 29 сентября 2011

Вот код -

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public final class SetLabelForDemo {
    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                createAndShowGUI();             
            }
        });
    }

    private static void createAndShowGUI(){
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new JLabeledButton("foo:")); // new JLabeledButton("foo:") is the problem
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private final class JLabeledButton extends JButton{
        public JLabeledButton(final String s){
            super();
            JLabel label = new JLabel(s);
            label.setLabelFor(this);
        }
    }
}

А вот и сообщение об ошибке -

Нет доступного экземпляра типа SetLabelForDemo. Должен квалифицировать распределение с включающим экземпляром типа SetLabelForDemo (например, x.new A (), где x - это экземпляр SetLabelForDemo).

Я совсем не понимаю эту ошибку. Мне кажется, все совершенно правильно. Я что-то упустил?

Ответы [ 4 ]

3 голосов
/ 29 сентября 2011

Я знаю, что вы приняли ответ, но другой способ решить его - создать экземпляр внутреннего класса в экземпляре внешнего класса. например.,

private static void createAndShowGUI() {
   final JFrame frame = new JFrame();
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   frame.getContentPane().add(
         new SetLabelForDemo().new JLabeledButton("foo:"));
   frame.pack();
   frame.setLocationRelativeTo(null);
   frame.setVisible(true);
}

Это забавный синтаксис, но он работает. И это не имеет ничего общего с Swing и не связано с использованием внутренних классов внутри статического контекста.

3 голосов
/ 29 сентября 2011

Класс JLabeledButton должен быть статическим. Иначе, его можно создать только как часть включающего экземпляра SetLabelForDemo. Нестатический внутренний класс всегда должен иметь неявную ссылку на включающий его экземпляр.

3 голосов
/ 29 сентября 2011

Вы должны будете объявить ваш класс JLabeledButton статическим, так как вы создаете его экземпляр в статическом контексте:

private static final class JLabeledButton extends JButton {
    ...
}

Поскольку ваш метод createAndShowGUI является статическим, компилятор не знает, для какого экземпляра SetLabelForDemo вы создаете вложенный класс.

2 голосов
/ 29 сентября 2011

Пометить JLabeledButton как static класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...