2014-08-21 1 views
0

Я пытаюсь показать простое изображение с помощью JFrame и JComponent. Я прочитал некоторые из существующих вопросов и ответов, но это бесполезно. Ниже приведены мои коды моих подклассов JComponent и JFrame:Ошибка отображения JFrame

import java.awt.*; 
import javax.swing.JComponent; 

public class FaceComponent extends JComponent { 

public FaceComponent() {   
} 

public void painComponent(Graphics g) { 

    g.setColor(Color.WHITE); 
    g.fillRect(0, 0, getWidth(), getHeight()); 

    g.setColor(Color.YELLOW); 
    g.fillOval(60, 60, 200, 200); 

    g.setColor(Color.MAGENTA); 
    g.fillOval(90, 100, 40, 20); 
    g.fillOval(180, 100, 40, 20); 

    g.setColor(Color.PINK); 
    g.drawLine(120, 160, 140, 180); 
    g.drawLine(140, 180, 160, 160); 
    g.drawLine(120, 160, 140, 200); 
    g.drawLine(140, 200, 160, 160); 

    g.setColor(Color.BLACK); 
    g.setFont(new Font("SansSerif", Font.ITALIC, 24)); 
    g.drawString("Whatsup", 30, 200); 

} 

} 

Вот мой FaceWindow с JFrame импортирован:

import javax.swing.JFrame; 

public class FaceWindow { 
public static void main(String[] args) { 

    JFrame frame = new JFrame(); 
    frame.setTitle("lab09ex1"); 
    frame.setSize(400, 300); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setResizable(true); 
    frame.setVisible(true); 

    FaceComponent fc = new FaceComponent(); 
    frame.add(fc); 
} 
} 

Но она заканчивается с пустым серым дисплеем экраном вместо того, что я вход в мою программу. Что случилось? Извините, что не задан в этом вопросе, но это единственный способ показать вам текущую ситуацию.

ответ

2

В FaceComponent, painComponent должен быть paintComponent

  • Там нет необходимости этот метод, чтобы быть public, вы никогда не хотите, чтобы кто-нибудь когда-нибудь назвать. Вы всегда должны использовать аннотацию @Override, когда вы пытаетесь переопределить метод, это поднимет компиляцию до ошибки, если вы допустите ошибку, сэкономив вам много времени впустую ...
  • Использование new Font("SansSerif", Font.ITALIC, 24) в рамках метода paint не рекомендуется , так как это может занять время, если необходимо загрузить шрифт. Лучше предварительно загрузить его в конструктор и применить его по мере необходимости.
  • FaceComponent должен переопределить метод getPreferredSize и должен возвращать «предпочтительный» или «по умолчанию» размер, это гарантирует, что компонент не будет автоматически установлен на 0x0 некоторыми менеджерами компоновки.
  • Рассмотрите возможность использования pack над setSize
  • Убедитесь, что вы всегда добавлять компоненты к каркасу прежде, чем сделать его видимым, это также будет решать проблемы с компонентами не появляется, когда кадр первый становится видимым
  • Вы должны всегда много уверен что вы создаете и модифицируете пользовательский интерфейс в контексте события Dispatching Thread, см. Initial Threads.
+0

Я не могу даже заметить thattttt! Удивительно, что вы заметили, что сразу после того, как я разместил вопрос! В любом случае thx для вашего ответа :) – tommy

+0

Посмотрите первую «новую» точку для подсказки о том, как ее избежать в будущем;) – MadProgrammer