【问题标题】:How to convert JPanel into JFrame for a Bouncing Ball?如何将 JPanel 转换为 JFrame 用于弹跳球?
【发布时间】:2016-07-16 17:22:35
【问题描述】:

我从其他地方获得了用于弹跳球的 Java Swing 代码。该代码使用扩展JPanel 的类“Ball”。

谁能帮我将此代码转换为扩展JFrame

我想这样做,这样我就可以从另一个框架类中调用它。 代码如下:

public class Ball extends JPanel{ 
    int x=0, y=0;
    int angleX = 1, angleY = 1;

    public void move(){
        if (x + angleX <0) {
            angleX =1;
        } else if (x + angleX >getWidth()-50){
            angleX =-1;
        } else if (y + angleY <0) {
            angleY =1;
        } else if (y + angleY >getHeight()-50){
            angleY =-1;
        }
        x = x + angleX;
        y = y + angleY;
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillOval(x, y, 50, 50);
    }

    public static void main(String[] args){
        JFrame jfrm= new JFrame("BounceBall");
        jfrm.setSize(400,400);
        jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jfrm.setVisible(true); 

        Ball bl = new Ball();
        Component add = jfrm.add(bl);

        while (true){
            bl.move();
            bl.repaint();
            try{
               Thread.sleep(10);
            }catch(InterruptedException e){   
            }
        }
    }
}

【问题讨论】:

  • “谁能帮我将此代码转换为扩展 JFrame。” 1) 只需将面板添加到框架!绝对没有理由扩展框架。 2) SO 是针对特定技术问题的,而您似乎正在尝试寻找导师。投票结束时“过于广泛”..
  • “我从其他地方获得了 Java Swing 代码..” 该代码的作者不知道他们做得好到足以知道他们覆盖了错误paint 方法,因此我们可以提供的最佳建议是将其放回您找到它的位置,并阅读 Java 教程的 Performing Custom Painting 课程。
  • “我想这样做,这样我就可以从另一个 JFrame 类中调用它。” 哇!这么短的问题有这么多糟糕的想法。见The Use of Multiple JFrames, Good/Bad Practice?
  • 你是什么意思“从另一个JFrame类调用它”?就像在例如之后弹出某种形式一样按钮按下?如果是这样,您应该使用 JDialog,并将此面板添加到其中。

标签: java swing jframe jpanel paint


【解决方案1】:

只需扩展 JFrame 并为 Ball 类创建一些构造函数。

  • 您可以从任何其他JFrame 类中的Ball 类创建一个实例。
    • Ball bl = new Ball();/*then call methods*/
  • 或者只是通过两种方式调用Balls main 方法:
    • Ball.main(null);
    • String args[]={/*some arguments*/}; Ball.main(args);

这是您的 Ball 类,它现在扩展了 JFrame

import java.awt.Graphics;
import javax.swing.JFrame;

public class Ball extends JFrame {

    public Ball() {
        setSize(400, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    int x = 0, y = 0;
    int angleX = 1, angleY = 1;

    public void move() {
        if (x + angleX < 0) {
            angleX = 1;
        } else if (x + angleX > getWidth() - 50) {
            angleX = -1;
        } else if (y + angleY < 0) {
            angleY = 1;
        } else if (y + angleY > getHeight() - 50) {
            angleY = -1;
        }
        x = x + angleX;
        y = y + angleY;
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillOval(x, y, 50, 50);
    }

    public static void main(String[] args) {

        Ball bl = new Ball();

        while (true) {
            bl.move();
            bl.repaint();
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
            }
        }
    }
}

【讨论】:

  • 您的回答是通过复制原始源代码中的问题来鼓励不良做法。除此之外,它还扩展了框架,尽管这是 OP 要求的,但完全没有必要。
  • Anyone help me converting this code to extends JFrame instead. 我刚刚帮忙,我更改了部分原始代码。我在哪里复制了问题?最后要解决问题,我们必须更改原始源代码。有没有其他方法可以解决问题?
  • “我只是帮助了” 代码(缺乏质量)没有帮助。 “我在哪里复制了这些问题?” 第一个在我的第二条评论中提到。第二种是使用while (true){ 循环而不是使用Swing Timer 来触发重绘..
  • @AndrewThompson 我将在stackoverflow 的下一个活动中使用您的建议。也在我的代码中。谢谢。???
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 2013-05-23
  • 2011-09-22
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多