解决方案很简单:使用CardLayout并让此布局管理器为您完成所有繁重的工作。有关如何执行此 *** 作的更多详细信息,请参见教程:如何使用CardLayout。
至于您的代码,请注意,实际上它在启动时实际上创建了两个Jframe,如果按下JButton,则另外创建了两个:
Guiframe类本身扩展了Jframe,但它似乎是您从未使用过的Jframe,因此被浪费了,但是无论如何,它是在程序启动时以及每当创建Guiframe实例(例如按下按钮)时创建的。然后在该类内部创建另一个Jframe
f,一个在程序启动时,再一次在按下按钮时,我认为这不是您想要的。
因此,请更改代码,以使该类不扩展Jframe,并且不要在按钮的ActionListener中创建该类的新实例。而是使用CardLayout交换视图。
例如:
import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;public class Guiframe { private static final String FIRST_PANEL = "First Panel"; private static final String SECOND_PANEL = "Second Panel"; final Jframe f = new Jframe("Test"); private CardLayout cardLayout = new CardLayout(); private JPanel content; public void Starter() { f.setSize(400, 100); f.setLocationRelativeTo(null); JButton OptionOk = new JButton("OK"); Label option = new Label("Choose a Option"); content = (JPanel) f.getContentPane(); content.setLayout(cardLayout); JPanel firstPanel = new JPanel(); firstPanel.setBackground(Color.white); firstPanel.setLayout(new FlowLayout()); firstPanel.add(option); firstPanel.add(OptionOk); content.add(firstPanel, FIRST_PANEL); content.add(createSecondPanel(), SECOND_PANEL); f.setVisible(true); f.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE); OptionOk.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { cardLayout.show(content, SECOND_PANEL); } }); } private JPanel createSecondPanel() { JPanel secondPanel = new JPanel(); secondPanel.add(new JButton(new AbstractAction("Go Back") { public void actionPerformed(ActionEvent e) { cardLayout.show(content, FIRST_PANEL); } })); return secondPanel; } public static void main(String[] args) { Guiframe gf = new Guiframe(); gf.Starter(); }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)