在上面这张图片里面,在我自己的定义中,JFrame是网格布局
我是这样定义的:jf.setLayout(new GridLayout(3,1)) ;// jf 是JFrame的对象
然后来问题了,
问题1、:怎么才能使得【用户账号】和【用户密码】界面两者的间隔变小问题2、我想在【用户账号】的上面加3行子,怎么加?我直接用Label貌似不给力,望指教!

解决方案 »

  1.   

    Q1:你这样布局3行1列,组件会充满整个窗体。要想间隔小
        1:将窗体大小变小
        2:使用绝对定位,即setBound()
    Q2:上面再加三行的话,jf.setLayout(new GridLayout(6,1)) 
         或者直接绝对定位加上去
      

  2.   

    使用javafx吧,布局要简单些,可使用css,用swing的网格布局,由于3行均分,行间距不可能变小,可以多分几行,将要布局的控件放到中间的几行中,这样间距就变小了,或者采用其他的布局方式,
      

  3.   

    很多人喜欢绝对定位,也就是 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);
          }
        });
      }
      
      private static final String LABEL_USERNAME = "用户账号:";
      private static final String LABEL_PASSWORD = "用户密码:";
      
      private static final String LABEL_OK = "确定";
      private static final String LABEL_Cancel = "取消";
      
      private static final int FIELD_COLS = 20;
      
      private JTextField fieldUsername;
      private JPasswordField fieldPassword;
      
      private Action actionOK;
      private Action actionCancel;
      
      LoginPanel() {
        
        super(new BorderLayout(5, 5));
        
        assert SwingUtilities.isEventDispatchThread();
        
        fieldUsername = new JTextField(FIELD_COLS);
        fieldPassword = new JPasswordField(FIELD_COLS);
        
        actionOK = new AbstractAction(LABEL_OK) {      @Override
          public void actionPerformed(ActionEvent e) {
            
            //@TODO to be implemented.
          }
        };
        
        actionCancel = new AbstractAction(LABEL_Cancel) {      @Override
          public void actionPerformed(ActionEvent e) {
            
            //@TODO to be implemented.
          }
        };
        
        add(layoutText(Arrays.asList(
                
                "第一行文字",
                "第二行文字",
                "第三行文字"
            )), BorderLayout.NORTH);
        add(layoutFields(), BorderLayout.CENTER);
        add(layoutControl(), BorderLayout.SOUTH);
        
        setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
      }
      
      private JComponent layoutControl() {
        
        JComponent result = new JPanel();
        
        result.add(new JButton(actionOK));
        result.add(new JButton(actionCancel));
        
        return result;
      }
      
      private JComponent layoutFields() {
        
        JComponent result = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.anchor = GridBagConstraints.WEST;
        gbc.fill = GridBagConstraints.NONE;
        gbc.insets = new Insets(5, 5, 5, 5);
        result.add(new JLabel(getBoldHTML(LABEL_USERNAME)), gbc);
        gbc.gridy++;
        result.add(new JLabel(getBoldHTML(LABEL_PASSWORD)), gbc);
        
        gbc.gridx++;
        gbc.gridy = 0;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        result.add(fieldUsername, gbc);
        gbc.gridy++;
        result.add(fieldPassword, gbc);
        
        return result;
      }
      
      private JComponent layoutText(List<String> lines) {
        
        assert lines != null;
        
        JComponent result = new JPanel(new GridLayout(lines.size(), 1));
        for(String line : lines)
          result.add(new JLabel(line));
        
        result.setBorder(BorderFactory.createEmptyBorder(5, 10, 0, 10));
        return result;
      }
      
      private String getBoldHTML(String s) {
        
        return "<html><b>" + s + "</b></html>";
      }
    }
      

  4.   

    gbc.fill = GridBagConstraints.HORIZONTAL;的下面少了一句:gbc.weightx = 1;
      

  5.   

    同样的 class 文件在 ubuntu 下的运行效果:
      

  6.   

    setBounds我刚开始设置了,貌似没有用,不晓得为什么!
      

  7.   

    楼主,我建议你如果想用java编辑界面,还是用netbean吧,用它画完界面后,再把代码拷到eclipse,再进行你的编程,这样你就不用担心界面画不好的问题了
      

  8.   


    谢谢 ... 
    虽然我只学了2礼拜Java,但我会尝试着看
    【哎:谁叫学校任务需要呢 ... 】
      

  9.   

    eclipse可以安装windowbuilder pro,使用JGoodies FormLayout布局。
      

  10.   

    你把窗体大小设置为不可改变的,这样你的字体就不会随着窗体的大小改变了,加上下面这句话就行了
    this.setResizable(false);//设置窗体大小不可改变
      

  11.   

    我没细看。但是我觉得楼主吧JFrame不要设置大小问题就都解决了。 如果大小不合适pack();一下就好了。如果尺寸什么的有具体要求。那就楼上的来吧。