gpt4 book ai didi

java - 在新线程上绘图( Canvas 很好,但在 jpanel 上无法正常工作)

转载 作者:行者123 更新时间:2023-12-01 13:11:53 27 4
gpt4 key购买 nike

我在Canvas上画我的游戏,一切都是上帝,但我把它改成了JPanel,但现在它不能正常工作,这是代码,你可以复制它们,你就会看到问题出在哪里(我有一个菜单,单击按钮后它应该创建新线程,我想在那里画画,JPanel中的问题是按钮能够看到,它闪烁,我可以按下它,在 Canvas 中很好,没有任何按钮)。我解决了这个问题,点击按钮后我将他设置为不可见(button.setVisible(false)),但这些代码只是示例,在我的游戏中我有更多按钮,所以它不实用,因为我需要他们在比赛结束后看到。我想我只是忘记了 JPanel 中的一个重要方法,感谢帮助,代码:

//代表菜单的主类

public class Sandbox extends JFrame{
Panel p = new Panel();

public static void main(String[] args) {
new Sandbox();
}

public Sandbox() {
setLayout(null);
setPreferredSize(new Dimension(200, 200));
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
final JButton but = new JButton("Button");
but.setBounds(0, 0, 50, 50);

but.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
p.start();
}
});

add(p);
add(but);
pack();
setVisible(true);
}

}

//在 Canvas 上绘图 -> 运行良好

public class Panel extends Canvas implements Runnable {
Thread t;
public Panel() {
setSize(new Dimension(200, 200));
setVisible(false);
}
public void start() {
t = new Thread(this);
t.start();
setVisible(true);
}

public void draw() {
BufferStrategy b = getBufferStrategy();
if(b == null) {
createBufferStrategy(3);
return;
}
Graphics g = b.getDrawGraphics();
g.setColor(Color.red);
g.fillRect(0, 0, 200, 200);
g.dispose();
b.show();
}

@Override
public void run() {
while(!t.isInterrupted()) {
try {
draw();
t.sleep(200);
} catch (InterruptedException ex) {}
}
}

}

//在 JPanel 上绘图 -> 这里我可以在第一次点击按钮后按下按钮

public class Panel extends JPanel implements Runnable {
Thread t;
public Panel() {
setSize(new Dimension(200, 200));
setVisible(false);
}
public void start() {
t = new Thread(this);
t.start();
setVisible(true);
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.red);
g.fillRect(0, 0, 200, 200);
}

@Override
public void run() {
while(!t.isInterrupted()) {
try {
repaint();
t.sleep(200);
} catch (InterruptedException ex) {}
}
}

}

最佳答案

不确定我是否完全理解您想要做什么,但您确实遇到了一些问题:

  1. 在将所有组件添加到框架并打包框架后,应调用 setVisible(true) 方法。

  2. 默认情况下,JFrame 的内容 Pane 使用 BorderLayout。您的代码正在向 BorderLayout 的 CENTER 添加两个组件,但 BorderLayout 只允许您向 CENTER 添加一个组件,因此只会显示最后添加的组件。

关于java - 在新线程上绘图( Canvas 很好,但在 jpanel 上无法正常工作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22793454/

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