我是Java的初学者。我想在Swings中帮助定位我的组件。
我无法决定应该使用哪个布局管理器按以下顺序定位组件
+-----------------------------------+
| |
| Username Text Field |
| Password Password Field |
| |
| Submit button |
| |
+-----------------------------------+
以下是我的代码
package ssst;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
class Test implements ActionListener{
JButton submit;
JFrame j;
JFrame jf;
public Test()
{
j = new JFrame("PLAIN");
j.setBounds(500,150,300,400);
JPanel panel = new JPanel();
j.add(panel);
GridBagLayout gb = new GridBagLayout();
panel.setLayout(gb);
GridBagConstraints c = new GridBagConstraints();
JLabel label = new JLabel("User Name");
c.gridx=0;
c.gridy=0;
c.fill=GridBagConstraints.HORIZONTAL;
c.anchor=GridBagConstraints.WEST;
c.ipadx=5;
c.ipady=5;
c.insets= new Insets(7,7,7,7);
panel.add(label,c);
JTextField username = new JTextField(10);
c.gridx=1;
c.gridy=0;
c.fill=GridBagConstraints.HORIZONTAL;
c.anchor=GridBagConstraints.WEST;
c.ipadx=5;
c.insets= new Insets(7,7,7,7);
panel.add(username,c);
JLabel password= new JLabel("Password");
c.gridx=0;
c.gridy=1;
c.fill=GridBagConstraints.HORIZONTAL;
c.anchor=GridBagConstraints.WEST;
c.ipadx=5;
c.insets= new Insets(7,7,7,7);
panel.add(password,c);
JPasswordField pass = new JPasswordField(10);
c.gridx=1;
c.gridy=1;
c.fill=GridBagConstraints.HORIZONTAL;
c.anchor=GridBagConstraints.WEST;
c.insets= new Insets(7,7,7,7);
panel.add(pass,c);
submit = new JButton("Submit");
c.gridx=1;
c.gridy=6;
c.fill=GridBagConstraints.HORIZONTAL;
c.anchor=GridBagConstraints.WEST;
c.insets= new Insets(7,7,7,7);
panel.add(submit,c);
submit.addActionListener(this);
j.setVisible(true);
j.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
j.setVisible(false);
jf = new JFrame("NEw Window");
jf.setVisible(true);
jf.setBounds(500,150,300,400);
JPanel panel2 = new JPanel();
panel2.setLayout(null);
jf.add(panel2);
JButton logout = new JButton("LOGOUT");
logout.setBounds(100, 30, 400, 30);
panel2.add(logout);
logout.addActionListener(new Test2());
jf.setDefaultCloseOperation(j.EXIT_ON_CLOSE);
}
class Test2 implements ActionListener{
public void actionPerformed(ActionEvent e) {
jf.dispose();
j.setVisible(true);
}
}
public static void main(String args[])
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new Test();
}
}
);
}
}
答案 0 :(得分:4)
您可以使用GridBagLayout
和JOptionPane
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class LoginPane extends JPanel {
private JTextField userName;
private JPasswordField password;
public LoginPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.EAST;
gbc.insets = new Insets(4, 4, 4, 4);
add(new JLabel("Username:"), gbc);
gbc.gridy++;
add(new JLabel("Password:"), gbc);
userName = new JTextField(10);
password = new JPasswordField(10);
gbc.gridx = 1;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.WEST;
gbc.fill = GridBagConstraints.HORIZONTAL;
add(userName, gbc);
gbc.gridy++;
add(password, gbc);
}
public String getUsername() {
return userName.getText();
}
public char[] getPassword() {
return password.getPassword();
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
LoginPane loginPane = new LoginPane();
int option = JOptionPane.showOptionDialog(
null,
loginPane,
"Login",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.PLAIN_MESSAGE,
null,
new Object[]{"Submit"},
"Submit");
if (option == 0) {
System.out.println("Happy");
}
}
});
}
}
你也可以使用GridLayout
这个概念。
请查看http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html以获取更多想法和指向其他布局管理器的链接
答案 1 :(得分:2)
去GridBagLayout,布局逻辑很简单。它适用于X和Y坐标。 here
此外,您还应该通过其他布局,它将帮助您决定未来的设计。
答案 2 :(得分:1)
最好使用GridBagLayout,如果你添加新组件,布局管理器如果你(最大化/恢复下来),要注意在屏幕上适合组件。
答案 3 :(得分:1)
主观上说布局管理者适合a
设计。对于MigLayout
经理来说,这种设计是明智之举。
为了进行比较,我提供了一个MigLayout
的解决方案。
package com.zetcode;
import java.awt.EventQueue;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout;
public class MigLayoutLoginEx extends JFrame {
public MigLayoutLoginEx() {
initUI();
setTitle("Log in");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
private void initUI() {
setLayout(new MigLayout("ins 15, wrap 2", "[][grow]"));
JLabel lbl1 = new JLabel("User name:");
JTextField field1 = new JTextField(10);
JLabel lbl2 = new JLabel("Password:");
JPasswordField field2 = new JPasswordField(10);
JButton btn = new JButton("Submit");
add(lbl1);
add(field1, "growx");
add(lbl2);
add(field2, "growx");
add(btn, "span 2, center, gaptop 20");
pack();
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MigLayoutLoginEx ex = new MigLayoutLoginEx();
ex.setVisible(true);
}
});
}
}
使用六行布局代码实现布局。