将不同 swing 组件的 class 个实例添加到 JPanel

Adding a class instance of different swing components to a JPanel

我正在尝试创建一个显示在 JPanel 上的不同项目的网格,如下所示:

        JPanel secondPanel = new JPanel();

        secondPanel.setBounds(345,40,640,700);
        secondPanel.setBackground(new java.awt.Color(90,90,100));
        // Here secondPanel is given a gridlayout.  So the items appear in a gridded look.
        secondPanel.setLayout(new GridLayout(3,3,50,50));
        frame.add(secondPanel);

// The following are used as an example of different JPanels.  I am using this to give a demonstration of how the item layout would sort of look like.

        secondPanel.add(new JPanel());
        secondPanel.add(new JPanel());
        secondPanel.add(new JPanel());
        secondPanel.add(new JPanel());
        secondPanel.add(new JPanel());
        secondPanel.add(new JPanel());
        secondPanel.add(new JPanel());
        secondPanel.add(new JPanel());
        secondPanel.add(new JPanel());

但是,每个项目都具有相同的属性。它们都有一个 select 框。他们都有一个 JPanel,他们都有一段文本等。我​​认为创建一个包含所有这些值的 class 会更容易,然后将它们添加到 JPanel,每个都是一个单独的实例.

Class:

import javax.swing.JPanel;
import javax.swing.JCheckBox;
import javax.swing.JLabel;

public class itemClass {

    itemClass(String name, double cost){

        JPanel box = new JPanel();
        JLabel nameLabel = new JLabel();
        nameLabel.setText(name);
        JCheckBox selectBox = new JCheckBox("$ "+cost);
        box.setForeground(new java.awt.Color(80,80,90));
        box.setSize(50, 50);
        box.add(selectBox);

    }
}

我在这里尝试创建 class 个实例并使用 add 方法将它们添加到该面板:

for (int i = 0; i < 9; i ++) {
            secondPanel.add(new itemClass("T-Shirt",20));
        }

这里的问题是 add 方法不接受 itemClass 的实例。所以,我正在寻找一种方法,我可以拥有 class 不同的摆动组件,然后将它们添加到 secondPanel 面板。

你可以这样写:

import javax.swing.JPanel;
import javax.swing.JCheckBox;
import javax.swing.JLabel;

public class ItemPanel extends JPanel {

    ItemPanel(String name, double cost){
        JLabel nameLabel = new JLabel();
        nameLabel.setText(name);
        this.add(nameLabel);  // added this!
        JCheckBox selectBox = new JCheckBox("$ " + cost);
        this.setForeground(new java.awt.Color(80, 80, 90));
        this.setSize(50, 50);
        this.add(selectBox);
    }
}

关键是您的 ItemPanel class 需要扩展一些扩展 JComponent 的 class。扩展 JPanel 是显而易见的选择,因为在这种情况下您需要 "panel" 行为。

另一种方法是将您的 class + 构造函数变成一个简单的方法,创建一个 JPanel,填充它,然后 returns 它。


其他要点:

  1. Class 名称应始终 以大写字母开头。没有例外。

  2. Class 名字慎选:

    • 他们应该描述(或至少暗示)class 的目的;例如ItemPanel 是一个显示 "item".
    • 的面板
    • 在名称末尾添加 Class 不符合习惯。你不会叫你的狗 "Fido Dog" ...而且你不会在 Java SE 库 1 中看到这样的名字。
    • 事实上,Class 后缀实际上是误导性的,因为它 建议 实例 的(例如)ItemClass 是 Java class 的 表示 。 (不是。它是用户界面组件的表示!)

1 - 有一两个例外,但这不是重点。