当前位置: 首页 > 知识库问答 >
问题:

JButton中的组成与继承

濮嘉茂
2023-03-14

我想通过Swing创建一个简单的桌面游戏。我有一个JFrame和一个JGroup变量。

我想将JButton添加到这个JPanel,但我想创建一个自己的类。

我创建了一个扩展 JButton(继承)的类:

public class GameField extends JButton {...}

所以我可以将GameFields添加到JPanel。

但是我想通过组合来创建GameFields:

public class GameField{

    private JButton button;

}

但是在这个类中,我如何将GameField添加到JPanel中呢?我能通过作文解决这个问题吗?

共有2个答案

郤望
2023-03-14

如果您希望您的 GameField 对象具有 JComponents 并且仍然能够将它们添加到其他 JComponent 中,请让它们扩展 JPanel 而不是 JButton

然后,您可以将GameField对象作为JPanels与其他JComponents一起使用,并将它们添加到JFrame中。

邹铭
2023-03-14

但是在这个类中,我如何将GameField添加到JPanel中呢?我能通过作文解决这个问题吗?

您可以通过添加一个简单的getter来实现这一点,如下所示:

public class GameField{

    private JButton button;

    public GameField(String text) {
        button = new JButton(text);
        // do your stuff here
    }

    public JButton getButton() {
        return button;
    }
}

然后在您的 GUI 中:

public void createAndShowGUI() {
    JPanel panel = new JPanel(new GridLayout(5,5));
    panel.add(new GameField("Button # 1").getButton());
    panel.add(new GameField("Button # 2").getButton());
    ...
    JFrame frame = new JFrame("Game");
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.getContentPane().add(panel);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

您在评论中指出:

谢谢,但在这种情况下,如果我想访问这个字段(即panel.getComponent(i)),我只能得到一个JButton,而不是一个GameField。

您可以使用您的GameField对象保留一个列表,或者您可以使用putClientProperty()方法保留对GameField对象的引用,如下例所示:

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Demo {

    private void createAndShowGUI() {        
        ActionListener actionListener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JButton button = (JButton)e.getSource();
                GameField gameField = (GameField)button.getClientProperty("GameField");
                if(gameField != null) {
                    System.out.println(gameField.getText());
                }
            }
        };

        GameField gameField1 = new GameField("Button # 1");
        gameField1.getButton().addActionListener(actionListener);

        GameField gameField2 = new GameField("Button # 2");
        gameField2.getButton().addActionListener(actionListener);

        JPanel content = new JPanel(new GridLayout());
        content.add(gameField1.getButton());
        content.add(gameField2.getButton());

        JFrame frame = new JFrame("Demo");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(content);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    class GameField {

        private String text;
        private JButton button;

        public GameField(String text) {
            this.text = text;
            button = new JButton(text);
            button.putClientProperty("GameField", GameField.this);
        }

        public JButton getButton() {
            return button;
        }

        public String getText() {
            return text;
        }        
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {                
                new Demo().createAndShowGUI();
            }
        });
    }    
}
 类似资料:
  • 问题内容: 组成和继承相同吗?如果要实现合成模式,如何在Java中实现呢? 问题答案: 组成意味着 继承 :汽车有发动机,汽车是汽车 在编程中,它表示为:

  • 本文向大家介绍浅析Java中的继承与组合,包括了浅析Java中的继承与组合的使用技巧和注意事项,需要的朋友参考一下 前言 Java是一个面向对象的语言。每一个学习过Java的人都知道,封装、继承、多态是面向对象的三个特征。每个人在刚刚学习继承的时候都会或多或少的有这样一个印象:继承可以帮助我实现类的复用。所以,很多开发人员在需要复用一些代码的时候会很自然的使用类的继承的方式,因为书上就是这么写的(

  • 本文向大家介绍Java中继承与组合之间的区别,包括了Java中继承与组合之间的区别的使用技巧和注意事项,需要的朋友参考一下 组合是一种设计技术,您的类可以将另一个类的实例作为您的类的字段。继承是一种机制,在该机制下,一个对象可以通过扩展类来获取父对象的属性和行为。 组合和继承都通过相关类提供代码可重用性。当您使用合成时,我们还可以获得继承的功能。以下是区别。  序号 键 继承 组成 1 基本的 

  • 我正在尝试为一栋建筑制作一个模拟电梯的GUI(实际上是为了测试线程/c扫描),但当生成电梯控制面板的按钮和每个楼层的按钮时,我有点卡住了。我考虑为每层楼生成一对新的按钮,并为每部电梯生成一个新的控制面板。此外,拥有不同数量的楼层也很困难。不管怎样,我的问题是,这样做最好的方式是什么?也许不必为每件事都生成新的按钮,只需使用一组按钮并更改每个楼层/电梯的操作?我这么问是因为我对GUI不太熟悉。谢谢你

  • 我正在尝试用java制作一个小游戏来完成任务。 我们需要在JFrame窗口中有一个可调整大小的网格,其中包含nxn(n=一些合理的数字,如5或7)字段(在这种情况下,每个字段都是一个按钮),在该字段上有以下规则: 中间的按钮是一个“黑洞”,有两个玩家。每个玩家有N-1艘飞船供他们使用,他们必须将它们移入黑洞。第一个做到这一点的玩家获胜。两个玩家的飞船都是对角排列的,朝向和远离中间(黑洞)。 诀窍是

  • 本文向大家介绍详解Vue2.0组件的继承与扩展,包括了详解Vue2.0组件的继承与扩展的使用技巧和注意事项,需要的朋友参考一下 前言 本文将介绍vue2.0中的组件的继承与扩展,主要分享slot、mixins/extends和extend的用法。 一、slot 1.默认插槽和匿名插槽 slot用来获取组件中的原内容,此方式用于父组件向子组件传递“标签数据”。有的时候为插槽提供默认的内容是很有用的,