将从类创建的JPanel添加到JtabbedPane

时间:2016-03-23 18:05:19

标签: java jpanel jtabbedpane

我正在尝试将JPanel添加到标签页。 该面板是使用LanguageTab类创建的,但我无法弄清楚它为什么不起作用。 这可能是愚蠢的,但自我教导在这里还不够。 希望有人能给我一点帮助。谢谢!
我在这里有我的代码,让你了解我正在经历的事情!

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();
}

}

这是我的LanguageTab

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;

公共类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

}

}

1 个答案:

答案 0 :(得分:0)

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

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

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

此外,在LanguageTab构造函数中,当类本身(langTab)应该代表语言选项卡时,您有一个名为this的变量。然后,将所有按钮添加到langTab,然后再对其执行任何操作。

删除变量langTab,使用this构造函数中的LanguageTab替换每次调用。那么你的构造函数应该是这样的:

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

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

现在您的问题已经得到解答,如果您不介意我想提出一些可能会提高您未来代码质量的方法。

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

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

    • 您的全局变量上没有任何访问级别(范围)修饰符,默认情况下为它们提供package范围。正如我之前提到的,由于各种原因通常需要使swing组件全局化,但是它们几乎不需要具有大于private的范围(因此它们只能在它们所在的类中访问)宣布。
  3. 以“静态方式”访问静态方法。

    • 您使用变量JFrame调用setDefaultLookAndFeelDecorated()的{​​{1}}方法。 mainFramemainFrame类的实例(您通过说JFrame声明了它),因此您只能使用它来调用 instance 方法。 mainFrame = new JFrame()是一个静态方法(使用关键字 static 声明),因此应使用类名称进行访问:setDefaultLookAndFeelDecorated()
  4. 请注意参考类型。

    • 您已将JFrame.setDefaultLookAndFeelDecorated(true)变量(在languageTab类中)声明为MainTab。 JPanel没有像JPanel那样实现ActionListener界面,因此通过将变量声明为LanguageTab,您无法在其上调用JPanel(或者更可能将它设置为某些swing组件的动作侦听器。)
  5. 按照惯例,Java中的变量应以小写字母开头。

    • 您在actionPerformed()类名称中给出了以大写字母开头的四个按钮。 Java约定用于以小写字母开头的变量名称,就像类应以大写字母开头一样。