java 挥之不去 system.out.println

java swing it doesn't without system.out.println

你好所以我一周前开始学习 java 我基本上开始制作一个图形用户界面只是为了看看它是如何工作的我发现了一个奇怪的 "bug" 或者我不完全理解它是怎么回事工作,它甚至不是一个错误

我有一个名为 startPanel 的 class,它使面板从一开始就可见 它会询问您希望以管理员、用户还是访客身份登录的内容 这是开始面板:

package library;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

/*
 * this panel is responsible for the first opening panel and redirects you to your panel
 * 
 * 
 */
import javax.swing.*;
public class startPanel extends JFrame {


boolean adminState=false;
boolean userState=false;
boolean guestState=false;

JButton adminBut,userBut,guestBut ;

//start of constructor
public startPanel(){
    //frame size,close when pressing x,title,and spawn at middle of the screen
    this.setSize(500,500);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setTitle("Welcome guest");
    this.setLocationRelativeTo(null);
    //making the panel
    JPanel panel1 = new JPanel();
    //making a label to fill things up it doesn't really do anything
    JLabel startLabel = new JLabel("you wan't to log in as...");
    //3 buttons for the user to click 1 only and the according frame will show up
    adminBut = new JButton("Admin");
    userBut = new JButton("User");
    guestBut = new JButton("Guest");
    //making an event handler for admin only so far just for test purposes
     ListenForButton lForButton = new ListenForButton();
     adminBut.addActionListener(lForButton);

     //adding comps to the panel
    panel1.add(startLabel);
    panel1.add(adminBut);
    panel1.add(userBut);
    panel1.add(guestBut);

    //adding the panel to the frame
    this.add(panel1);

} // end of startPanel constructor

private class ListenForButton implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent event) {
        /*probably not the correct way to do what i want to but just figured this might work
         *it only works for admin button if the user presses the adminBut
         *it will change the states and with a getter we can change each state 
         *from main accordingly
         */
        if (event.getSource() == adminBut ){
            adminState=true;
            guestState=false;
            userState= false;

        }
    }

} // end of Listen for button

//all getters for the states
public boolean getAdminState(){
    return adminState;
}
public boolean getUserState(){
    return guestState;
}
public boolean getGuestState(){
    return userState;
}

}

这是主要的:

package library;

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

import javax.swing.*;

public class mainLibrary {
public static void main(String[] args) {


    adminPanel adminP = new adminPanel();
    userPanel userP = new userPanel();
    startPanel gui = new startPanel();
    gui.setVisible(true);

    while(true){
        System.out.println(gui.getAdminState());
        if (gui.getAdminState() == true) {
            gui.setVisible(false);
            userP.setVisible(true);

        }
    }

现在的问题是,如果我删除 System.out.println(gui.getAdminState()); 这是行不通的 如果一开始它是假的,它甚至根本不会进入 if 如果我不删除它会正常工作:/ 所以这是怎么回事

如果重要的话,这是 adminPanel 的 adminPanel

package library;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class adminPanel extends JFrame {

    //start of adminPanel constructor
public adminPanel(){ 
    //frame size,close when pressing x,title,and spawn at middle of the screen
    this.setSize(500,500);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setTitle("Admin panel area");
    this.setLocationRelativeTo(null);

    JPanel panel1 = new JPanel();

    this.add(panel1);


    } //end of admin constructor

}

这不是一个好的 GUI 设计。永远不要使用这样的主动循环。

备注:使用标准命名规范(uppercase/lowercase),切勿将框架称为面板(这太混乱了)。

更好的设计是在 startPanel 中引用要激活的面板,并设置适当的 属性 以响应按钮操作。类似于:

class StartFrame extends JFrame implements ActionListener {
    private JFrame adminFrame;
    private JFrame userFrame;
    ...

    // add construtor to initialize adminFrame and userFrame appropriately
    ...

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == adminBut) {
            this.setVisible(false);
            adminFrame.setVisible(true);
        }
        if (e.getSource() == userBut) {
            this.setVisible(false);
            userFrame.setVisible(true);
        }
    }
}