Две вещи ...
Первая ...
Вы нарушаете 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
перед установкой размер кадра, это изменяет размер декораций кадров и может привести к непредвиденному дополнительное расстояние в пределах рамок области содержимого ...