我正在Canvas
上画我的游戏,一切都是上帝,但我把它改成JPanel
,但现在它不能正常工作,这里是代码,你可以复制它们而你我会看到问题出在哪里(我有一个菜单,点击按钮后它应该创建新的线程,我想要绘制,JPanel
中的问题是按钮能够看到,它的闪烁和我可以按它,在画布上很好,没有任何按钮)。我解决了它,点击按钮后我设置了他不可见(button.setVisible(false)
),但这些代码只是示例,在我的游戏中我有更多的按钮,所以它不实用,因为我需要他们在游戏后看到结束。我想我忘记了JPanel
中的一个重要方法,thx求助,代码:
//表示菜单的主类
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) {}
}
}
}
答案 0 :(得分:1)
我不确定我到底想要做什么,但你确实遇到了一些问题:
在将所有组件添加到框架并打包框架后,应调用setVisible(true)
方法。
默认情况下,JFrame的内容窗格使用BorderLayout。您的代码是将两个组件添加到BorderLayout的CENTER中,但BorderLayout只允许您向CENTER添加一个组件,因此只显示添加的最后一个组件。