2014-12-03 3 views
0

У меня проблема. Мой JFrame начинается с содержимого внутри него, но прозрачно отображается с содержимым сверху.JFrame Фоновая ошибка: Нежелательная прозрачность

package javagame; 

import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JFrame; 

public class JavaGame extends JFrame{ 

    public JavaGame(){ 
     setTitle("Java Game"); 
     setSize(500, 500); 
     setResizable(false); 
     setVisible(true); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public void paint (Graphics g){ 
     g.drawString("Hello World!", 250, 250); 
    } 

    public static void main(String[] args){ 

     new JavaGame(); 

    } 

} 

Помощь ценится! (:

ответ

2

Две вещи ...

Первая ...

Вы нарушаете paint цепь ...

public void paint (Graphics g){ 
    // You MUST call super.paint here... 
    g.drawString("Hello World!", 250, 250); 
} 

Второй

Вы должны избегать, на всех стоимость, переопределяющая paint контейнера верхнего уровня, такого как JFrame. Множество причин, один из которых вы только что нашли, но также и потому, что контейнеры верхнего уровня повторно не забуференный буфером, который введет мерцание при окрашивании, а JFrame содержит кучу других компонентов, JRootPane, панель содержимого, стеклянное стекло ... все из которых могут нарисовать то, что вы пытаетесь нарисовать.

Кроме того, картина непосредственно к раме позволяет рисовать под декорациями врезки, которая не является на самом деле то, что вы хотите сделать ...

Например (почему это плохо) ...

Решение ...

Создайте пользовательский класс, простирающийся от чего-то вроде JPanel, и переопределите его метод paintComponent и выполните свою собственную покраску. Вы получаете бесплатную поддержку двойной буферизации и больше не должны беспокоиться о границах фрейма, так как панель содержимого гарантирует, что она поддерживается внутри фреймов.

См Painting in AWT and Swing и Performing Custom Painting для получения более подробной информации

Кроме того, вызов setResizable перед установкой размер кадра, это изменяет размер декораций кадров и может привести к непредвиденному дополнительное расстояние в пределах рамок области содержимого ...

Смежные вопросы