我知道以前曾经问过这个问题,但我仍然无法让它发挥作用。
public class GUI extends JFrame implements Runnable{
public static JPanel contentPane;
public static Graphics2D graphics;
public static BufferStrategy bufferStrategy;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
GUI frame = new GUI();
frame.setVisible(true);
frame.setResizable(false);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public GUI() {
setResizable(false);
setTitle("Tower Defense Game");
setIgnoreRepaint(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
}
@Override
public void run() {
createBufferStrategy(2);
bufferStrategy = getBufferStrategy();
graphics = (Graphics2D) bufferStrategy.getDrawGraphics();
for(int infiniteVar = 0; infiniteVar == -1; infiniteVar++){
graphics.setBackground(Color.WHITE);
graphics.drawLine(100, 100, (int) (Math.random() * ((200-50) + 1) + 50), (int) (Math.random() * ((200-50) + 1) + 50));
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
infiniteVar = 0;
}
}
}
public class Initialize {
public static void main(String[] args){
GUI.main(args);
GUI objGUI = new GUI();
Thread threadGUI = new Thread(objGUI);
threadGUI.start();
}
}
我得到Exception in thread "Thread-2" java.lang.IllegalStateException: Component must have a valid peer on the line
我试图制定缓冲策略。我想我应该首先制作帧,但是在制作构成缓冲策略的线程之前我会调用它。
答案 0 :(得分:2)
基本上,你的问题从这里开始......
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
GUI frame = new GUI();
frame.setVisible(true);
frame.setResizable(false);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
在这里被激怒了......
public class Initialize {
public static void main(String[] args) {
GUI.main(args);
GUI objGUI = new GUI();
Thread threadGUI = new Thread(objGUI);
threadGUI.start();
}
}
基本上,正在发生的事情,GUI.main
方法正在创建GUI
的新实例,它会显示在屏幕上,然后您创建另一个GUI实例...
GUI objGUI = new GUI();
Thread threadGUI = new Thread(objGUI);
threadGUI.start();
您尝试使用它来创建BufferStrategy
,但此实例在屏幕上不可见(可显示或附加到本地对等方),因此您的问题...
相反,摆脱main
中的GUI
方法,它并没有真正为你做任何好处,并在Initialize
中应用它的逻辑
GUI frame = new GUI();
// Better idea to do this before you make the frame visible
// as it can change the frame borders and cause some issues
frame.setResizable(false);
frame.setVisible(true);
Thread thread = new Thread(frame);
thread.start();
您还可以使用run
方法添加支票,等待JFrame
变为可显示...
@Override
public void run() {
while (!isDisplayable()) {
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
}
}
//...
您还应该阅读BufferStrategy
上的JavaDocs,以便更好地了解如何管理它们......