Java - JPanel не будет отображаться в JFrame при переопределении краски JFrame - PullRequest
1 голос
/ 21 сентября 2010

У меня есть JFrame, на котором я использую переопределение метода paint для отображения некоторой графики. Я также хочу добавить к нему JPanel, который будет отображаться поверх графики. Сейчас я вижу только графику, созданную методом рисования JFrame.

Вот мой JPanel:

public class NoteDraw extends JPanel {

    public NoteDraw() {
        setSize(200, 100);
        setBackground(Color.BLACK);
    }

    @Override public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillRect(0, 0, 100, 100);
    }
}

Вот мой JFrame:

public class ui extends JFrame {
    public void paint(Graphics g) {
        //do some drawing here...
    }
}

Вот мой главный:

public class Main {
    static ui main_gui = new ui();

    public static void main(String[] args) {
        NoteDraw note = new NoteDraw();
        main_gui.getContentPane().add(note);
        main_gui.setVisible(true);
    }
}

Ответы [ 2 ]

1 голос
/ 22 сентября 2010

Вы НИКОГДА не должны переопределять метод paint () JFrame (если вы действительно не знаете, что делаете).Этот метод отвечает за все оптимизированное поведение рисования Swing.

Пользовательское рисование всегда должно выполняться путем переопределения метода paintComponent () компонента Swing, как вы это делали на панели NoteDraw.

Причина, по которой код в методе рисования не отображается, заключается в том, что панель NoteDraw непрозрачна, и поэтому панель рисует поверх графического кода в вашем методе рисования.

Таким образом, решение заключается в перемещении графикикод рисования на панель NoteDraw.

Или, если вы пытаетесь создать какое-то фоновое изображение для вашего кадра, вы можете попробовать использовать Панель фона .

Или, если вам действительно нужно настраивать рисование, создайте фоновую панель и переопределите метод paintComponent ().Затем вы устанавливаете макет BorderLayout и добавляете эту панель к фрейму.Затем вы делаете панель NoteDraw непрозрачной и добавляете ее на пользовательскую фоновую панель.Теперь фон будет виден на панели NoteDraw.

0 голосов
/ 21 сентября 2010

Не забудьте вызвать super.paint() при переопределении метода paint().

Таким образом, вы все еще используете поведение, определенное в родительском классе, и можете безопасно добавлять свои модификации.


Ресурсы:

...