Добавление 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

}

}


person Angelica cruz    schedule 23.03.2016    source источник
comment
Прочитайте все свои изображения, используя ImageIO, прежде чем создавать графический интерфейс.   -  person Gilbert Le Blanc    schedule 23.03.2016


Ответы (1)


Вам нужно установить размер вашего 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. Используйте глобальные переменные только тогда, когда это необходимо.

    • You declare four global variables for different parts of your UI, all of which can be declared instead as local variables. Working with Swing, it is often necessary to declare components as global so that they can be accessed in various places within the class, and that may eventually be the case for you. But you should always prefer local scoped variables when it's possible.
  2. Дайте своим переменным наименьшую возможную область видимости

    • You don't have any access level (scope) modifiers on your global variables, which gives them a package scope by default. As I mentioned before it is often necessary to make swing components global for various reasons, but it is almost never necessary for them to have a scope larger than private (so they can only be accessed from within the class in which they are declared.
  3. Доступ к статическим методам "статическим способом".

    • You call JFrame's setDefaultLookAndFeelDecorated() method using your variable mainFrame. mainFrame is an instance of the JFrame class (you declared it by saying mainFrame = new JFrame()), so you only use it to call instance methods. setDefaultLookAndFeelDecorated() is a static method (declared with the keyword static) and should therefore be accessed with the class name: JFrame.setDefaultLookAndFeelDecorated(true)
  4. Будьте осторожны с вашими ссылочными типами.

    • You have declared your languageTab variable (in the MainTab class) as a JPanel. JPanel does not implement the ActionListener interface like your LanguageTab does, so by declaring your variable as a JPanel, you lose the ability to call actionPerformed() on it (or more likely set it as an action listener of some swing component).
  5. Переменные в Java по соглашению должны начинаться со строчной буквы.

    • You gave your four buttons in the LanguageTab class names that start with capital letters. The Java convention is for variable names to begin with a lower case letter, in the same way that classes should begin with an upper case letter.
person Zach Posten    schedule 23.03.2016
comment
Добро пожаловать @Angelicacruz! Если этот ответ решил ваш вопрос, рассмотрите возможность его принятия, нажав на галочку. Это показывает более широкому сообществу, что вы нашли решение, и повышает репутацию как отвечающего, так и вас самих. - person Zach Posten; 24.03.2016