Grouplayout有点搞砸了

时间:2013-04-18 09:28:15

标签: java swing layout grouplayout

以下代码的Grouplayout存在一些问题,请帮助我弄明白

我也上传了输出文件,我不确定它们是否有任何对齐问题。 Kingly看看并帮我弄清楚。

enter image description here

  package javaapplication1;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.InetAddress;
import javax.swing.*;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class Progress extends JFrame implements ActionListener {

    static JFrame frame;
    public JLabel ClientIP;
    JTextField ip;
    JLabel ClientPassword;
    JTextField pass;
    JLabel Videoname;
    JTextField vname;
    JLabel perccomplete;
    JTextField percent;
    JLabel PacketsSent;
    JTextField pacsent;
    JLabel Connectiontype;
    JTextField conntype;
    JLabel noofvideossent;
    JTextField videosend;
    JButton disconnect;
    JButton refresh;
    JButton ok;

    public Progress() {

        ClientIP = new JLabel("Client's IP:");
        ClientPassword = new JLabel("Clients Password:");
        Videoname = new JLabel("Video being Transfered:");
        perccomplete = new JLabel("% of transfer Complete:");
        PacketsSent = new JLabel("No of Packets sent:");
        Connectiontype = new JLabel("Connection Type:");
        noofvideossent = new JLabel("No of Videos Sent:");


        ip = new JTextField(Ipad);
        ip.setColumns(20);
        pass = new JTextField(Ipass);
        pass.setColumns(20);
        vname = new JTextField(Iselvid);
        vname.setColumns(20);
        percent = new JTextField("10%");
        percent.setColumns(20);
        pacsent = new JTextField(String.valueOf(RTSPSeqNb));
        pacsent.setColumns(20);
        String c;
        if (clientConnected == true) {
            c = "TCP";
        } else {
            c = "not Connected";
        }
        conntype = new JTextField(c);
        conntype.setColumns(20);
        videosend = new JTextField(String.valueOf(videocount));
        videosend.setColumns(20);

        //Tell accessibility tools about label/textfield pairs.
        ClientIP.setLabelFor(ip);
        ClientPassword.setLabelFor(pass);
        Videoname.setLabelFor(vname);
        perccomplete.setLabelFor(percent);
        PacketsSent.setLabelFor(pacsent);
        Connectiontype.setLabelFor(conntype);
        noofvideossent.setLabelFor(videosend);

        //Lay out the labels in a panel.
        GroupLayout layout = new GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setAutoCreateGaps(true);
        layout.setAutoCreateContainerGaps(true);

        // Turn on automatically creating gaps between components that touch
        // the edge of the container and the container.
        layout.setAutoCreateContainerGaps(true);

        GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
        hGroup.addGroup(layout.createParallelGroup(Alignment.LEADING).
                addComponent(ClientIP).addComponent(ClientPassword).addComponent(Videoname).addComponent(perccomplete).addComponent(PacketsSent).addComponent(Connectiontype).addComponent(noofvideossent));

        hGroup.addGroup(layout.createParallelGroup(Alignment.LEADING).
                addComponent(ip).addComponent(pass).addComponent(vname).addComponent(percent).
                addComponent(pacsent).addComponent(conntype).addComponent(videosend));

        layout.setHorizontalGroup(hGroup);


        GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();

        vGroup.addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(ClientIP)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(ClientPassword)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(Videoname)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(perccomplete)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(PacketsSent)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(Connectiontype)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(noofvideossent));

        vGroup.addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(ip)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(pass)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(vname)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(percent)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(pacsent)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(conntype)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(videosend));

        layout.setVerticalGroup(vGroup);




//        JPanel buttonPane = new JPanel(new GridLayout(0,1));
//        disconnect = new JButton("Disconnect Client");
//        disconnect.setActionCommand("Disconnect");
//        disconnect.addActionListener(this);
//        refresh = new JButton("Refresh Details");
//        refresh.setActionCommand("refresh");
//        refresh.addActionListener(this);
//        ok = new JButton("OK");
//        ok.setActionCommand("ok");
//        ok.addActionListener(this);
//        buttonPane.add(refresh);
//        buttonPane.add(disconnect);
//        buttonPane.add(ok);
//        add(buttonPane, BorderLayout.AFTER_LAST_LINE);
        setTitle("Find");
        pack();
    }

    private static void createAndShowGUI() {
        //Create and set up the window.
        //frame = new JFrame("Connected Client's Details");

        //frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        new Progress().setVisible(true);
        //Add contents to the window.
//        frame.add(new Progress());
//        //Display the window.
//        frame.pack();
//        frame.setVisible(true);
    }

    public static void main(String args[]) {
        //Schedule a job for the event dispatch thread:
        //creating and showing this application's GUI.
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                //Turn off metal's use of bold fonts
                UIManager.put("swing.boldMetal", Boolean.FALSE);
                createAndShowGUI();
            }
        });
    }

    public void actionPerformed(ActionEvent e) {
        if ("Disconnect".equalsIgnoreCase(e.getActionCommand())) {
            ClientIPAddr = null;
            JOptionPane.showMessageDialog(frame, "Eggs are not supposed to be green.");
        }
        if ("refresh".equalsIgnoreCase(e.getActionCommand())) {
            String Ipad = null, Ipass, Iselvid;
            if (ClientIPAddr == null || ClientIPAddr.equals("")) {
                Ipad = "Not Connected";
            } else {
                Ipad = ClientIPAddr.toString();
            }
            if (vFilePassword == null || vFilePassword.equals("")) {
                Ipass = "No Password";
            } else {
                Ipass = vFilePassword;
            }
            if (selected_video == null || selected_video.equals("")) {
                Iselvid = "Not Selected";
            } else {
                Iselvid = selected_video;
            }
            ip.setText(Ipad);
            pass.setText(Ipass);
            vname.setText(Iselvid);
            percent.setText("10%");
            pacsent.setText(String.valueOf(RTSPSeqNb));
            String c;
            if (clientConnected == true) {
                c = "TCP";
            } else {
                c = "not Connected";
            }
            conntype.setText(c);
            videosend.setText(String.valueOf(videocount));
        }
        if ("ok".equalsIgnoreCase(e.getActionCommand())) {
            frame.dispose();
        }

    }
}

3 个答案:

答案 0 :(得分:3)

GroupLayout是基于约束的布局。基本原则是确定组件之间的位置约束,在x轴和y轴上独立。

只有两个约束:组件是顺序的,或者是并行的。

在您的情况下,您的布局很简单:

  • 在x轴上,所有标签并行,所有文本字段并行。
  • 在y轴上,有[label,然后是textfield]组,全部并行

代码如下:

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class Progress extends JPanel {

    private JLabel ClientIP;
    private JTextField ip;
    private JLabel ClientPassword;
    private JTextField pass;
    private JLabel Videoname;
    private JTextField vname;
    private JLabel perccomplete;
    private JTextField percent;
    private JLabel PacketsSent;
    private JTextField pacsent;
    private JLabel Connectiontype;
    private JTextField conntype;
    private JLabel noofvideossent;
    private JTextField videosend;

    public Progress() {

        ClientIP = new JLabel("Client's IP:");
        ClientPassword = new JLabel("Clients Password:");
        Videoname = new JLabel("Video being Transfered:");
        perccomplete = new JLabel("% of transfer Complete:");
        PacketsSent = new JLabel("No of Packets sent:");
        Connectiontype = new JLabel("Connection Type:");
        noofvideossent = new JLabel("No of Videos Sent:");


        ip = new JTextField();
        pass = new JTextField();
        vname = new JTextField();
        percent = new JTextField();
        pacsent = new JTextField();
        conntype = new JTextField();
        videosend = new JTextField();

        ip.setColumns(20);
        pass.setColumns(20);
        vname.setColumns(20);
        percent.setColumns(20);
        pacsent.setColumns(20);
        conntype.setColumns(20);
        videosend.setColumns(20);

        //Tell accessibility tools about label/textfield pairs.
        ClientIP.setLabelFor(ip);
        ClientPassword.setLabelFor(pass);
        Videoname.setLabelFor(vname);
        perccomplete.setLabelFor(percent);
        PacketsSent.setLabelFor(pacsent);
        Connectiontype.setLabelFor(conntype);
        noofvideossent.setLabelFor(videosend);

        GroupLayout layout = new GroupLayout(this);
        setLayout(layout);
        layout.setAutoCreateGaps(true);
        layout.setAutoCreateContainerGaps(true);

        layout.setHorizontalGroup(
                layout.createSequentialGroup()
                    .addGroup(layout.createParallelGroup(Alignment.LEADING)
                        .addComponent(ClientIP)
                        .addComponent(ClientPassword)
                        .addComponent(Videoname)
                        .addComponent(perccomplete)
                        .addComponent(PacketsSent)
                        .addComponent(Connectiontype)
                        .addComponent(noofvideossent))
                    .addGroup(layout.createParallelGroup(Alignment.LEADING)
                        .addComponent(ip)
                        .addComponent(pass)
                        .addComponent(vname)
                        .addComponent(percent)
                        .addComponent(pacsent)
                        .addComponent(conntype)
                        .addComponent(videosend)));

        layout.setVerticalGroup(
                layout.createSequentialGroup()
                    .addGroup(layout.createParallelGroup(Alignment.BASELINE)
                        .addComponent(ClientIP)
                        .addComponent(ip))
                    .addGroup(layout.createParallelGroup(Alignment.BASELINE)
                        .addComponent(ClientPassword)
                        .addComponent(pass))
                    .addGroup(layout.createParallelGroup(Alignment.BASELINE)
                        .addComponent(Videoname)
                        .addComponent(vname))
                    .addGroup(layout.createParallelGroup(Alignment.BASELINE)
                        .addComponent(perccomplete)
                        .addComponent(percent))
                    .addGroup(layout.createParallelGroup(Alignment.BASELINE)
                        .addComponent(PacketsSent)
                        .addComponent(pacsent))
                    .addGroup(layout.createParallelGroup(Alignment.BASELINE)
                        .addComponent(Connectiontype)
                        .addComponent(conntype))
                    .addGroup(layout.createParallelGroup(Alignment.BASELINE)
                        .addComponent(noofvideossent)
                        .addComponent(videosend)));
    }


    public static void main(String[] args) throws Exception {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                UIManager.put("swing.boldMetal", Boolean.FALSE);
                JFrame f = new JFrame("test frame");
                f.setContentPane(new Progress());
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setTitle("Find");
                f.pack();
                f.setVisible(true);
            }
        });
    }

}

当代码正确缩进时,GroupLayout相对容易理解。我将Alignement.LEADING替换为Alignement.BASELINE,以便在基线上对齐(标签和文本字段的文本在同一行上)。

答案 1 :(得分:0)

根据我的经验,GroupLayout最适用于GUI构建器,例如NetBeans中的构建器,因为它专门为此目的而构建。所以只需使用GUI构建器修复布局。

如果您想“手动”操作布局,则可以更轻松地完成此任务的布局管理器,恕我直言。

答案 2 :(得分:0)

非常感谢你的帮助。我修改了代码如下,它工作..对齐很好,但它们在垂直轴上是问题..

GroupLayout layout = new GroupLayout(getContentPane());
         getContentPane().setLayout(layout);
         layout.setAutoCreateGaps(true);
         layout.setAutoCreateContainerGaps(true);

         // Turn on automatically creating gaps between components that touch
         // the edge of the container and the container.
         layout.setAutoCreateContainerGaps(true);

         GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
         hGroup.addGroup(layout.createParallelGroup(Alignment.LEADING).
                 addComponent(ClientIP).addComponent(ClientPassword).addComponent(Videoname).addComponent(perccomplete).addComponent(PacketsSent).addComponent(Connectiontype).addComponent(noofvideossent));

         hGroup.addGroup(layout.createParallelGroup(Alignment.LEADING).
                 addComponent(ip).addComponent(pass).addComponent(vname).addComponent(percent).
                 addComponent(pacsent).addComponent(conntype).addComponent(videosend).addComponent(disconnect).addComponent(refresh).addComponent(ok));
         layout.setHorizontalGroup(hGroup);


         GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();

         vGroup.addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(ClientIP).addComponent(ip)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(ClientPassword).addComponent(pass)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(Videoname).addComponent(vname)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(perccomplete).addComponent(percent)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(PacketsSent).addComponent(pacsent)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(Connectiontype).addComponent(conntype)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(noofvideossent).addComponent(videosend));

         vGroup.addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(disconnect)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(refresh)).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(ok));
         layout.setVerticalGroup(vGroup);