我是 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/