java - 哪个 Swing 布局管理器可以获得我想要的布局?

标签 java swing layout layout-manager

我正在尝试按照这个模型制作一个基本的登录菜单:

enter image description here

我决定将整个菜单放到一个 JPanel 中,这样我就可以在连接成功后切换到另一个面板。

所以我决定使用 Borderlayout 将标题放在北区,将连接按钮放在南区。

我将 borderlayout 的中心设为面板本身。我决定让它成为一个网格布局,既有标签(登录名、密码),也有用户将在其中放置他的 ID 的文本字段。

结果非常丑陋,与我的预期相去甚远:

enter image description here

这是菜单的代码:

public class EcranAccueil extends JPanel {    
    private JLabel labelTitre;
    private JPanel PanelConnexion;
    private JButton boutonConnexion;     
    private JLabel labelLogin;
    private JLabel labelMotDepasse;
    private JTextField loginUser;
    private JTextField MotDepasseUser;

     EcranAccueil(EcranGestion EcranPrincipale){
            PanelConnexion = new JPanel();     
            this.setLayout(new BorderLayout());
            PanelConnexion.setLayout(new GridLayout(2,2));
            loginUser = new JTextField("User");
            loginUser.setMinimumSize(new Dimension(20,20));
            loginUser.setMaximumSize(new Dimension(20,20));
            MotDepasseUser = new JTextField("Password");
            boutonConnexion = new JButton("Connect");
            boutonConnexion.setMinimumSize(new Dimension(200,200));
            boutonConnexion.setMaximumSize(new Dimension(200,200));
            labelTitre=  new JLabel("ApplicationName");
            labelLogin=  new JLabel("Login");
            labelMotDepasse =  new JLabel("Password");          
            PanelConnexion.add(labelLogin);
            PanelConnexion.add(loginUser);
            PanelConnexion.add(labelMotDepasse);
            PanelConnexion.add(MotDepasseUser);
            this.add(labelTitre, BorderLayout.NORTH);
            this.add(PanelConnexion, BorderLayout.CENTER);       
            this.add(boutonConnexion, BorderLayout.SOUTH);
            }     }

我尝试使用 gridboxlayout 但我完全没有使用它并且它没有编译。有没有人有意见或建议?

最佳答案

解决复杂计算任务的常见策略是将它们分解为定义明确的可管理任务。分而治之。 这也适用于 gui:将设计分解为小的、易于布局的容器。 在这种情况下,例如首先将设计分为 3 个区域:

enter image description here

每个这样的区域都由嵌套面板实现。 正如您在代码中看到的,mainPanel 进一步分为两个嵌套面板,以简化和改进布局:

class EcranAccueil extends JPanel {

    EcranAccueil(){
        //Set layout (JPanel uses Flowlayout by default)
        setLayout(new BorderLayout(5,5));

        // a nested panel for application label
        JPanel topPanel = new JPanel();
        add(topPanel, BorderLayout.NORTH);
        topPanel.setLayout(new FlowLayout(FlowLayout.LEADING));//set

        JLabel labelTitre=  new JLabel("ApplicationName");
        topPanel.add(labelTitre);

        // a nested panel for login and password, having two rows
        JPanel mainPanel = new JPanel(new GridLayout(2, 1));
        add(mainPanel, BorderLayout.CENTER);

        JPanel loginPanel = new JPanel();
        loginPanel.setLayout(new FlowLayout(FlowLayout.TRAILING));
        mainPanel.add(loginPanel);

        JLabel labelLogin = new JLabel("Login");
        loginPanel.add(labelLogin);

        JTextField loginUser = new JTextField("User");
        loginUser.setColumns(10);
        loginPanel.add(loginUser);

        JPanel passwordPanel = new JPanel();
        passwordPanel.setLayout(new FlowLayout(FlowLayout.TRAILING));
        mainPanel.add(passwordPanel);
        JLabel labelMotDepasse = new JLabel("Password");
        passwordPanel.add(labelMotDepasse);
        JTextField motDepasseUser = new JTextField("Password");
        motDepasseUser.setColumns(10);
        passwordPanel.add(motDepasseUser);

        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
        add(buttonPanel,BorderLayout.SOUTH);
        JButton boutonConnexion = new JButton("Connect");
        buttonPanel.add(boutonConnexion);
    }
}

一旦掌握了基本思路,就可以进一步改进布局及其响应能力。


应用此策略的更多示例:1 23

关于java - 哪个 Swing 布局管理器可以获得我想要的布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47366628/

相关文章:

java - 在 java 字符串中转义 % 符号以应用 String.format

java - JTable 中的类型错误

ios - 适用于 iOS 的基于 XML 的布局

java - 将不同元素居中对齐 - Android

css - calc vs box-sizing 在布局中?

java - JdbcTemplate.excute -spring- 不与 plsql 一起使用

java - 将这种递归转换为迭代

java - 如何在代号一中将doneListener添加到TextArea

java - JMenuItem 在左侧显示复选框,如何禁用它?

Java:重新定位绘制到 JFrame 中的 Canvas 时出现问题