重新绘制后未调用的被覆盖的绘制方法是



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

  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);
        }
     }
  }

基本问题是你正在覆盖 PhysicsEngine 类的 paint(( 方法。但是,您永远不会将此类的实例添加到框架中。

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

阅读有关自定义绘画的 Swing 教程中的部分,了解基本的绘画信息和演示。

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

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

你的 paint 方法应该是 paintComponent

,也应该调用超类的 paintComponent 方法。

而且你没有将 PhysicsEngine JPanel 添加到 JFrame 中,在 JPanel 子类的构造函数中创建 JFrame 是非常糟糕的方法。我在main方法中创建了一个JFrame,并创建了一个PhysicsEngine(JPanel子类(的对象并将其添加到JFrame中。我通过使用这个引用物理引擎(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);
    }
}
}

相关内容

  • 没有找到相关文章

最新更新