Не может закрыть предыдущий кадр, чтобы увидеть новый фрейм java

У меня проблема с фреймами. Я думаю, что моя проблема - логическая. Я открываю рамку меню, а затем, когда я нажимаю добавить пассажира, фрейм не открывается. Я все еще вижу предыдущий кадр. Я использовал идеи, размещенные на этом форуме, чтобы изменить setVisisble на (false), и я подумал, что я увижу правильно другой фрейм, но он не работает хорошо. Не могли бы вы дать мне несколько советов. спасибо

public class DriverProgram 
{ 
 public static void main (String [ ] argument) 
 { 
 Flight sw101 = new Flight(); 
 sw101.setVisible(true);
 } 
 } 

import corejava.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Flight extends JFrame
{
SeatingChart sc = new SeatingChart();
WaitingList wl = new WaitingList();
private String buttons[] = new String[5];
private final Font MENU_FONT = new Font("Serif", Font.BOLD, 20);
JButton b;
ActionListener listener1 = new MenuClickListener();
private JTextField input =null; 
private JTextField firstName;
private JTextField middleName;
private JTextField lastName; 
private final Font NEW_FONT = new Font("Serif", Font.BOLD + Font.ITALIC, 20);

public Flight()
{
 menu();
}

void menu( )
{ 
 uiFrameMenu();
 addPanelMenu();
}

void uiFrameMenu()
{
 setTitle( "MENU" );
 setSize( 400, 400 );
 setLocationRelativeTo( null );
 setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 
}

void addPanelMenu()
{
 setLayout( new BorderLayout() ); 
 JPanel panel = new JPanel();
 panel.setLayout(new GridLayout (5,1));

 buttons[0] = "Add Passenger";
 buttons[1] = "Remove Passenger";
 buttons[2] = "Seating Chart";
 buttons[3] = "Waiting List";
 buttons[4] = "Exit";


 for( int i = 0; i < buttons.length ; i++ )
 {
 b = new JButton( buttons[i]);
 b.setText( buttons[i] );
 b.setForeground(Color.BLACK);
 b.setFont(MENU_FONT);
 b.addActionListener(listener1);
 panel.add(b);
 }

 getContentPane();
 panel.setBackground(Color.MAGENTA);
 add(panel,"Center");
}

class MenuClickListener implements ActionListener
{
 MenuClickListener() { }

 @Override
 public void actionPerformed( ActionEvent event ) 
 { 
 if ( event.getActionCommand().equals(buttons[0])) 
 { 
 addPassenger();
 }
 else if ( event.getActionCommand().equals(buttons[1])) 
 { 

 }
 setVisible(true);
 }
}



void addPassenger( )
{
 this.setEnabled(false);
 uiFrameData();
 setLayout( new BorderLayout() ); 
 JPanel panel1 = new JPanel();
 panel1.setLayout( new GridLayout(3, 2) );
 JPanel panel2 = new JPanel();
 panel2.setLayout( new GridLayout(3, 1) );
 JLabel l1 = new JLabel("First Name");
 JLabel l2 = new JLabel("Middle Name");
 JLabel l3 = new JLabel("Last Name");
 firstName = new JTextField();
 middleName = new JTextField();
 lastName = new JTextField();
 panel1.add(l1);
 panel1.add(firstName);
 panel1.add(l2);
 panel1.add(middleName);
 panel1.add(l3);
 panel1.add(lastName);
 add(panel1);
}

void uiFrameData()
{
 setTitle( "FIRST, MIDDLE AND LAST NAME" );
 setSize( 400, 400 );
 //setLocationRelativeTo( null );
 setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 
}
}
1 ответ

Лучше примените CardLayout, для этого сценария, как уже сказал вам. Здесь я изменил ваш код, вы каждый раз настраиваете Layout на своем JFrame, так как тот же Layout вы устанавливаете, почему бы не сделать это только один раз. Зачем добавлять дополнительный код каждый раз без каких-либо причин :-), Do revalidate() и repaint() на вашем JFrame после внесения изменений в графический интерфейс "на лету", чтобы они могли быть взаимно обращены к зрителю. Здесь я внес некоторые изменения в код.

//import corejava.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class DriverProgram 
{ 
 public static void main (String [ ] argument) 
 { 
 SwingUtilities.invokeLater(new Runnable()
 {
 public void run()
 {
 Flight sw101 = new Flight(); 
 sw101.setVisible(true);
 }
 });
 } 
 }

class Flight extends JFrame
{
 //SeatingChart sc = new SeatingChart();
 //WaitingList wl = new WaitingList();
 private String buttons[] = new String[5];
 private final Font MENU_FONT = new Font("Serif", Font.BOLD, 20);
 JButton b;
 ActionListener listener1 = new MenuClickListener();
 private JPanel panel; // changed this to instance field so it can be accessed, at button click.
 private JTextField input =null; 
 private JTextField firstName;
 private JTextField middleName;
 private JTextField lastName; 
 private final Font NEW_FONT = new Font("Serif", Font.BOLD + Font.ITALIC, 20);

 public Flight()
 {
 menu();
 }

 void menu( )
 { 
 uiFrameMenu();
 addPanelMenu();
 }

 void uiFrameMenu()
 {
 setTitle( "MENU" );
 setSize( 400, 400 );
 setLocationRelativeTo( null );
 setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 
 }

 void addPanelMenu()
 {
 setLayout( new BorderLayout() ); 
 panel = new JPanel();
 panel.setLayout(new GridLayout (5,1));

 buttons[0] = "Add Passenger";
 buttons[1] = "Remove Passenger";
 buttons[2] = "Seating Chart";
 buttons[3] = "Waiting List";
 buttons[4] = "Exit";


 for( int i = 0; i < buttons.length ; i++ )
 {
 b = new JButton( buttons[i]);
 b.setText( buttons[i] );
 b.setForeground(Color.BLACK);
 b.setFont(MENU_FONT);
 b.addActionListener(listener1);
 panel.add(b);
 }

 getContentPane();
 panel.setBackground(Color.MAGENTA);
 add(panel,"Center");
 }

 class MenuClickListener implements ActionListener
 {
 MenuClickListener() { }

 @Override
 public void actionPerformed( ActionEvent event ) 
 { 
 if ( event.getActionCommand().equals(buttons[0])) 
 { 
 addPassenger();
 }
 else if ( event.getActionCommand().equals(buttons[1])) 
 { 

 } 
 }
 }



 void addPassenger( )
 {
 //this.setEnabled(false);
 remove(panel);
 uiFrameData();
 JPanel panel1 = new JPanel();
 panel1.setLayout( new GridLayout(3, 2) );
 JPanel panel2 = new JPanel();
 panel2.setLayout( new GridLayout(3, 1) );
 JLabel l1 = new JLabel("First Name");
 JLabel l2 = new JLabel("Middle Name");
 JLabel l3 = new JLabel("Last Name");
 firstName = new JTextField();
 middleName = new JTextField();
 lastName = new JTextField();
 panel1.add(l1);
 panel1.add(firstName);
 panel1.add(l2);
 panel1.add(middleName);
 panel1.add(l3);
 panel1.add(lastName);
 add(panel1);

 revalidate(); // If your JDK is 1.7 else use getContentPane().revalidate(); for JDK 1.6 or below
 repaint();
 }

 void uiFrameData()
 {
 setTitle( "FIRST, MIDDLE AND LAST NAME" );
 setSize( 400, 400 ); 
 }
}

licensed under cc by-sa 3.0 with attribution.