日期:2014-05-20  浏览次数:20707 次

java界面设计,布局问题



在上面这张图片里面,

在我自己的定义中,JFrame是网格布局
我是这样定义的:jf.setLayout(new GridLayout(3,1)) ;// jf 是JFrame的对象
然后来问题了,


问题1、:

怎么才能使得【用户账号】和【用户密码】界面两者的间隔变小

问题2、

我想在【用户账号】的上面加3行子,怎么加?我直接用Label貌似不给力,望指教!

------解决方案--------------------
Q1:你这样布局3行1列,组件会充满整个窗体。要想间隔小
    1:将窗体大小变小
    2:使用绝对定位,即setBound()
Q2:上面再加三行的话,jf.setLayout(new GridLayout(6,1)) 
     或者直接绝对定位加上去
------解决方案--------------------
很多人喜欢绝对定位,也就是 setLayout(null),大概是因为 Swing 的 LayoutManager 不是特别友好,算是个学习的小障碍。

但是稍微专业一点的UI程序员都不会推荐绝对定位,尤其是控件上有文字的时候,甚至在使用了LayoutManager以后,都不推荐你手动去 setPreferredSize(),因为——你不能假设文字的大小是固定的,你什么时候见过专业的用户界面,会因为你调整了系统的字体大小就变得很难看或者干脆文字都变成一堆“……”?

下面是布局代码,效果见图:





import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.util.Arrays;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;


/**
 *
 * @date   20/12/2012
 */
public class LoginPanel extends JPanel {
  
  public static void main(String[] args) {
    
    SwingUtilities.invokeLater(new Runnable() {

      @Override
      public void run() {
        
        try {
          
          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch(Exception e) {
          
          e.printStackTrace();
        }
        
        JFrame test = new JFrame("欢迎登入在线销售系统");
        
        test.setContentPane(new LoginPanel());
        test.pack();
        test.setResizable(false);
        
        test.setLocationRelativeTo(null);
        test.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        test.setVisible(true);