对中摆动组件

Posted

技术标签:

【中文标题】对中摆动组件【英文标题】:Centering Swing Components 【发布时间】:2014-01-16 13:38:42 【问题描述】:

如何使我的文本字段和按钮居中?

编辑:用 SSCE 更新了我的帖子。希望这会有所帮助。

顺便说一句,我希望左图看起来像右图。

package pkg;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import javax.swing.*;

public class Game 

private static JPanel panel = new JPanel();
public static JTextField username = new JTextField(20);
public static JPasswordField password = new JPasswordField(20);
JButton login = new JButton("Login");
JLabel status = new JLabel();
private static JPanel game = new JPanel();
private JButton logout = new JButton("Logout");
private static JFrame frame = new JFrame("RuneShadows");

public Game() 
    panel.add(username);
    panel.add(password);
    panel.add(login);
    panel.add(status);

    game.add(logout);
    frame.add(panel);
    frame.setSize(806, 553);
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);


public static void main(String[] args) 
    new Game();


public void loadGame() 
    frame.remove(panel);
    frame.revalidate();
    frame.add(game);
    frame.revalidate();

    logout.addActionListener(new ActionListener() 
        public void actionPerformed(ActionEvent e) 
            frame.remove(game);
            frame.revalidate();
            frame.add(panel);
            frame.revalidate();
            try 
                Client.socketOut.writeUTF("logout");
                Client.socketOut.writeUTF(Client.username);
             catch (IOException e1) 
                e1.printStackTrace();
            
        
    );


我想要的样子:

我尝试了许多不同的布局样式,但我似乎无法让它工作......

【问题讨论】:

如需尽快获得更好的帮助,请发帖 SSCCE。另见this answer.. 在你的图片中你有 2 个,你想要的那个是左边还是右边? 我希望左图看起来像右图。 上厕所How to use BoxLayout trail。注意没有调用frame.pack() 方法,你也应该看看Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing? 不要使用 frame.remove() 和 frame.add() 替换框架上的整个面板。相反,您应该使用CardLayout。本教程为此提供了一个示例。 【参考方案1】:

import java.awt.*;
    import java.awt.event.*;
    import java.io.IOException;
    import javax.swing.*;
    import javax.swing.border.*;

    public class Game 

    private static JPanel panel = new JPanel();
    public static JTextField username = new JTextField(20);
    public static JPasswordField password = new JPasswordField(20);
    JButton login = new JButton("Login");
    JLabel status = new JLabel();
    private static JPanel game = new JPanel(new FlowLayout(FlowLayout.CENTER));
    private JButton logout = new JButton("Logout");
    private static JFrame frame = new JFrame("RuneShadows");

    public Game() 
        panel.setLayout(new GridLayout(0,1,15,15));
        panel.setBorder(new EmptyBorder(50,100,50,100));
        panel.add(username);
        panel.add(password);
        panel.add(status);

        JPanel logoutConstrain = new JPanel(new FlowLayout(FlowLayout.CENTER));
        logoutConstrain.add(logout);
        panel.add(logoutConstrain);
        frame.setLayout(new GridBagLayout());
        frame.add(panel);
        //frame.setSize(806, 553);  // forget this nonsense, instead..
        frame.pack();  // best!
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    

    public static void main(String[] args) 
        new Game();
    

    public void loadGame() 
        frame.remove(panel);
        frame.revalidate();
        frame.add(game);
        frame.revalidate();

        logout.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent e) 
                frame.remove(game);
                frame.revalidate();
                frame.add(panel);
                frame.revalidate();
            
        );
    
    

【讨论】:

以上是关于对中摆动组件的主要内容,如果未能解决你的问题,请参考以下文章

自定义摆动组件:repaint() 的问题

在 JDialog 上摆动 wait() 和 notify(),对话框不显示其组件

使用AssertJ从三个相同的摆动组件中选择一个

尽管在 Swing 组件中使用 String.format,但格式仍会摆动

java - 如何在单击时将摆动组件动态添加到 gui?

如何添加文件选择器以摆动 GUI 表单调​​色板组件 IntelliJ IDEA