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

标签 java multithreading swing canvas jpanel

我在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/

相关文章:

java - 使用多个面板将图像添加到 JFrame 内的 JPanel

java - 如何在Java中检测主线程何时卡住GUI?

java - 当我启动抽屉导航时应用程序崩溃

java - 在 Spring 中与 Hibernate 并发

java - java中优化的线程安全列表

ios - UICollectionView reloadData 索引超出范围

java - hibernate transient 成员的默认值

java - FFMPEG Extra 只是编解码器信息

Java SwingUtilities.invokeLater 更新 TextArea

java - 制作两个选项窗口的最佳方法是什么?