如何将 JButton 与扩展 Canvas 的类一起使用?

Posted

技术标签:

【中文标题】如何将 JButton 与扩展 Canvas 的类一起使用?【英文标题】:How to use JButton with a class extending Canvas? 【发布时间】:2015-08-30 11:17:04 【问题描述】:

我正在使用扩展Canvas 的类来尝试制作康威的生命游戏副本。我对 Java 并不陌生,但我对 Swing 和画布都很陌生。我尝试了许多将JButton 对象添加到我的画布的方法,但都没有成功。我已经包含了我的代码,如果有人对我如何实现按钮有任何建议,将不胜感激。

import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;

public class ConwaysGameOfLife extends Canvas implements Runnable
    private static final long serialVersionUID = 1L;

    public static final int SIZE = 960;

    public static final String TITLE = "Conway's Game of Life";

    private boolean running = false;
    private Thread thread;

    private static JButton but;

    public static void main(String[] args)
    
        ConwaysGameOfLife game = new ConwaysGameOfLife();

        game.setPreferredSize(new Dimension(SIZE-10, SIZE-10));
        game.setMaximumSize(new Dimension(SIZE-10, SIZE-10));
        game.setMinimumSize(new Dimension(SIZE-10, SIZE-10));

        JFrame frame = new JFrame(TITLE);

        frame.add(game);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        but = new JButton("Button");
        frame.add(but);

        game.start();
    

    private void start()
    
        if(running)
            return;

        running = true;
        thread = new Thread(this);
        thread.start();
    

    private void stop()
    
        if(!running)
            return;

        trythread.join(); 
        catch(InterruptedException e)
        System.exit(1);
    

    public void run() 
    
        while(running)
        
            System.out.println("RUNNING");
        
        stop();
    

    public void paint(Graphics g)
    
        g.setColor(Color.BLACK);
        g.fillRect(0,0,SIZE,64);

        for(int i = 16; i < SIZE; i += 16)
        
            g.drawLine(i,0,i,SIZE);
            g.drawLine(0,i,SIZE,i);
        
    

【问题讨论】:

一般不会,但是在不调用 super.paint 的情况下覆盖 paint 并没有帮助 你能具体说明你面临的问题吗 【参考方案1】:

您遇到的直接问题是您已将组件添加到 BorderLayout... 内的同一位置...

frame.add(game); // Look and me, I'm in the CENTER
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setVisible(true);

but = new JButton("Button");
frame.add(but);  // Look and me, I'm in the CENTER

现在,由于您在添加按钮后还没有使框架失效,因此它还没有更新,所以它没有显示,但是即使您这样做了,您可能会发现您有一些奇怪的问题,因为 AWT 组件没有有一个 z 深度的概念,这意味着可能会或可能不会覆盖按钮...有趣的东西。

相反,将按钮添加到框架内的不同位置/BorderLayout

frame.add(game); // Look and me, I'm in the CENTER
but = new JButton("Button");
frame.add(but, BorderLayout.SOUTH);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setVisible(true);

查看How to Use BorderLayout了解更多详情。

如果不知道更多关于绘画是如何完成的,我也会小心打破Canvas 的绘画链。你应该打电话给super.paint

事实上,在这种情况下,使用Canvas 没有什么好处(还有很多问题),相反,你应该使用JPanel 并覆盖它的paintComponent 方法,确保你调用super.paintComponent在你做任何自定义绘画之前

更多详情请参阅Painting in AWT and Swing 和Performing Custom Painting

【讨论】:

非常感谢!我不知道您是否可以提供帮助,但我现在正在尝试移动和更改按钮的大小,我尝试了各种方法但均未成功。我会感谢任何帮助 您可以使用不同的布局管理器。更多详情请见Laying Out Components Within a Container 啊.. 200K!恭喜。 :) @AndrewThompson 大约还有 400 个,如果他们停止删除用户,我可能会去:P “如果他们停止删除用户,我可能会在那里” 嗯.. 如果他们停止删除用户,我会可能在其他某处。 ;) 偶尔 -20 代表。仅仅看到一些不那么具有社区意识的人被删除是一个小小的打击。

以上是关于如何将 JButton 与扩展 Canvas 的类一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法创建从Android中的Canvas扩展的类?

使用 JButton 在 Java 中创建自定义按钮

如何将图像添加到 JButton

如何创建带有菜单的 JButton?

如何使用带有扩展名的 canvas2image 将 DIV 保存为图像

如何将数组作为对象属性添加到 PHP 扩展中声明的类?