重绘后没有调用覆盖的绘制方法

时间:2017-11-08 17:38:01

标签: java swing graphics

我的问题实际上是创建一个具有几种不同场景的物理引擎。我想通过让每个单独运行的按钮将不同的场景合并到一个窗口中。框架正常工作,按钮显示,可以按下;然而,痛苦方法中的那条印刷线永远不会发生,从那里我得出的结论是即使在重绘之后油漆也没有被调用。我知道他们不一样,但我不明白为什么在这种情况下,与其他人相比,不会访问油漆。

  import java.awt.Graphics;
  import java.awt.Graphics2D;
  import java.awt.RenderingHints;
  import java.awt.event.*;
  import javax.swing.JFrame;
  import javax.swing.JPanel;
  import java.awt.Color;
  import javax.swing.JButton;

  public class PhysicsEngine extends JPanel{
     double x ,y;

     JFrame frame;
     JPanel pan;
     JButton b1;
     JButton b2;
     JButton b3;
     JButton b4;
     JButton b5;

     public static void main(String[] args){
        PhysicsEngine gui = new PhysicsEngine();
    }

     public PhysicsEngine(){
        frame = new JFrame("Ball Engine");

        pan = new JPanel();
        frame.add(pan);

        b1 = new JButton("1");
        b1.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent event){
              try{
                 startFirst();
              } 
              catch(InterruptedException exception){}
           }
        });
        pan.add(b1);

        b2 = new JButton("2");
        b2.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent e){
              try{
                 startSecond();
              } 
              catch(InterruptedException exception){}
           }
        });
        pan.add(b2);


        b3 = new JButton("3");
        b3.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent e){
              try{
                 startThird();
              } 
              catch(InterruptedException exception){}
           }
        });
        pan.add(b3);

        b4 = new JButton("4");
        b4.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent e){
              try{
                 startFourth();
              } 
              catch(InterruptedException exception){}
           }
        });
        pan.add(b4);

       b5 = new JButton("5");
       b5.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent e){
             try{
                startFifth();
             } 
             catch(InterruptedException exception){}
          }
       });
       pan.add(b5);

       frame.setSize(600, 600);
      frame.setVisible(true);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     }

     public void paint(Graphics g) {
          super.paint(g);

          System.out.println(""+y);

          Graphics2D g2d = (Graphics2D) g;
         g2d.setColor(Color.RED);   
         g2d.fillOval((int)x, (int)y, 30, 30);
    }

     public void startFirst() throws InterruptedException{
        x = 300;

        for(int t = 1;;t++){
           //xPos= 0*t*t + 0*t + 300 this is constant at 300
           if(y>=615) break; //stops the loop when the ball is off the screen

           y = .1*t*t + 0*t + 80; //parametric equation for y
           repaint();
           Thread.sleep(10);
        }
     }

     public void startSecond() throws InterruptedException{
        x = 300;

        for(int t = 1;;t++){
           //xPos= 0*t*t + 0*t + 300 this is constant at 300
           if(y>=615) break; //stops the loop when the ball is off the screen

           y = .1*t*t - 10*t + 550; //parametric equation for y
           repaint();
           Thread.sleep(10);
        }
     }

     public void startThird() throws InterruptedException{      
        for(int t = 1;;t++){
           if(y>=615||x>=615) break; //stops the loop when the ball is off the screen

           y = .1*t*t - 10*t + 550; //parametric equation for y
           x = 0*t*t + 5*t + 50; //parametric equation for x
           repaint();
           Thread.sleep(10);
        }
     }

     public void startFourth() throws InterruptedException{      
        for(int t = 1;;t++){
           //xPos= 0*t*t + 0*t + 300 this is constant at 300
           if(y>=615||x>=615) break; //stops the loop when the ball is off the screen

           y = t*t*t + 50; //given parametric equation for y
           x = t - 4; //given parametric equation for x
           repaint();
           Thread.sleep(10);
        }
     }

     public void startFifth() throws InterruptedException{      
        for(int t = 1;t<500 /* goes for 5 seconds */;t++){        
           y = 200*Math.sin(t) + 300; //given parametric equation for y
           x = 200*Math.cos(t) + 300; //given parametric equation for x
           repaint();
           Thread.sleep(10);
        }
     }
  }

3 个答案:

答案 0 :(得分:3)

基本问题是你要覆盖PhysicsEngine类的paint()方法。但是你永远不会在这个框架中添加这个类的实例。

然而,更大的问题是你班级的结构。您的主类不应该只是扩展JPanel,因此您可以创建一个JFrame。创建框架的逻辑应该在main()方法中,然后您的PysicsEngine面板应该包含您要为框架构建的所有组件。另外,自定义绘制应该通过覆盖paintComponent(...)方法而不是paint()方法来完成。

阅读Custom Painting上的Swing教程中有关基本绘画信息和演示的部分。

然后,您可以查看教程中的其他部分,以便更好地构建代码。例如,How to Use Buttons教程中的ButtonDemo代码将向您展示如何扩展JPanel并向其添加按钮。

答案 1 :(得分:0)

repaint()存储刷新组件的请求,请求稍后将由GUI线程执行。 组件只有在屏幕上可见时才会刷新,唉,PhysicsEngine类似乎不会被用作某个可见GUI层次结构中的可见组件。

答案 2 :(得分:0)

你的绘画方法应该是 paintComponent ,还应该调用超类的 paintComponent 方法。

并且您没有将PhysicsEngine JPanel添加到JFrame中,并且在JPanel子类的构造函数中创建JFrame是非常糟糕的方法。我在 main方法中创建一个JFrame,并创建一个PhysicsEngine(JPanel Subclass)对象并将其添加到JFrame中。我通过使用 this 添加按钮,这些按钮引用了PhysicsEngine(JPanel子类)对象。

以下是工作代码:

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JButton;

public class PhysicsEngine extends JPanel {

double x, y;

JPanel pan;
JButton b1;
JButton b2;
JButton b3;
JButton b4;
JButton b5;

public static void main(String[] args) {

    JFrame frame = new JFrame("Ball Engine");
    PhysicsEngine gui = new PhysicsEngine();
    frame.add(gui, BorderLayout.CENTER);
    frame.setSize(600, 600);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public PhysicsEngine() {

    b1 = new JButton("1");
    b1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            try {
                startFirst();
            } catch (InterruptedException exception) {
            }
        }
    });
    this.add(b1);

    b2 = new JButton("2");
    b2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            try {
                startSecond();
            } catch (InterruptedException exception) {
            }
        }
    });
    this.add(b2);

    b3 = new JButton("3");
    b3.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            try {
                startThird();
            } catch (InterruptedException exception) {
            }
        }
    });
    this.add(b3);

    b4 = new JButton("4");
    b4.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            try {
                startFourth();
            } catch (InterruptedException exception) {
            }
        }
    });
    this.add(b4);

    b5 = new JButton("5");
    b5.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            try {
                startFifth();
            } catch (InterruptedException exception) {
            }
        }
    });
    this.add(b5);

}

public void paintComponent(Graphics g) {
    super.paintComponent(g);

    System.out.println("" + y);

    Graphics2D g2d = (Graphics2D) g;
    g2d.setColor(Color.RED);
    g2d.fillOval((int) x, (int) y, 30, 30);
}

public void startFirst() throws InterruptedException {
    x = 300;

    for (int t = 1;; t++) {
        // xPos= 0*t*t + 0*t + 300 this is constant at 300
        if (y >= 615)
            break; // stops the loop when the ball is off the screen

        y = .1 * t * t + 0 * t + 80; // parametric equation for y
        repaint();
        Thread.sleep(10);
    }
}

public void startSecond() throws InterruptedException {
    x = 300;

    for (int t = 1;; t++) {
        // xPos= 0*t*t + 0*t + 300 this is constant at 300
        if (y >= 615)
            break; // stops the loop when the ball is off the screen

        y = .1 * t * t - 10 * t + 550; // parametric equation for y
        repaint();
        Thread.sleep(10);
    }
}

public void startThird() throws InterruptedException {
    for (int t = 1;; t++) {
        if (y >= 615 || x >= 615)
            break; // stops the loop when the ball is off the screen

        y = .1 * t * t - 10 * t + 550; // parametric equation for y
        x = 0 * t * t + 5 * t + 50; // parametric equation for x
        repaint();
        Thread.sleep(10);
    }
}

public void startFourth() throws InterruptedException {
    for (int t = 1;; t++) {
        // xPos= 0*t*t + 0*t + 300 this is constant at 300
        if (y >= 615 || x >= 615)
            break; // stops the loop when the ball is off the screen

        y = t * t * t + 50; // given parametric equation for y
        x = t - 4; // given parametric equation for x
        repaint();
        Thread.sleep(10);
    }
}

public void startFifth() throws InterruptedException {
    for (int t = 1; t < 500 /* goes for 5 seconds */; t++) {
        y = 200 * Math.sin(t) + 300; // given parametric equation for y
        x = 200 * Math.cos(t) + 300; // given parametric equation for x
        repaint();
        Thread.sleep(10);
    }
}
}