将从 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
并且从不对其进行任何操作。
删除变量 langTab
在 LanguageTab
构造函数中用 this
替换对它的每次调用。你的构造函数应该看起来像这样:
public LanguageTab() {
// button initialization goes here...
this.add(ADHDbutton);
this.add(ADHDbutton1);
this.add(DSAbutton);
this.add(DSAbutton1);
}
既然您的问题已经得到解答,如果您不介意的话,我想提出一些可能会提高您未来代码质量的建议。
只在必要时才使用全局变量。
- 您为 UI 的不同部分声明了四个全局变量,所有这些都可以声明为局部变量。使用 Swing,通常需要将组件声明为全局组件,以便可以在 class 中的不同位置访问它们,最终您可能会遇到这种情况。但是,如果可能,您应该始终更喜欢局部范围的变量。
给你的变量尽可能小的范围
- 您的全局变量没有任何访问级别(作用域)修饰符,这默认为它们提供
package
作用域。正如我之前提到的,出于各种原因,通常有必要将 swing 组件设为全局,但它们的范围几乎从来没有必要大于 private
(因此只能从 [=101= 中访问它们) ] 在其中声明它们。
在"static way".
中访问静态方法
- 您使用变量
mainFrame
调用了 JFrame
的 setDefaultLookAndFeelDecorated()
方法。 mainFrame
是 JFrame
class 的一个 实例 (你通过说 mainFrame = new JFrame()
来声明它),所以你只用它来调用实例 方法。 setDefaultLookAndFeelDecorated()
是一个静态方法(使用关键字 static 声明),因此应该使用 class 名称访问:JFrame.setDefaultLookAndFeelDecorated(true)
注意你的引用类型。
- 您已将
languageTab
变量(在 MainTab
class 中)声明为 JPanel
。 JPanel 没有像您的 LanguageTab
那样实现 ActionListener
接口,因此通过将您的变量声明为 JPanel
,您将失去调用 actionPerformed()
的能力(或者更有可能将其设置为某个 swing 组件的动作侦听器)。
Java中的变量,按照惯例,应该以小写字母开头。
- 您在
LanguageTab
class 中给了四个按钮以大写字母开头的名称。 Java 约定是变量名以小写字母开头,就像 classes 应该以大写字母开头一样。
我正在尝试将 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
并且从不对其进行任何操作。
删除变量 langTab
在 LanguageTab
构造函数中用 this
替换对它的每次调用。你的构造函数应该看起来像这样:
public LanguageTab() {
// button initialization goes here...
this.add(ADHDbutton);
this.add(ADHDbutton1);
this.add(DSAbutton);
this.add(DSAbutton1);
}
既然您的问题已经得到解答,如果您不介意的话,我想提出一些可能会提高您未来代码质量的建议。
只在必要时才使用全局变量。
- 您为 UI 的不同部分声明了四个全局变量,所有这些都可以声明为局部变量。使用 Swing,通常需要将组件声明为全局组件,以便可以在 class 中的不同位置访问它们,最终您可能会遇到这种情况。但是,如果可能,您应该始终更喜欢局部范围的变量。
给你的变量尽可能小的范围
- 您的全局变量没有任何访问级别(作用域)修饰符,这默认为它们提供
package
作用域。正如我之前提到的,出于各种原因,通常有必要将 swing 组件设为全局,但它们的范围几乎从来没有必要大于private
(因此只能从 [=101= 中访问它们) ] 在其中声明它们。
- 您的全局变量没有任何访问级别(作用域)修饰符,这默认为它们提供
在"static way".
中访问静态方法- 您使用变量
mainFrame
调用了JFrame
的setDefaultLookAndFeelDecorated()
方法。mainFrame
是JFrame
class 的一个 实例 (你通过说mainFrame = new JFrame()
来声明它),所以你只用它来调用实例 方法。setDefaultLookAndFeelDecorated()
是一个静态方法(使用关键字 static 声明),因此应该使用 class 名称访问:JFrame.setDefaultLookAndFeelDecorated(true)
- 您使用变量
注意你的引用类型。
- 您已将
languageTab
变量(在MainTab
class 中)声明为JPanel
。 JPanel 没有像您的LanguageTab
那样实现ActionListener
接口,因此通过将您的变量声明为JPanel
,您将失去调用actionPerformed()
的能力(或者更有可能将其设置为某个 swing 组件的动作侦听器)。
- 您已将
Java中的变量,按照惯例,应该以小写字母开头。
- 您在
LanguageTab
class 中给了四个按钮以大写字母开头的名称。 Java 约定是变量名以小写字母开头,就像 classes 应该以大写字母开头一样。
- 您在