A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高境 金牌黑马   /  2012-12-22 11:54  /  1645 人查看  /  2 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 高境 于 2012-12-22 19:58 编辑

在下面这张图片里面,

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


问题1、:

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

问题2、

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

1355911732_7777.jpg (14.13 KB, 下载次数: 35)

1355911732_7777.jpg

评分

参与人数 3黑马币 +116 收起 理由
怪盗急得 + 30
Fateˉ似命守护 + 80
曹佳佳 + 6 赞一个!

查看全部评分

2 个回复

倒序浏览
希望能帮到楼主:

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

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



  1. import java.awt.BorderLayout;
  2. import java.awt.GridBagConstraints;
  3. import java.awt.GridBagLayout;
  4. import java.awt.GridLayout;
  5. import java.awt.Insets;
  6. import java.awt.event.ActionEvent;
  7. import java.util.Arrays;
  8. import java.util.List;
  9. import javax.swing.AbstractAction;
  10. import javax.swing.Action;
  11. import javax.swing.BorderFactory;
  12. import javax.swing.JButton;
  13. import javax.swing.JComponent;
  14. import javax.swing.JFrame;
  15. import javax.swing.JLabel;
  16. import javax.swing.JPanel;
  17. import javax.swing.JPasswordField;
  18. import javax.swing.JTextField;
  19. import javax.swing.SwingUtilities;
  20. import javax.swing.UIManager;


  21. /**
  22. *
  23. * @date   20/12/2012
  24. */
  25. public class LoginPanel extends JPanel {
  26.   
  27.   public static void main(String[] args) {
  28.    
  29.     SwingUtilities.invokeLater(new Runnable() {

  30.       @Override
  31.       public void run() {
  32.         
  33.         try {
  34.          
  35.           UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
  36.         }
  37.         catch(Exception e) {
  38.          
  39.           e.printStackTrace();
  40.         }
  41.         
  42.         JFrame test = new JFrame("欢迎登入在线销售系统");
  43.         
  44.         test.setContentPane(new LoginPanel());
  45.         test.pack();
  46.         test.setResizable(false);
  47.         
  48.         test.setLocationRelativeTo(null);
  49.         test.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  50.         test.setVisible(true);
  51.       }
  52.     });
  53.   }
  54.   
  55.   private static final String LABEL_USERNAME = "用户账号:";
  56.   private static final String LABEL_PASSWORD = "用户密码:";
  57.   
  58.   private static final String LABEL_OK = "确定";
  59.   private static final String LABEL_Cancel = "取消";
  60.   
  61.   private static final int FIELD_COLS = 20;
  62.   
  63.   private JTextField fieldUsername;
  64.   private JPasswordField fieldPassword;
  65.   
  66.   private Action actionOK;
  67.   private Action actionCancel;
  68.   
  69.   LoginPanel() {
  70.    
  71.     super(new BorderLayout(5, 5));
  72.    
  73.     assert SwingUtilities.isEventDispatchThread();
  74.    
  75.     fieldUsername = new JTextField(FIELD_COLS);
  76.     fieldPassword = new JPasswordField(FIELD_COLS);
  77.    
  78.     actionOK = new AbstractAction(LABEL_OK) {

  79.       @Override
  80.       public void actionPerformed(ActionEvent e) {
  81.         
  82.         //@TODO to be implemented.
  83.       }
  84.     };
  85.    
  86.     actionCancel = new AbstractAction(LABEL_Cancel) {

  87.       @Override
  88.       public void actionPerformed(ActionEvent e) {
  89.         
  90.         //@TODO to be implemented.
  91.       }
  92.     };
  93.    
  94.     add(layoutText(Arrays.asList(
  95.             
  96.             "第一行文字",
  97.             "第二行文字",
  98.             "第三行文字"
  99.         )), BorderLayout.NORTH);
  100.     add(layoutFields(), BorderLayout.CENTER);
  101.     add(layoutControl(), BorderLayout.SOUTH);
  102.    
  103.     setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
  104.   }
  105.   
  106.   private JComponent layoutControl() {
  107.    
  108.     JComponent result = new JPanel();
  109.    
  110.     result.add(new JButton(actionOK));
  111.     result.add(new JButton(actionCancel));
  112.    
  113.     return result;
  114.   }
  115.   
  116.   private JComponent layoutFields() {
  117.    
  118.     JComponent result = new JPanel(new GridBagLayout());
  119.     GridBagConstraints gbc = new GridBagConstraints();
  120.    
  121.     gbc.gridx = 0;
  122.     gbc.gridy = 0;
  123.     gbc.anchor = GridBagConstraints.WEST;
  124.     gbc.fill = GridBagConstraints.NONE;
  125.     gbc.insets = new Insets(5, 5, 5, 5);
  126.     result.add(new JLabel(getBoldHTML(LABEL_USERNAME)), gbc);
  127.     gbc.gridy++;
  128.     result.add(new JLabel(getBoldHTML(LABEL_PASSWORD)), gbc);
  129.    
  130.     gbc.gridx++;
  131.     gbc.gridy = 0;
  132.     gbc.fill = GridBagConstraints.HORIZONTAL;
  133.     result.add(fieldUsername, gbc);
  134.     gbc.gridy++;
  135.     result.add(fieldPassword, gbc);
  136.    
  137.     return result;
  138.   }
  139.   
  140.   private JComponent layoutText(List<String> lines) {
  141.    
  142.     assert lines != null;
  143.    
  144.     JComponent result = new JPanel(new GridLayout(lines.size(), 1));
  145.     for(String line : lines)
  146.       result.add(new JLabel(line));
  147.    
  148.     result.setBorder(BorderFactory.createEmptyBorder(5, 10, 0, 10));
  149.     return result;
  150.   }
  151.   
  152.   private String getBoldHTML(String s) {
  153.    
  154.     return "<html><b>" + s + "</b></html>";
  155.   }
  156. }
复制代码
回复 使用道具 举报
我喜欢用 setLayout(null),因为这个可以随心所欲的定们,尤其是对一些复杂的UI.......对象.setLocation(int ,int)这样方便多了....
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马