在新线程上绘图(画布很好,但没有正确地在jpanel上工作)

时间:2014-04-01 18:02:58

标签: java multithreading swing canvas jpanel

我正在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) {}
    }
    }

}

1 个答案:

答案 0 :(得分:1)

我不确定我到底想要做什么,但你确实遇到了一些问题:

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

  2. 默认情况下,JFrame的内容窗格使用BorderLayout。您的代码是将两个组件添加到BorderLayout的CENTER中,但BorderLayout只允许您向CENTER添加一个组件,因此只显示添加的最后一个组件。