Java 将不同swing组件的类实例添加到JPanel

Java 将不同swing组件的类实例添加到JPanel,java,swing,jframe,Java,Swing,Jframe,我正在尝试创建一个显示在JPanel上的不同项目的网格,如下所示: JPanel secondPanel=newjpanel(); 第二小组:立根(345,40640700); setBackground(新java.awt.Color(90,90100)); //这里第二个面板是一个网格布局。因此,这些项目以网格形式显示。 secondPanel.setLayout(新网格布局(3,3,50,50)); 添加框架(第二个面板); //以下内容用作不同JPanel的示例。我用它来演示项目布局是什

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

JPanel secondPanel=newjpanel();
第二小组:立根(345,40640700);
setBackground(新java.awt.Color(90,90100));
//这里第二个面板是一个网格布局。因此,这些项目以网格形式显示。
secondPanel.setLayout(新网格布局(3,3,50,50));
添加框架(第二个面板);
//以下内容用作不同JPanel的示例。我用它来演示项目布局是什么样的。
添加(新的JPanel());
添加(新的JPanel());
添加(新的JPanel());
添加(新的JPanel());
添加(新的JPanel());
添加(新的JPanel());
添加(新的JPanel());
添加(新的JPanel());
添加(新的JPanel());
但是,每个项目都具有相同的属性。它们都有一个选择框。它们都有一个JPanel,它们都有一段文本等等。我认为创建一个包含所有这些值的类,然后将这些值添加到JPanel中会更容易,每个值都是一个单独的实例

类别:

import javax.swing.JPanel;
导入javax.swing.JCheckBox;
导入javax.swing.JLabel;
公共类itemClass{
itemClass(字符串名称,双重成本){
JPanel box=新的JPanel();
JLabel namelab=新的JLabel();
nameLabel.setText(名称);
JCheckBox selectBox=新的JCheckBox(“$”+成本);
set前台(新java.awt.Color(80,80,90));
盒子。设置尺寸(50,50);
框。添加(选择框);
}
}
在这里,我尝试创建类实例,并使用
add
方法将它们添加到该面板:

for(int i=0;i<9;i++){
第二个面板。添加(新项目类别(“T恤”,20));
}

这里的问题是,
add
方法不接受
itemClass
的实例。因此,我正在寻找一种方法,可以拥有一类不同的swing组件,然后将它们添加到
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
类需要扩展一些扩展
JComponent
的类。扩展
JPanel
是显而易见的选择,因为在这种情况下,您需要“面板”行为

另一种方法是将类+构造函数转换为一个简单的方法,创建
JPanel
,填充它,然后返回它


其他要点:

  • 类名应始终以大写字母开头。没有例外

  • 应仔细选择类名:

    • 他们应该描述(或至少暗示)课程的目的;e、 g.
      ItemPanel
      是一个显示“项目”的面板
    • 在名称末尾添加
      Class
      不是惯用法。你不叫你的狗“菲多狗”。。。在Java SE库中,你看不到这样的名称1
    • 实际上,
      Class
      后缀实际上是误导性的,因为它表明(比如)
      ItemClass
      的实例是Java类的表示。(它不是。它是用户界面组件的表示!)


  • 1-有一两个例外,但这与问题无关。

    你可以这样写:

    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
    类需要扩展一些扩展
    JComponent
    的类。扩展
    JPanel
    是显而易见的选择,因为在这种情况下,您需要“面板”行为

    另一种方法是将类+构造函数转换为一个简单的方法,创建
    JPanel
    ,填充它,然后返回它


    其他要点:

  • 类名应始终以大写字母开头。没有例外

  • 应仔细选择类名:

    • 他们应该描述(或至少暗示)课程的目的;e、 g.
      ItemPanel
      是一个显示“项目”的面板
    • 在名称末尾添加
      Class
      不是惯用法。你不叫你的狗“菲多狗”。。。在Java SE库中,你看不到这样的名称1
    • 实际上,
      Class
      后缀实际上是误导性的,因为它表明(比如)
      ItemClass
      的实例是Java类的表示。(它不是。它是用户界面组件的表示!)


  • 1-有一两个例外,但这与问题无关。

    这是可行的,但是,我的IDE提示我添加
    private static final long serialVersionUID=8013287075740780359L。这个
    UID
    的目的是什么?我还注意到
    this.setForeground(新的java.awt.Color(80,80,90))
    这个。setSize(50,50)
    不会改变任何东西。我说的是“像这样的东西”。我的目标是让你克服概念上的障碍,而不是解决你所有的问题。但是UID是关于序列化的。如果这与您相关,那么请阅读这篇文章,但是,我的IDE提示我添加
    private static final long serialVersionUID=8013287075740780359L。这个
    UID
    的目的是什么?我还注意到
    this.setForeground(新的java.awt.Color(80,80,90))
    这个。setSize(50,50)
    不会改变任何东西。我说的是“像这样的东西”。我的目标是让你克服概念上的障碍,而不是解决你所有的问题。但是UID是关于序列化的。如果这与您相关,那么请尽快阅读以获得更好的帮助,添加or。要更快获得更好的帮助,请添加or。