2016-04-25 2 views
0

У меня есть следующая программа. Предполагается напечатать красный текст на зеленой земле. Когда программа открывается, я вижу только зеленый фон, но не красный текст на нем. После изменения размера окна и повторного вычисления появляется красный текст.Java swing.JFrame только сохраняет содержимое при изменении размера окна

Он работает правильно, если я использую JPanel внутри окна и добавляю туда компонент. Если цвета заданы в paintComponent, тогда все работает нормально.

Итак, где проблема, если я рисую на JFrame напрямую. Я пропустил первое «обновление» или что-то еще? Похоже, что некоторая информация отсутствует при первом розыгрыше окна (дополнительный текст), о котором программа узнает только после того, как окно будет пересчитано и перерисовано.

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

public class PaintAWT extends JFrame { 

    PaintAWT() { 
     this.setSize(600, 400); 
     this.setLocationRelativeTo(null); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setVisible(true); 
    } 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 

     // Set background color: 
     // If you don't paint the background, one can see the red text. 
     // If I use setBackground I only see a green window, until it is 
     // resized, then the red text appears on green ground 
     this.getContentPane().setBackground(new Color(0,255,0)); 

     // Set color of text 
     g.setColor(new Color(255,0,0)); 

     // Paint string 
     g.drawString("Test", 50, 50); 
    } 

    public static void main(String[] args) { 
     new PaintAWT(); 
    } 

} 
+1

Для начала вы должны переопределить 'paintComponent', а не' paint'. И я лично рекомендую расширять 'JPanel' вместо' JFrame'. Вам также нужен способ управления вызовом 'repaint', потому что по логике Swing контейнер будет обычно перерисовываться только тогда, когда это необходимо (т. Е. При изменении размера окна). – Gorbles

ответ

4

Вы не должны устанавливать свойства компонента в методе окраски. Методы живописи предназначены только для рисования. Не используйте setBackground().

Вы должны установить фон области содержимого при создании фрейма.

Всякий раз, когда вы выполняете обычную роспись, вы также должны переопределять метод getPreferredSize(), чтобы вернуть размер компонента.

Вы также не должны расширять JFrame. Вы расширяете класс только при добавлении функциональности в класс.

Начните с чтения раздела из учебника Swing по телефону Custom Painting. Дополнительную информацию и рабочие примеры. Примеры покажут вам, как лучше структурировать ваш код, чтобы следовать соглашениям Swing.

2

Вы должны перемещать setBackground в конструктор. Установка фона в методе краски является плохим подходом.

import java.awt.Color; 
import java.awt.Graphics; 

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class PaintAWT extends JFrame { 

    PaintAWT() { 
     this.setSize(600, 400); 
     this.setLocationRelativeTo(null); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     // Set background color: 
     // If you don't paint the background, one can see the red text. 
     // If I use setBackground I only see a green window, until it is 
     // resized, then the red text appears on green ground 
     this.getContentPane().setBackground(new Color(0,255,0)); 
     this.setVisible(true); 
    } 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 


     // Set color of text 
     g.setColor(new Color(255,0,0)); 

     // Paint string 
     g.drawString("Test", 50, 50); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new PaintAWT(); 
      } 
     }); 
    } 

} 
+1

Вы не должны расширять JFrame, чтобы делать обычную роспись. Вы не должны переопределять краску(). – camickr

+0

Как насчет изменения цвета фона? Если я поместил его в конструктор вместо метода рисования, он исправлен, не так ли? – Fuzzzzel

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