Успешное обновление Look and Feel, но все еще есть ошибки

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

Это мой класс окна:

public class Window extends JFrame {
    private static final long serialVersionUID = 1L;

    public Window() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new MigLayout());
        setExtendedState(JFrame.MAXIMIZED_BOTH);
        setMinimumSize(new Dimension(600, 700));
        setVisible(true);

        setContentPane(new JPanel() {
            private static final long serialVersionUID = 1L;

            public void paintComponent(Graphics g) {
                g.drawImage(new ImageIcon("start.jpg").getImage(), 0, 0, getWidth(),     
                    getHeight(), this);
            }
        });
    }
}

И это мое основное место, где я обновляю пользовательский интерфейс (внешний вид).

public class Main {
    public static void main(String[] args) {
        Window.setDefaultLookAndFeelDecorated(true);
        try {
            UIManager.setLookAndFeel(new SubstanceGraphiteLookAndFeel());
        }
        catch (UnsupportedLookAndFeelException e) {}
        Window window = new Window();
    }
}

Консоль говорит, что моя ошибка исходит из этой строки: Window window = new Window();

Затем эта строка: setContentPane(new JPanel() {

Но если я удалю весь блок setContentPane, ошибка укажет на конструктор.

Любая помощь будет оценена по достоинству. Спасибо!


person Community    schedule 14.05.2013    source источник
comment
Извините, а какая ошибка?   -  person Lews Therin    schedule 15.05.2013
comment
Ошибка около 200 строк :S Вот почему я только что написал, куда указывали ошибки.   -  person    schedule 15.05.2013
comment
Для начала у вас не может быть статической ссылки в анонимном классе. Если Window является внутренним классом, то применяется то же самое.   -  person MadProgrammer    schedule 15.05.2013
comment
Вам понадобится информация об ошибке, которую вы получаете. Ошибки просто недостаточно, чтобы продолжить.   -  person Adrian    schedule 15.05.2013
comment
Кстати, вы устанавливаете менеджер компоновки в JFrame, но впоследствии меняете панель содержимого (вызов setLayout в JFrame фактически устанавливает его на панели содержимого), поэтому вызов бесполезен. Вы должны обязательно вызывать JFrame.setVisible(true); в качестве последней строки. Подумайте также о вызове JFrame.pack() непосредственно перед тем, как сделать его видимым.   -  person Guillaume Polet    schedule 15.05.2013


Ответы (1)


  1. SubstanceGraphiteLookAndFeel() должен быть обернут в invokeLater().

  2. Окно Окно = новое Окно(); следует обернуть в invokeLater(), подробнее см. в учебнике Oracle Initial Thread.

  3. g.drawImage(new ImageIcon("start.jpg").getImage(), 0, 0, getWidth(), getHeight(), this);

    • использовать BufferedImage, загрузить как локальную переменную

    • paintComponent вызывается от каждой мыши, ключевых событий и внутренних методов, реализованных в API, затем довольно сложно и долго вызывается ImageIcon("start.jpg").getImage(), сколько раз любое событие запускается для перерисовки,

    • загрузить в локальную переменную

  4. setContentPane(new JPanel() {, переопределить getMin/Max/PreferredSize

person mKorbel    schedule 14.05.2013
comment
Спасибо за ответ. Не могли бы вы вкратце объяснить, почему мне нужно обернуть эти элементы в invokeLater()? - person ; 15.05.2013
comment
@Maxwell Чтобы убедиться, что все операции, связанные с пользовательским интерфейсом, выполняются в EDT (поток диспетчеризации событий). Погуглите, чтобы узнать больше). +1 - person Guillaume Polet; 15.05.2013
comment
Substance должен быть установлен в EDT, а затем обернут в invokeLater, Window window = new Window(), пожалуйста, прочитайте официальное руководство Oracle о Initial Thread и Event Dispatch Thread, для получения дополнительной информации нажмите на тег Substance. - person mKorbel; 15.05.2013