2015-04-28 3 views
1

Эта программа при запуске показывает овал в месте 70,70 и есть кнопка запуска. После того, как я нажму кнопку «Пуск», программа остановится в течение некоторого времени, а овал перемещается на одну позицию на юго-восток. На самом деле это должно было скатиться к другому углу.Моя программа JPanel не работает успешно

Это программа ....

package javaapplication1.pkg161; 

import java.awt.BorderLayout; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Player { 

    int x = 70; 
    int y = 70; 
    static JFrame f; 

    public static void main(String args[]) { 
     Player p = new Player(); 
     p.go(); 
    } 

    public void go() { 
     f = new JFrame("title"); 
     f.setSize(200, 200); 
     f.setVisible(true); 
     Window win = new Window(); 
     f.add(BorderLayout.CENTER, win); 
     JButton b = new JButton("Start"); 
     f.add(BorderLayout.SOUTH, b); 
     b.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       for (int i = 0; i < 130; i++) { 
        win.repaint(); 
        try { 
         Thread.sleep(50); 
        } catch (InterruptedException e1) { 
         System.out.println("error"); 
        } 
       } 
      } 
     }); 
    } 

    class Window extends JPanel { 

     public void paintComponent(Graphics g) { 
      x++; 
      y++; 
      g.fillOval(x, y, 100, 100); 
     } 

    } 
} 
+2

начала принимая взглянуть на [параллельности в свинг] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency /) и [Как использовать таймеры Swing] (http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html) – MadProgrammer

ответ

3

Свинга это однопоточные рамки, это означает, что вы не можете выполнять длительные операции в контексте события диспетчерские темы, в противном случае вы будете предотвратить обработка очереди событий, и ваша программа будет зависать.

Начните с взглянуть на Concurrency in Swing и How to use Swing Timers

Вы также нарушают контракт краски цепи. Посмотрите на Painting in AWT and Swing и Performing Custom Painting для получения более подробной информации о том, как рисование происходит в свинг

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

public class Player { 

    int x = 70; 
    int y = 70; 

    private Timer timer; 
    Window win = new Window(); 

    public static void main(String args[]) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       Player p = new Player(); 
       p.go(); 
      } 
     }); 
    } 

    public void go() { 
     JFrame f = new JFrame("title"); 
     f.add(BorderLayout.CENTER, win); 
     JButton b = new JButton("Start"); 
     f.add(BorderLayout.SOUTH, b); 
     f.pack(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setVisible(true); 

     timer = new Timer(40, new ActionListener() { 
      private int counter = 0; 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (counter < 130) { 
        counter++; 
        win.updateLocation(); 
        win.repaint(); 
       } else { 
        timer.stop(); 
        counter = 0; 
       } 
      } 
     }); 

     b.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       if (!timer.isRunning()) { 
        timer.start(); 
       } 
      } 
     }); 
    } 

    class Window extends JPanel { 

     private int x = 70; 
     private int y = 70; 

     public void updateLocation() { 
      x++; 
      y++; 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(170+130, 170+130); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.fillOval(x, y, 100, 100); 
     } 

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