繁体   English   中英

在BorderLayout中对齐JLabel和JTextField

[英]Aligning JLabel and JTextField in BorderLayout

我只是尝试使用一些GUI组件的Java BorderLayoutGridLayout

我正在尝试右对齐JLabel并左对齐JTextField以便它可以更好看。

setAlignmentXsetHorizontalAlignment的帮助下,我在stackoverflow本身找到了一些答案。 两者都没用。

基本上,我在每个BorderLayout有3个组件。

  1. 一个JLabel
  2. JTextField中
  3. 一个JButton

然后,这些组件将添加到每行的GridLayout

在此输入图像描述

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 *
 * @author dinesh
 */
public class MySettings {

    public static void main(String[] args) {
        JFrame jf = new JFrame("hi");

        //demo Info Panel start
        // <editor-fold defaultstate="collapsed" desc="demo info panel">
        JLabel lbldemoExecutablePath = new JLabel("demo Executable Path :");
//        lbldemoExecutablePath.setAlignmentX(JLabel.LEADING);
//        lbldemoExecutablePath.setAlignmentY(JLabel.LEADING);
//        lbldemoExecutablePath.setHorizontalAlignment(SwingConstants.CENTER);

        JTextField txtdemoInstallationPath = new JTextField(10);
        txtdemoInstallationPath.setEditable(false);
        txtdemoInstallationPath.setBackground(Color.WHITE);
        txtdemoInstallationPath.setToolTipText("getdemoPath()");
        txtdemoInstallationPath.setAlignmentX(JLabel.LEADING);
        txtdemoInstallationPath.setAlignmentY(JLabel.LEADING);

        JButton btndemoBrowse = new JButton("Browse");

        btndemoBrowse.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                System.out.println("demo browse button clicked");
            }
        });

        JPanel pnldemoInfo = new JPanel(new BorderLayout(10, 10));
        pnldemoInfo.add(lbldemoExecutablePath, BorderLayout.LINE_START);
        pnldemoInfo.add(txtdemoInstallationPath, BorderLayout.CENTER);
        pnldemoInfo.add(btndemoBrowse, BorderLayout.LINE_END);
        // </editor-fold>
        //demo info panel end

        //sample Info Panel start
        // <editor-fold defaultstate="collapsed" desc="sample info panel">
        JLabel lblsampleExecutablePath = new JLabel("sample Executable Path :");
//        lblsampleExecutablePath.setAlignmentX(JLabel.LEADING);
//        lblsampleExecutablePath.setAlignmentY(JLabel.LEADING);
        JTextField txtsampleInstallationPath = new JTextField(10);
        txtsampleInstallationPath.setEditable(false);
        txtsampleInstallationPath.setBackground(Color.WHITE);
        txtsampleInstallationPath.setToolTipText("getsamplePath()");


        JButton btnsampleBrowse = new JButton("Browse");

        btnsampleBrowse.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                System.out.println("demo browse button clicked");
            }
        });

        JPanel pnlsampleInfo = new JPanel(new BorderLayout(10, 10));
        pnlsampleInfo.add(lblsampleExecutablePath, BorderLayout.LINE_START);
        pnlsampleInfo.add(txtsampleInstallationPath, BorderLayout.CENTER);
        pnlsampleInfo.add(btnsampleBrowse, BorderLayout.LINE_END);
        // </editor-fold>
        //sample info panel end

        //app Info Panel start
        // <editor-fold defaultstate="collapsed" desc="app info panel">
        JLabel lblappExecutablePath = new JLabel("app Executable Path :");
//        lblappExecutablePath.setAlignmentX(JLabel.LEADING);
        JTextField txtappExecutablePath = new JTextField(10);
        txtappExecutablePath.setEditable(false);
        txtappExecutablePath.setBackground(Color.WHITE);
        txtappExecutablePath.setToolTipText("gettxtappExecutablePath()");

        JButton btnappBrowse = new JButton("Browse");

        btnappBrowse.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                System.out.println("appBrowse browse button clicked");
            }
        });

        JPanel pnlappInfo = new JPanel(new BorderLayout(10, 10));
        pnlappInfo.add(lblappExecutablePath, BorderLayout.LINE_START);
        pnlappInfo.add(txtappExecutablePath, BorderLayout.CENTER);
        pnlappInfo.add(btnappBrowse, BorderLayout.LINE_END);
        // </editor-fold>
        //app info panel end

        //logfile Info Panel start
        // <editor-fold defaultstate="collapsed" desc="logfile info panel">
        JLabel lblLogFilePath = new JLabel("Log File Path :");
//        lblLogFilePath.setAlignmentX(JLabel.LEADING);
        JTextField txtLogFilePath = new JTextField(10);
        txtLogFilePath.setEditable(false);
        txtLogFilePath.setBackground(Color.WHITE);
        txtLogFilePath.setToolTipText("gettxtLogFilePath()");

        JButton btnLogFileBrowse = new JButton("Browse");

        btnLogFileBrowse.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                System.out.println("appBrowse browse button clicked");
            }
        });

        JPanel pnlLogFileInfo = new JPanel(new BorderLayout(10, 10));
        pnlLogFileInfo.add(lblLogFilePath, BorderLayout.LINE_START);
        pnlLogFileInfo.add(txtLogFilePath, BorderLayout.CENTER);
        pnlLogFileInfo.add(btnLogFileBrowse, BorderLayout.LINE_END);
        // </editor-fold>
        //logfile info panel end

        JPanel pnlGereal = new JPanel(new GridLayout(0, 1));
        pnlGereal.add(pnldemoInfo);
        pnlGereal.add(pnlsampleInfo);
        pnlGereal.add(pnlappInfo);
        pnlGereal.add(pnlLogFileInfo);

        jf.add(pnlGereal);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //jf.setSize(500, 500);

        jf.pack();
        jf.setVisible(true);
    }

}

我在哪里弄错了? 我准确设置对齐的位置?

有很多方法可以解决这个问题。 您可以在3个面板中打破整个框架,每个面板对应一个JLabelJTextFieldJButton 然后,您可以设置每个JPanel的大小,而不必担心面板中包含的各个组件。

+----------------+----------------+----------------+
|  panel1        |  panel2        |  panel3        |
+----------------+----------------+----------------+
|  label1        |  field1        |  button1       |
|  label2        |  field2        |  button2       |     
|  label3        |  field3        |  button3       |
|  label4        |  field4        |  button4       |
+----------------+----------------+----------------+

或者您也可以为每个JLabel相同的宽度。 像这样:

final int LABEL_WIDTH = 200;
...
lbldemoExecutablePath.setPreferredSize(new Dimension(LABEL_WIDTH, lbldemoExecutablePath.getHeight()));
...
lblsampleExecutablePath.setPreferredSize(new Dimension(LABEL_WIDTH, lblsampleExecutablePath.getHeight()));
...
lblappExecutablePath.setPreferredSize(new Dimension(LABEL_WIDTH, lblappExecutablePath.getHeight()));
...
lblLogFilePath.setPreferredSize(new Dimension(LABEL_WIDTH, lblLogFilePath.getHeight())); 

对齐在这里不起作用,因为BorderLayout使用JLabels大小并动态调整宽度。

您可以尝试使用此代码查看对齐方式:

JLabel lbldemoExecutablePath = new JLabel( "demo Executable Path :" );
lbldemoExecutablePath.setPreferredSize( new Dimension(200,100) );
lbldemoExecutablePath.setHorizontalAlignment( SwingConstants.RIGHT );

你可以在这里看到你的JLabel(“演示可执行路径:”)是正确的。 但是你不应该在你的代码中使用setPreferredSize()方法我发布它只是为了向你展示对齐是否有效。

您可以使用JGoodies中的FormLayout而不是BorderLayout http://www.jgoodies.com/freeware/libraries/forms/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM