使用BorderLayout时我有一个相当神秘的问题。当我将JButton置于CENTER位置并将一个组件(比如JLabel)放在SOUTH中时,后者会随机消失。这是一个例子。要查看问题,您必须将窗口调整为更大的尺寸,然后将鼠标光标移动到整个屏幕上(关闭按钮,标签,窗口标题栏,Windows任务栏,屏幕边缘)。您无需按按钮。经过几秒钟的运动后,标签消失了。只有在您再次调整窗口大小或最小化/恢复窗口时才会重新出现。
奇怪的是,pack()似乎很重要,我没有注意到我使用的问题,例如相反,我的JFrame上的setSize(600,300)。似乎CENTER组件必须是JButton,而SOUTH组件可以是任何东西(我试过JLabel,JCheckBox),并且位置(SOUTH和CENTER)很重要。例如,如果按钮位于NORTH,则不会发生。
当然,在实践中很容易避免这种情况,但我仍然想知道它为什么会发生,以及我做错了什么或不安全。我在Windows 10上使用JDK 8版本77.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MyExample extends JFrame{
MyExample() { initGUI();} // Constructor
private void initGUI(){
// Create the button
JButton myButton=new JButton("Press ME !");
// Create the label
JLabel testLabel=new JLabel("TEST !!!");
// Set up the window
JPanel pane=(JPanel) getContentPane();
pane.setLayout(new BorderLayout());
pane.add(myButton,BorderLayout.CENTER);
pane.add(testLabel,BorderLayout.SOUTH);
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
// setSize(600,300);
}
public static void main(String[] args){
EventQueue.invokeLater(()->{
MyExample me=new MyExample();
me.setVisible(true);
});
}
}
注意:为了清楚起见,我定义了JPanel对象窗格,但是如果我只是编写
// Set up the window
add(myButton,BorderLayout.CENTER);
add(testLabel,BorderLayout.SOUTH);
结果完全一样。