在另一个 class 的 JFrame 上显示 JPanel
Display JPanel on JFrame from another class
使用 NetBeans IDE 和 Java,我对它们都不太熟悉。我有一个 JFrame,上面有一个 JPanel,并说 JPanel 上面有按钮。此 JPanel 在 JFrames class 中。单击其中一个按钮时,我想停止显示此 JPanel,并在不同的 class 中显示另一个 JPanel。我正在使用 GUI 设计器,因此面板处于不同的 classes.
JFrame 中的 buttonclick 事件 class 我有一个按钮:
private void buttonActionPerformed(ActionEvent e) {
panel1.setVisible(false);
Panel2 panel2 = new Panel2();
this.add(panel2);
panel2.setVisible(true);
这会产生 panel1 消失的结果,但是由于 panel2 不显示而留下空白的 Jframe。
我看过 CardLayout,但我需要面板上的按钮来发出命令,而不是另一个面板上的按钮在 CardLayout 的面板周围交换。
编辑:已重写问题以实际提供上下文,而不仅仅是 "help pls",因为有人告诉我我的要求太宽泛,这是完全正确的。我才刚刚开始学习 Java 所以如果这仍然是一个广泛的问题,抱歉。
让我们尝试在这里提供一点帮助...
首先,在 action listener 代码中什么都不做多于 "almost" 不是一个好主意。特别是 在该侦听器中实例化 一个新的面板对象是个坏主意。
更合理的方法:先创建所有面板对象。比如:当你的应用程序出现时,可能有一个所需面板对象的列表。然后,在您的动作侦听器代码中,只需添加需要显示的代码,并删除不再需要的代码。
另请注意:
- 您在动作侦听器中 "do" 发生的任何事情都发生在事件调度程序线程上(转到 google 该术语)。在这里,这可能就是您想要的,但通常不是。
- 仅仅调用 setVisible() 是不够的。您可能必须触发布局管理器进行重绘。因此决定一个特定的布局管理器,并研究动态 adding/hiding 的组件。
我建议处理 frame1 并设置 frame2 可见,其中 frame1 包含第一个面板,frame2 包含第二个面板,我没有制作 JButton 顺便说一句,我只是给出了一个解决方案,我没有编译它,但我建议这样做类似于此。
JFrame frame1;
JFrame frame2;
JPanel panel1;
JPanel panel2;
public ClassName() {
frame1 = new JFrame("FIRST FRAME NAME");
frame2 = new JFrame("SECOND FRAME NAME");
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame1.setSize(WIDTH , HEIGHT);
frame1.add(panel1);
frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame2.setSize(WIDTH , HEIGHT);
frame2.add(panel2);
frame1.setVisible(true);
}
private void buttonActionPerformed(ActionEvent e) {
frame1.dispose();
frame2.setVisible(true);
}
public static void main(String[] args) {
new ClassName();
}
这是您要找的吗?
package project3;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class File2 extends JFrame implements ActionListener{
JPanel panel1;
JPanel panel2;
JButton button;
JLabel label;
public File2() {
panel1 = new JPanel();
panel2 = new JPanel();
button = new JButton("CLICK ME");
label = new JLabel("I AM A LABEL");
button.addActionListener(this);
panel1.add(button);
panel2.add(label);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(400 , 400);
this.add(panel2);
this.add(panel1);
this.setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new File2();
}
@Override
public void actionPerformed(ActionEvent e) {
panel1.setVisible(false);
this.remove(panel1);
this.add(panel2);
}
}
使用 NetBeans IDE 和 Java,我对它们都不太熟悉。我有一个 JFrame,上面有一个 JPanel,并说 JPanel 上面有按钮。此 JPanel 在 JFrames class 中。单击其中一个按钮时,我想停止显示此 JPanel,并在不同的 class 中显示另一个 JPanel。我正在使用 GUI 设计器,因此面板处于不同的 classes.
JFrame 中的 buttonclick 事件 class 我有一个按钮:
private void buttonActionPerformed(ActionEvent e) {
panel1.setVisible(false);
Panel2 panel2 = new Panel2();
this.add(panel2);
panel2.setVisible(true);
这会产生 panel1 消失的结果,但是由于 panel2 不显示而留下空白的 Jframe。
我看过 CardLayout,但我需要面板上的按钮来发出命令,而不是另一个面板上的按钮在 CardLayout 的面板周围交换。
编辑:已重写问题以实际提供上下文,而不仅仅是 "help pls",因为有人告诉我我的要求太宽泛,这是完全正确的。我才刚刚开始学习 Java 所以如果这仍然是一个广泛的问题,抱歉。
让我们尝试在这里提供一点帮助...
首先,在 action listener 代码中什么都不做多于 "almost" 不是一个好主意。特别是 在该侦听器中实例化 一个新的面板对象是个坏主意。
更合理的方法:先创建所有面板对象。比如:当你的应用程序出现时,可能有一个所需面板对象的列表。然后,在您的动作侦听器代码中,只需添加需要显示的代码,并删除不再需要的代码。
另请注意:
- 您在动作侦听器中 "do" 发生的任何事情都发生在事件调度程序线程上(转到 google 该术语)。在这里,这可能就是您想要的,但通常不是。
- 仅仅调用 setVisible() 是不够的。您可能必须触发布局管理器进行重绘。因此决定一个特定的布局管理器,并研究动态 adding/hiding 的组件。
我建议处理 frame1 并设置 frame2 可见,其中 frame1 包含第一个面板,frame2 包含第二个面板,我没有制作 JButton 顺便说一句,我只是给出了一个解决方案,我没有编译它,但我建议这样做类似于此。
JFrame frame1;
JFrame frame2;
JPanel panel1;
JPanel panel2;
public ClassName() {
frame1 = new JFrame("FIRST FRAME NAME");
frame2 = new JFrame("SECOND FRAME NAME");
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame1.setSize(WIDTH , HEIGHT);
frame1.add(panel1);
frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame2.setSize(WIDTH , HEIGHT);
frame2.add(panel2);
frame1.setVisible(true);
}
private void buttonActionPerformed(ActionEvent e) {
frame1.dispose();
frame2.setVisible(true);
}
public static void main(String[] args) {
new ClassName();
}
这是您要找的吗?
package project3;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class File2 extends JFrame implements ActionListener{
JPanel panel1;
JPanel panel2;
JButton button;
JLabel label;
public File2() {
panel1 = new JPanel();
panel2 = new JPanel();
button = new JButton("CLICK ME");
label = new JLabel("I AM A LABEL");
button.addActionListener(this);
panel1.add(button);
panel2.add(label);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(400 , 400);
this.add(panel2);
this.add(panel1);
this.setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new File2();
}
@Override
public void actionPerformed(ActionEvent e) {
panel1.setVisible(false);
this.remove(panel1);
this.add(panel2);
}
}