下面是一个代码,它复制了我的一位朋友的教授的代码。学生如果重新发明井,试图制作类似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循环,但它似乎也不起作用。它似乎与同步相关......