Java 从一帧移动到另一帧

Java 从一帧移动到另一帧,java,swing,jframe,Java,Swing,Jframe,我不熟悉JavaSwing,在这里我开发了两个不同的JFrame,如果我点击按钮,框架应该移动到另一个框架,上一个框架应该通过打开下一个框架来关闭 我点击按钮打开下一帧,但帧内的数据并没有显示,上一帧并没有在按钮上关闭。请帮助查找代码中的问题 第1帧:--------------------------------- package com.demo.test; import java.awt.*; import java.awt.event.ActionEvent; import java.

我不熟悉JavaSwing,在这里我开发了两个不同的
JFrame
,如果我点击按钮,框架应该移动到另一个框架,上一个框架应该通过打开下一个框架来关闭

我点击按钮打开下一帧,但帧内的数据并没有显示,上一帧并没有在按钮上关闭。请帮助查找代码中的问题

第1帧:---------------------------------

package com.demo.test;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.GroupLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import com.demo.gui.TestjigWindow;

public class TestjigWindowCheck extends JFrame{

private JFrame mainFrame;
private JLabel headerLabel;
private JLabel statusLabel;
private JPanel controlPanel;

public TestjigWindowCheck() {

    initUI();
}

private void initUI() {

    mainFrame = new JFrame("Fuse Test jig");
    mainFrame.setSize(400,400);
    mainFrame.setLayout(new GridLayout(3, 1));

    headerLabel = new JLabel("", JLabel.CENTER);        
    statusLabel = new JLabel("",JLabel.CENTER);    
    statusLabel.setSize(500,500);

    controlPanel = new JPanel();
    controlPanel.setLayout(new FlowLayout());

    mainFrame.add(headerLabel);
    mainFrame.add(controlPanel);
    mainFrame.add(statusLabel);
    mainFrame.setVisible(true);  
}

public void showEventDemo(){
    //TestjigWindow frame1 = new TestjigWindow();
    headerLabel.setText("Fuse Test Jig"); 
    headerLabel.setFont(new Font( "Arial", Font.BOLD, 25));
    headerLabel.setBackground(Color.green);

    JButton startButton = new JButton("Start");
    startButton.setActionCommand("Start");

    JButton closeButton = new JButton("Close");
    closeButton.setActionCommand("close");

    startButton.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            try
            {
             if(e.getSource() == startButton)
             {
              TestjigWindow2 frame2 = new TestjigWindow2();
              frame2.setVisible(true);
              dispose();
             } 
             else if(e.getSource() == closeButton)
             {
                 System.exit(0);
             }

            }
            catch (Exception ex)
            {
                ex.printStackTrace();
            }
        }
    });

   closeButton.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            try
            {
              System.exit(0);
            }
            catch (Exception ex)
            {
                ex.printStackTrace();
            }
        }
    });

    controlPanel.add(startButton);
    controlPanel.add(closeButton);

    mainFrame.setVisible(true);  
 }

public static void main(String[] args) {

    TestjigWindowCheck test = new TestjigWindowCheck();
    test.showEventDemo();
    //test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     }
 }  
第2帧--------------------

package com.demo.test;

import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.*;

public class TestjigWindow2 extends JFrame{
private JFrame mainFrame;
private JLabel headerLabel;
private JLabel statusLabel;
private JPanel controlPanel;
private JPanel controlPanel1;

public TestjigWindow2()
{
    prepareGUI();
}

public static void main(String args[])
{
    TestjigWindow2 test = new TestjigWindow2();
    test.showRadioButton();
}

private void prepareGUI()
{

    mainFrame = new JFrame("Fuse Test2 jig");
    mainFrame.setSize(400,400);
    mainFrame.setLayout(new GridLayout(3, 1));

    headerLabel = new JLabel("", JLabel.CENTER);        
    statusLabel = new JLabel("",JLabel.CENTER);    
    statusLabel.setSize(500,500);

    controlPanel = new JPanel();
    controlPanel.setLayout(new FlowLayout());

    mainFrame.add(headerLabel);
    mainFrame.add(controlPanel);
    mainFrame.add(statusLabel);
    mainFrame.setVisible(true);

}

public void showRadioButton()
{
    headerLabel.setText("Fuse Mode"); 
    final JRadioButton setting =new JRadioButton("Setting");    
    final JRadioButton testing =new JRadioButton("Testing");

    setting.setBounds(75,50,100,30);    
    testing.setBounds(75,100,100,30);

    setting.setMnemonic(KeyEvent.VK_S);
    testing.setMnemonic(KeyEvent.VK_T);

    ButtonGroup group = new ButtonGroup();

    group.add(setting);
    group.add(testing);

    controlPanel.add(setting);
    controlPanel.add(testing);

    JButton button = new JButton("Next");
    button.setActionCommand("Next");

    controlPanel.add(button);
    mainFrame.setVisible(true);  
 }
}

对于这个问题,我认为这是一个相当简单的解决方案,正如Andrew评论的那样,您不需要继续创建JFrame,您可以在第一个程序中创建JFrame,然后通过构造函数将其传递给第二个类

我认为您的程序之所以会关闭,是因为您在创建新框架后调用了dispose(),这可能会破坏新框架中的组件

您可以采用这种方法,这种方法只使用一个在开始类中创建的框架,并将其转移到第二个类中

例如(使用代码的小片段):

第1帧 第2帧
然后在prepareGUI()中,将组件添加到框架中,而不创建新框架。这样,您的第一个页面将关闭,第二个框架将打开,而无需创建多个JFrames。

您只需在第一个框架内的actionPerformed方法中创建TestjigWindow2的新实例。不要分别在startbutton和stopbutton上添加actionPerformed,而是在Frame1类中实现ActionListener接口,只保留一个方法,因为您正在检查方法内部的源代码

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        try
        {
         if(e.getSource() == startButton)
         {
          TestjigWindow2 frame2 = new TestjigWindow2();
          //frame2.setVisible(true); do this inside the frame2 preparegui method
          dispose();
         } 
         else if(e.getSource() == closeButton)
         {
             System.exit(0);
         }

        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
});
如果在Frame1中有main方法并在其中实例化Frame1,那么代码将有一个更通用的流

您不需要在Frame1的actionPerformed中使用setVisible。

参见TL;博士请邮寄
//In your constructor you could have something like this

private JFrame mainFrame; 
/*
 * Other variables and constants go here
 *
 */

public TestjigWindow2(JFrame mainFrame)
{
   this.mainFrame = mainFrame;
   prepareGUI();
}
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        try
        {
         if(e.getSource() == startButton)
         {
          TestjigWindow2 frame2 = new TestjigWindow2();
          //frame2.setVisible(true); do this inside the frame2 preparegui method
          dispose();
         } 
         else if(e.getSource() == closeButton)
         {
             System.exit(0);
         }

        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
});