使用if语句和Java中的Swing进行奇怪/奇怪的行为

时间:2017-08-21 22:15:29

标签: java swing

下面是一个代码,它复制了我的一位朋友的教授的代码。学生如果重新发明井,试图制作类似java.awt.CardLayout的东西,但在这种尝试中出现了奇怪/好奇的行为。我已经尝试了各种各样的东西,试图了解发生了什么,但我真的无法弄清楚是什么事情正在发生。我将所有内容放在同一个文件中,以便您更轻松地运行代码。另一件事:这是一个学生设计,它很糟糕。

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 *
 * @author David
 */
public class Test {

    public static int currentPanel;
    public static int selectedPanel;

    /**
     * @param args the command line arguments
     */
    public static void main( String[] args ) {

        Window w = new Window();
        ButtonPanel btnPanel = new ButtonPanel();
        Panel01 panel01 = new Panel01();
        Panel02 panel02 = new Panel02();

        w.setLayout( new BorderLayout() );
        w.add( btnPanel, BorderLayout.CENTER );
        w.setVisible( true );

        while ( true ) {
            System.out.println( currentPanel != selectedPanel );
            if ( currentPanel != selectedPanel ) {
                switch ( selectedPanel ) {
                    case 1:
                        currentPanel = selectedPanel;
                        w.remove( btnPanel );
                        w.add( panel01, BorderLayout.CENTER );
                        w.revalidate();
                        break;
                    case 2:
                        currentPanel = selectedPanel;
                        w.remove( btnPanel );
                        w.add( panel02, BorderLayout.CENTER );
                        w.revalidate();
                        break;
                    default:
                        break;
                }
            }
        }

    }

    private static class Window extends JFrame {
        public Window() {
            setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
            setSize( 400, 400 );
            setLocationRelativeTo( null );
        }
    }

    private static class ButtonPanel extends JPanel {

        private JButton btn01;
        private JButton btn02;

        public ButtonPanel() {

            btn01 = new JButton( "01" );
            btn02 = new JButton( "02" );

            btn01.addActionListener( new ActionListener() {
                @Override
                public void actionPerformed( ActionEvent e ) {
                    Test.selectedPanel = 1;
                    System.out.println( "btn 01 clicked" );
                    System.out.printf( "    Test.selectedPanel: %d\n", 
                            Test.selectedPanel );
                }
            });

            btn02.addActionListener( new ActionListener() {
                @Override
                public void actionPerformed( ActionEvent e ) {
                    Test.selectedPanel = 2;
                    System.out.println( "btn 02 clicked" );
                    System.out.printf( "    Test.selectedPanel: %d\n", 
                            Test.selectedPanel );
                }
            });

            add ( btn01 );
            add ( btn02 );

        }

    }

    private static class Panel01 extends JPanel {
        public Panel01() {
            add( new JLabel( "Panel 01" ) );
        }
    }

    private static class Panel02 extends JPanel {
        public Panel02() {
            add( new JLabel( "Panel 02" ) );
        }
    }

}

如果编译并运行此代码,它将按预期运行,即打开包含两个JButton的JPanel的JFrame。单击这两个按钮之一时,它会更改de Test类中的静态变量。这个var在while循环中被“监视”,当更改时,将从JFrame中删除按钮面板并插入另一个JPanel。如上所述,代码可以正常工作,但是,如果删除“System.out.println(currentPanel!= selectedPanel)”行;它会“停止”工作,给人的印象是while循环中的if语句没有被评估。如果在while循环中启动带有断点的调试器会话,并且没有System.out.println()行,代码也会起作用!我真的无法弄清楚发生了什么。正如我所说,代码设计并不好,但自从学生编写代码后,现在他,他的教授和我想知道发生了什么。这可能是一件简单的事情,但我真的很想知道是否有人可以弄清楚发生了什么。如果删除if语句,代码也会起作用。我尝试了各种各样的事情,比如在新线程中插入while循环,但它似乎也不起作用。它似乎与同步相关......

0 个答案:

没有答案