将从 class 创建的 JPanel 添加到 JtabbedPane

Adding a JPanel created from class to JtabbedPane

我正在尝试将 JPanel 添加到选项卡。 该面板是使用 LanguageTab class 创建的,但我不明白为什么它不起作用。 这可能很愚蠢,但自学是不够的。 希望有人能帮帮我。谢谢!
我有我的代码在这里让你了解我正在经历的事情!

public class MainTab extends JPanel {
JTabbedPane mainTab;
JPanel languageTab;
JFrame mainFrame;
JPanel mainPanel;

public MainTab(){
    mainFrame = new JFrame();
    mainTab = new JTabbedPane();

    mainPanel = new JPanel();
    //mainPanel.add(new JTextField("ciao"));
    mainPanel.add(new JLabel(new ImageIcon("C:\Users\angelica\Desktop\developed.jpg")));

    //languageTab = new LanguageTab();


    mainTab.add("main",mainPanel);
    mainTab.add("Language Tab",languageTab);
    add(mainTab);

    mainFrame.add(mainTab);
    mainFrame.setVisible(true);
    mainFrame.setDefaultLookAndFeelDecorated(true);
}

public static void main(String args[]){
    MainTab mt = new MainTab();
}

}

这是我的语言选项卡

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;

public class LanguageTab 扩展 JPanel 实现 ActionListener{

public LanguageTab(){

    ImageIcon icona = new ImageIcon("C:\Users\angelica\workspace\whatever\src\whatever\ita.jpg");
    ImageIcon icona_DSA = new ImageIcon("C:\Users\angelica\workspace\whatever\src\whatever\ita2.jpg");
    ImageIcon iconb = new ImageIcon("C:\Users\angelica\workspace\whatever\src\whatever\brit.jpg");
    ImageIcon iconb_DSA =new ImageIcon("C:\Users\angelica\workspace\whatever\src\whatever\brit2.jpg");

    JPanel langTab= new JPanel();
    langTab.setLayout(new GridLayout(2,2));

    JButton ADHDbutton = new JButton("ADHD ENGLISH");
    ADHDbutton.setIcon(iconb);
    ADHDbutton.setActionCommand("adhd_english");
    ADHDbutton.addActionListener(this);

    JButton ADHDbutton1 = new JButton("ADHD \n ITALIANO");
    ADHDbutton1.setIcon(icona);
    ADHDbutton1.setActionCommand("adhd_italiano");
    ADHDbutton1.addActionListener(this);

    JButton DSAbutton = new JButton("DSA ENGLISH");
    DSAbutton.setIcon(iconb_DSA);
    DSAbutton.setActionCommand("dsa_english");
    DSAbutton.addActionListener(this);

    JButton DSAbutton1 = new JButton("DSA ITALIANO");
    DSAbutton1.setIcon(icona_DSA);
    DSAbutton1.setActionCommand("dsa_italiano");
    DSAbutton1.addActionListener(this);

    langTab.add(ADHDbutton);
    langTab.add(ADHDbutton1);
    langTab.add(DSAbutton);
    langTab.add(DSAbutton1);

    //return toModify;
}

@Override
public void actionPerformed(ActionEvent arg0) {
    // TODO Auto-generated method stub

}

}

您需要设置 JFrame 的大小,以使其足够大以查看其内容。

将以下内容添加到 MainTab 构造函数的最后一行:

mainFrame.setSize(new Dimension(300, 300));

此外,在您的 LanguageTab 构造函数中,您有一个名为 langTab 的变量,而 class 本身 (this) 应该表示语言选项卡。然后,您将所有按钮添加到 langTab 并且从不对其进行任何操作。

删除变量 langTabLanguageTab 构造函数中用 this 替换对它的每次调用。你的构造函数应该看起来像这样:

public LanguageTab() {
    // button initialization goes here...

    this.add(ADHDbutton);
    this.add(ADHDbutton1);
    this.add(DSAbutton);
    this.add(DSAbutton1);
}

既然您的问题已经得到解答,如果您不介意的话,我想提出一些可能会提高您未来代码质量的建议。

  1. 只在必要时才使用全局变量。

    • 您为 UI 的不同部分声明了四个全局变量,所有这些都可以声明为局部变量。使用 Swing,通常需要将组件声明为全局组件,以便可以在 class 中的不同位置访问它们,最终您可能会遇到这种情况。但是,如果可能,您应该始终更喜欢局部范围的变量。
  2. 给你的变量尽可能小的范围

    • 您的全局变量没有任何访问级别(作用域)修饰符,这默认为它们提供 package 作用域。正如我之前提到的,出于各种原因,通常有必要将 swing 组件设为全局,但它们的范围几乎从来没有必要大于 private(因此只能从 [=101= 中访问它们) ] 在其中声明它们。
  3. 在"static way".

    中访问静态方法
    • 您使用变量 mainFrame 调用了 JFramesetDefaultLookAndFeelDecorated() 方法。 mainFrameJFrame class 的一个 实例 (你通过说 mainFrame = new JFrame() 来声明它),所以你只用它来调用实例 方法。 setDefaultLookAndFeelDecorated() 是一个静态方法(使用关键字 static 声明),因此应该使用 class 名称访问:JFrame.setDefaultLookAndFeelDecorated(true)
  4. 注意你的引用类型。

    • 您已将 languageTab 变量(在 MainTab class 中)声明为 JPanel。 JPanel 没有像您的 LanguageTab 那样实现 ActionListener 接口,因此通过将您的变量声明为 JPanel,您将失去调用 actionPerformed() 的能力(或者更有可能将其设置为某个 swing 组件的动作侦听器)。
  5. Java中的变量,按照惯例,应该以小写字母开头。

    • 您在 LanguageTab class 中给了四个按钮以大写字母开头的名称。 Java 约定是变量名以小写字母开头,就像 classes 应该以大写字母开头一样。