java - 如何正确设置能够运行模拟的 Canvas

标签 java multithreading class oop

我是 Java 的新手,最近才了解面向对象的编程。我正在尝试创建一个可以运行模拟的程序,一般的想法是我希望屏幕的一部分专用于按钮/ slider ,另一部分专用于运行模拟的 Canvas 。现在我并不担心模拟本身,我只是想在 Canvas 上获取一些图形(比 JFrame 小)。

这是我的代码(我会尽量在下面留下一些解释)

public class Launcher {

    public static void main(String[] args){

        Display display = new Display();

    }

}

.

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

public class Display {

    public final int width = 1280, height = 720;
    public final int cwidth = 894, cheight = 504;
    public final String title = "Mechancis Simulator";
    private JFrame frame;
    //private JPanel panel;
    private Canvas canvas;
    private Simulation simulation;

    public Display(){

        initDisplay();

        simulation = new Simulation();

    }

    private void initDisplay(){

        frame = new JFrame(title);
        frame.setSize(width, height);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        /*panel = new JPanel();
        panel.setSize(width, height);
        panel.setLocation(0,0); */

        canvas = new Canvas();
        canvas.setPreferredSize(new Dimension(cwidth, cheight));
        canvas.setMaximumSize(new Dimension(cwidth, cheight));
        canvas.setMinimumSize(new Dimension(cwidth, cheight));
        canvas.setLocation(width - (cwidth +15), 15);

        //panel.add(canvas);
        frame.add(canvas);

        /* Add code for buttons/sliders/boxes here */

        /* Add these to panel */

    }

    public JFrame getFrame(){
        return frame;
    }

    public Canvas getCanvas(){
        return canvas;
    }

}

.

import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.awt.*;
import javax.swing.*;

public class Simulation extends Display implements Runnable {

    private boolean running = false;
    private Thread thread;

    private BufferStrategy bs;
    private Graphics g;

    public Simulation(){

    }

    private void init(){

    }

    private void tick(){

    }

    private void render(){
        bs = getCanvas().getBufferStrategy();
        if(bs == null){
            getCanvas().createBufferStrategy(3);
            return;
        }
        g = bs.getDrawGraphics();
        //Draw Here!


        //End Drawing!
        bs.show();
        g.dispose();
    }

    public void run(){

        init();

        while(running){
            tick();
            render();
        }

        stop();

    }

    public synchronized void start(){
        if(running)
            return;
        running = true;
        thread = new Thread(this);
        thread.start();
    }

    public synchronized void stop(){
        if(!running)
            return;
        running = false;
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

当我运行程序时,窗口开始变得疯狂。我对类和线程很陌生,所以也许这就是问题所在。我只想在 Display 对象中设置 Frame 和 Canvas 后能够运行模拟。

谢谢。

最佳答案

你所做的基本上是这样的:

class Display {
    private final Simulation sim;
    public Display() { sim = new Simulation(); }
}

class Simulation extends Display {
    public Simulation() { }
}

当您创建一个新的 Display 时,构造函数会创建一个新的 Simulation,它是一个 Display,它会创建一个新的 Simulation 是一个 Display,它创建一个新的 Simulation 这是一个 Display,它创建一个新的 Simulation.. .*

所以不要。没有理由让您的 Simulation 成为显示器并拥有另一个 Simulation。如果您希望 Display 中的所有控件定义一个构造函数,该构造函数将它正在显示的 Simulation 作为参数,并在您创建它时为其提供模拟:

class Display {
    private final Simulation sim;
    public Display(Simulation sim) { this.sim = sim; }
}

class Simulation {
}

...

Display display = new Display(new Simulation());

*如果您想了解更多信息,我建议您在谷歌上搜索有关继承的教程。这是 tutorial from oracle让你开始:“你可以编写一个调用父类(super class)构造函数的子类构造函数,隐式或使用关键字super。”在你的代码示例中构造函数super() 被隐式调用。

关于java - 如何正确设置能够运行模拟的 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33804533/

相关文章:

javascript - 检查具有给定类的元素,未找到情况,将类添加到第一个元素

java - 为什么你会想要一个没有在其中声明公共(public)类的 Java 文件?

java - AbstractList.add() 不支持的操作

c++ - 在 C++ 中从构造函数显式调用析构函数是不好的做法吗?

java - 从文件获取整数值到数组

C : printf() not thread safe with flockfile()

c# - 我收到 WebException : "The operation has timed out" immediately on HttpWebRequest. GetResponse()

ios - 如何在另一个线程上正确打开和关闭 NSStream

java - 将for循环转为递归,Java

java - 登录认证-空指针异常