2013-03-31 5 views
1

Я создал класс Test, скорее всего, где я ошибся.Использование awt.Graphics в методе

import javax.swing.JPanel; 
import java.awt.*; 
public class Test extends JPanel { 

Graphics grap; 
public void sun() 
{ 
    super.paintComponent(grap); 
    grap.setColor(Color.YELLOW); 
    grap.fillOval(0,0,20,20); 
} 
} 

Как вы можете видеть, что я хочу, чтобы нарисовать желтую «Овал» в верхнем левом углу панели, используя метод, но я не использовал метод PaintComponent. Теперь я пытаюсь реализовать его в моем компоненте Paint, который находится в классе под названием Painting.

//import...; 
public class Painting extends JPanel{ 

    protected void paintComponent(Graphics g) 
    { 
     Test test = new Test(); 

     test.sun(); 

    } 

И теперь я создал главное окно, которое создаст панель и отобразит желтый овал.

//import... 
public class main extends JFrame{ 
    public static main(String [] args){ 

     JFrame window = new JFrame(); 
     window.add(new Painting()); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.setSize(100,100); 
     window.setLocationRelativeTo(null); 
     window.setVisible(true); 

    } 

} 

Но это не сработает. У меня такое чувство, что это тест на солнце. Как мне заставить это работать? Я просмотрел все java-книги и не могу найти ничего, что могло бы помочь.

Обратите внимание, что я не могу добавить параметры к методу.

Thank you Tom.

+0

Что такое 'CelestialDisplayPanel'? – thejh

+0

В 'Test',' '' grap'' не будет 'null'? – thejh

ответ

2

Несколько точек здесь следует отметить:

  1. Никогда не называйте super.paintComponent самостоятельно, за исключением в перекрываться paintComponent самого метода.
  2. Если вы хотите сделать некоторые графические действия затем переопределить метод paintComponent и рисовать графики там
  3. При переопределении paintComponent метода, то первое утверждение в методе должно быть super.paintComponent(g).

Теперь, идя по всем вышеуказанным пунктам код теперь должен выглядеть так:

public class Test extends JPanel { 

public void paintComponent(Graphics grap) 
{ 
    super.paintComponent(grap); 
    grap.setColor(Color.YELLOW); 
    grap.fillOval(0,0,20,20); 
} 
} 

И ваш Painting класс должен быть таким:

public class Painting extends JPanel{ 
    Test test; 
    public Painting() 
    { 
    test = new Test(); 
    setLayout(new BorderLayout()); 
    add(test); 
    } 
} 
+0

Если я хочу нарисовать 50 овалов в разных местах, тогда у меня возникнет проблема с обширным кодом – Jonathan

+0

Вы хотите нарисовать 50 овалов в разных местах на одной панели? –

+0

Да и в разных положениях – Jonathan

2

Если я хочу нарисовать 50 овалов в разных местах, тогда у меня возникла бы проблема с обширным кодом

Затем вы сохраните список овалов, которые вы хотите нарисовать. См. Custom Painting Approaches, который рисует кучу прямоугольников на панели. Весь код делает цикл через ArrayList для рисования Rectangle. Требуется только пара строк кода.

+0

+1 для 'Список '. – trashgod