gpt4 book ai didi

java - 缓冲策略 IllegalStateException

转载 作者:行者123 更新时间:2023-11-30 08:53:19 25 4
gpt4 key购买 nike

我知道之前有人问过这个问题,但我仍然无法让它工作。

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

我在线程“Thread-2”java.lang.IllegalStateException 中得到Exception: Component must have a valid peer on the line 我尝试制定缓冲策略。我想我应该先制作框架,但我确实在制作制定缓冲区策略的线程之前调用它。

最佳答案

基本上,您的问题从这里开始......

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 objGUI = new GUI();
Thread threadGUI = new Thread(objGUI);
threadGUI.start();

您尝试使用它来创建 BufferStrategy,但是这个实例在屏幕上不可见(可显示,或附加到 native 对等体),因此您的问题...

相反,去掉 GUI 中的 main 方法,它实际上对您没有任何好处,并在 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|更好地了解如何管理它们...

关于java - 缓冲策略 IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29811139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com