以下代码的Grouplayout存在一些问题,请帮助我弄明白
我也上传了输出文件,我不确定它们是否有任何对齐问题。 Kingly看看并帮我弄清楚。
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();
}
}
}
答案 0 :(得分:3)
GroupLayout
是基于约束的布局。基本原则是确定组件之间的位置约束,在x轴和y轴上独立。
只有两个约束:组件是顺序的,或者是并行的。
在您的情况下,您的布局很简单:
代码如下:
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);