JAVA движется мячом - PullRequest
0 голосов
/ 18 марта 2012

Я попытался сделать программу, чтобы на экране мяч двигался сам по себе. Но проблема в том, что он не выполняет repaint ();

Есть предложения как это исправить?

(основной класс) Main.java:

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

public class Main extends JFrame{
    static int x = 10;


    public static void main(String[] args){
        JFrame f = new JFrame("title");
        f.setVisible(true);
        f.setSize(300,250);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        sekon m = new sekon();
        f.add(m);

        antr t = new antr();
        Thread th = new Thread(t);
        th.start();
    }
}

(второй класс) sekon.java:

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

public class sekon extends JPanel{
    int xiu = 10;

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(Color.RED);
        g.fillOval(xiu, 10, 20, 20);

    }


    public void changeX(int b){
        this.xiu = b;
    }



}

     class antr extends JPanel implements Runnable{
         int xi = 10;
        sekon s = new sekon();
         public void run(){

             xi += 1;
             s.changeX(xi);
             JPanel p = new JPanel();
             p.repaint();

             try{
                 Thread.sleep(5);
                 }catch(Exception e){}
         }
    }

Ответы [ 5 ]

2 голосов
/ 18 марта 2012

1) в вашем коде repaint() заблокировано строкой кода Thread.sleep(5);

2) ваш код не работает, потому что пропущен ..., все координаты для перемещения Oval по экрану

3) для контейнера Swing, Swing JComponent использует только Swing Timer для разметки, перемещения, перекраски,

уверен, что возможно с использованием Runnable#Thread, но не так,

пример около Swing Timer

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

    public class AnimationJPanel extends JPanel {

        private static final long serialVersionUID = 1L;
        private int cx = 0;
        private int cy = 150;
        private int cw = 20;
        private int ch = 20;
        private int xinc = 1;
        private int yinc = 1;

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

                @Override
                public void run() {
                    AnimationJPanel panel = new AnimationJPanel();
                    panel.setPreferredSize(new Dimension(400, 300));
                    panel.animate();
                    JFrame frame = new JFrame("Test");
                    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                    frame.getContentPane().add(panel);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }

        public AnimationJPanel() {
            setLayout(new BorderLayout());
            JLabel label = new JLabel("This is an AnimationJPanel");
            label.setForeground(Color.RED);
            label.setHorizontalAlignment(SwingConstants.CENTER);
            add(label);
            setBackground(Color.BLACK);
            setForeground(Color.RED);
            setOpaque(true);
        }

        public void animate() {
            new Timer(15, new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    Rectangle oldCircle = new Rectangle(cx - 1, cy - 1, cw + 2, ch + 2);
                    cx += xinc;
                    cy += yinc;
                    if (cx >= getWidth() - cw || cx <= 0) {
                        xinc *= -1;
                    }
                    if (cy >= getHeight() - ch || cy <= 0) {
                        yinc *= -1;
                    }
                    repaint(oldCircle);
                    repaint(cx - 1, cy - 1, cw + 2, ch + 2);
                }
            }).start();
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawOval(cx, cy, cw, ch);
        }
}
1 голос
/ 19 марта 2012
1 голос
/ 19 марта 2012

Изучите следующий учебный пример, чтобы узнать, как вызвать перерисовку анимации.

public static void main(String args[]) throws Exception {
new JFrame("AnimationStudy") {
  int    x = 0;
  JPanel j = new JPanel() {
    protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      g.setColor(Color.RED);
      g.fillOval(x, 10, 20, 20);
      g.setColor(Color.BLACK);
      g.drawChars(("" + x).toCharArray(), 0, ("" + x).length(), x, 10);
    }
  };
  {
    setSize(300, 100);
    setLocation(300, 300);
    setVisible(true);
    setLayout(new BorderLayout());
    add(j);
    new Thread(new Runnable() {
      public void run() {
        int t = 250;
        for (x = 10; x < t; x += 1) {
          j.repaint();
          try {
            Thread.sleep((t - x) / 4);
          } catch (Exception e) {
            e.printStackTrace();
          }
        }
        System.exit(0);
      }
    }).start();
  }
};
}
1 голос
/ 18 марта 2012

Экземпляр sekon, принадлежащий объекту antr, отличается от экземпляра, добавленного в GUI.

0 голосов
/ 18 марта 2012

Ваш класс antr и основной класс используют разные экземпляры sekon. Вероятно, вам следует передать экземпляр, созданный в методе main, в класс antr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...