单击一个按钮打开一个新的 JFrame/GUI,
我似乎无法找到让我的代码正常工作的方法.我正在制作一个程序,直到现在一切正常,我有一些按钮,他们做他们应该做的.但是现在我添加了一个按钮,当用户单击它时,它应该关闭当前的 GUI 并打开一个新的.我还想指出,我为这个新的 GUI 创建了一个新类.
我要调用的另一个 GUI 类是 GuiCrafting,在该类中,GUI 也全部编码,如果我在 Main 上调用它就可以工作.
我的问题是我在这里输入什么(我尝试了很多诸如 dispose() 之类的东西,但我只是收到错误消息):
public void actionPerformed(ActionEvent event) {if(str.equals(工艺")){//插入代码以调用 GuiCrafting 类并打开他的 GUI}
提前致谢,如果您需要更多信息,请告诉我.
解决方案不赞成使用多个 JFrame
,因为您可以阅读
点击按钮后Goto Card 2"
TestApp.java:
import java.awt.BorderLayout;导入 java.awt.CardLayout;导入 java.awt.event.ActionEvent;导入 javax.swing.JButton;导入 javax.swing.JFrame;导入 javax.swing.JLabel;导入 javax.swing.JPanel;导入 javax.swing.SwingUtilities;公共类TestApp {最终静态字符串 CARD1 = "Card1";最终静态字符串 CARD2 = "Card2";公共TestApp(){初始化组件();}公共静态无效主要(字符串[]参数){SwingUtilities.invokeLater(TestApp::new);}私人无效initComponents(){JFrame frame = new JFrame("TestApp");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//创建包含卡片"的面板.JPanel 卡片 = 新 JPanel(new CardLayout());//卡片 1 组件JButton buttonGotoCard2 = new JButton("Goto Card 2");buttonGotoCard2.addActionListener((ActionEvent e) -> {CardLayout cl = (CardLayout) (cards.getLayout());cl.show(卡片,CARD2);});//创建卡片 1JPanel card1 = new JPanel();card1.add(new JLabel("Card 1"));card1.add(buttonGotoCard2);//卡片 2 组件JButton buttonGotoCard1 = new JButton("Goto Card 1");buttonGotoCard1.addActionListener((ActionEvent e) -> {CardLayout cl = (CardLayout) (cards.getLayout());cl.show(卡片,CARD1);});//创建卡片 2JPanel card2 = new JPanel();card2.add(new JLabel("Card 2"));card2.add(buttonGotoCard1);//将卡片添加到卡片面板卡片.add(card1, CARD1);卡片.add(card2, CARD2);frame.getContentPane().add(cards, BorderLayout.CENTER);框架.pack();frame.setVisible(true);}}
还有一个
当Open JFrame 2"被点击时:
当 JFrame 2 关闭时,它会通过 WindowAdapter#windowClosing
带回主 JFrame
.
I seem to not be able to find a way to get my code to work. I am making a program and until now everything was working, i have some buttons and they do what they should. But now i added a button that when a user click it, it should close the current GUI and open a new one. I also want to point out that i created a new class for this new GUI.
The other GUI class that i want to call is the GuiCrafting, in that class the GUI is also all coded, and works if i call it on the Main.
My question is what do i type here (I tried a lot of things like dispose() etc but i just get error messages) :
public void actionPerformed(ActionEvent event) {
if( str.equals("Crafting")){
//insert code to call the GuiCrafting class and open his GUI
}
Thanks in advance and if you need something more please let me know.
解决方案Multiple JFrame
s are frowned upon as you can read about here and here
Perhaps what you want to use is a CardLayout which manages two or more components (usually JPanel
instances) that share the same display space.
After clicking the button "Goto Card 2"
TestApp.java:
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class TestApp {
final static String CARD1 = "Card1";
final static String CARD2 = "Card2";
public TestApp() {
initComponents();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(TestApp::new);
}
private void initComponents() {
JFrame frame = new JFrame("TestApp");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// create the panel that contains the "cards".
JPanel cards = new JPanel(new CardLayout());
// card 1 components
JButton buttonGotoCard2 = new JButton("Goto Card 2");
buttonGotoCard2.addActionListener((ActionEvent e) -> {
CardLayout cl = (CardLayout) (cards.getLayout());
cl.show(cards, CARD2);
});
// create card 1
JPanel card1 = new JPanel();
card1.add(new JLabel("Card 1"));
card1.add(buttonGotoCard2);
// card 2 components
JButton buttonGotoCard1 = new JButton("Goto Card 1");
buttonGotoCard1.addActionListener((ActionEvent e) -> {
CardLayout cl = (CardLayout) (cards.getLayout());
cl.show(cards, CARD1);
});
// create card 2
JPanel card2 = new JPanel();
card2.add(new JLabel("Card 2"));
card2.add(buttonGotoCard1);
// add cards to cards panel
cards.add(card1, CARD1);
cards.add(card2, CARD2);
frame.getContentPane().add(cards, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
}
There is also a JDialog which could be what you want.
HOWEVER
You can easily do something like that (Open a JFrame
from another If you must):
TestApp.java:
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
public class TestApp {
public TestApp() {
initComponents();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(TestApp::new);
}
private void initComponents() {
JFrame mainFrame = new JFrame();
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(new EmptyBorder(10, 10, 10, 10));
JLabel label = new JLabel("JFrame 1");
JButton button = new JButton("Open JFrame 2");
button.addActionListener((ActionEvent e) -> {
this.showNewJFrame(new WindowAdapter() {
@Override
public void windowClosing(java.awt.event.WindowEvent e) {
// here we listen for the second JFrame being closed so we can bring back the main JFrame
mainFrame.setVisible(true);
}
});
// hide the main JFrame
mainFrame.setVisible(false);
});
panel.add(label);
panel.add(button);
mainFrame.add(panel);
mainFrame.pack();
mainFrame.setVisible(true);
}
private void showNewJFrame(WindowAdapter windowAdapter) {
JFrame frame2 = new JFrame();
frame2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // we dont wnat to exit when this JFrame is closed
JPanel panel2 = new JPanel();
panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS));
panel2.setBorder(new EmptyBorder(10, 10, 10, 10));
JLabel label2 = new JLabel("JFrame 2");
panel2.add(label2);
frame2.add(panel2);
frame2.addWindowListener(windowAdapter);
frame2.pack();
frame2.setVisible(true);
}
}
This produces:
and when the "Open JFrame 2" is clicked:
and when JFrame 2 is closed it brings back the main JFrame
via the WindowAdapter#windowClosing
.
相关文章