2015-07-22 4 views
1

Я пытаюсь написать код, чтобы нарисовать овальный прогон слева вверху вправо. Но когда я запускаю программу, она показывает пустой экран приложения. Почему это происходит?Графическое приложение просто показывает пустой экран

Вот мой код:

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

public class SimpleAnimation { 
    int x = 70; 
    int y = 70; 

    public static void main(String[] arg){ 
     SimpleAnimation gui = new SimpleAnimation(); 
     gui.go(); 
    } 

    public void go(){ 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     MyDrawPanel drawPanel = new MyDrawPanel(); 

     frame.getContentPane().add(drawPanel); 
     frame.setSize(300, 300); 
     frame.setVisible(true); 

     for (int i = 0; i < 130; i++){ 
      x++; 
      y++; 

      drawPanel.repaint(); 

      try{ 
       Thread.sleep(50); 
      } catch(Exception ex){} 
     } 
    } // close go() method 

    class MyDrawPanel extends JPanel{ 
     @Override 
     public void paintComponents(Graphics g) { 
      g.setColor(Color.green); 
      g.fillOval(x, y, 40, 40); 
     } 
    } // close inner class 
} // close outer class 
+0

Вы, кажется, переопределили 'paintComponents' вместо' paintComponent'. – RealSkeptic

ответ

1

Вы должны Override paintComponent() вместо paintComponents().

Так изменить public void paintComponents() {...} к public void paintComponent() {...}

Но только для подсказки: Try

использовать Таймеры вместо Threads. Всегда старайтесь не путаться с качающейся нитью. В вашем случае вы можете использовать javax.swing.Timer вызвать перерисовку с интервалом 50 мс:

counter = 0; 
t = new Timer(50, new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if(counter>=130) 
      t.stop(); 

     counter++; 
     x++; 
     y++; 
     drawPanel.repaint(); 
    } 
}); 
t.start(); 

javax.swing.Timer t и int counter переменные-члены для вашего класса.

Удачи.

+0

Я не думаю, что это проблема, я могу скомпилировать и запустить ее с помощью метода paintComponents. –

+0

@Vishal Zanzrukia: вы вызываете paintComponents() напрямую. и вы должны передать графику как аргумент, который я не предпочитаю. Если вы хотите просто вызвать repaint(), вы должны переопределить paintComponent(). Также переопределяя paintComponent(), вам не нужно вызывать super.paintComponents() или так. – STaefi

+0

Да, вы можете быть правы, но я только что попытался ответить с более близким к подходу PO. –

0

Вы не звоните super.paintComponent(g);, а также вам необходимо позвонить по телефону paintComponents, а не repaint. Пожалуйста, попробуйте с помощью кода ниже. Надеюсь, это поможет :)

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

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class SimpleAnimation { 
    int x = 70; 
    int y = 70; 

    public static void main(String[] arg) { 
    SimpleAnimation gui = new SimpleAnimation(); 
    gui.go(); 
    } 

    public void go() { 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    MyDrawPanel drawPanel = new MyDrawPanel(); 

    frame.getContentPane().add(drawPanel); 
    frame.setSize(300, 300); 
    frame.setVisible(true); 



    for (int i = 0; i < 130; i++) { 
     x++; 
     y++; 

     drawPanel.paintComponents(drawPanel.getGraphics()); 

     try { 
     Thread.sleep(50); 
     } catch (Exception ex) { 
     } 
    } 
    } // close go() method 

    class MyDrawPanel extends JPanel { 
    @Override 
    public void paintComponents(Graphics g) { 
     // TODO Auto-generated method stub 
     super.paintComponent(g); 
     g.drawOval(50, 50, 50, 50); 
     g.setColor(Color.green); 
     g.fillOval(x, y, 40, 40); 
    } 
    } // close inner class 
} // close outer class 
+0

Большое спасибо! :). Мне просто нужно изменить paintComponents для paintComponent, и это работает для меня. – trinhngocdieu

+0

И это не работает? –

+0

Спасибо! Он тоже работает! – trinhngocdieu

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