使用BorderLayout和pack()

时间:2016-06-11 04:36:50

标签: java swing border-layout

使用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); 

结果完全一样。

0 个答案:

没有答案