【问题标题】:Positioning GUI objects on a Frame在框架上定位 GUI 对象
【发布时间】:2013-05-06 11:16:48
【问题描述】:

我正在开发一个 Java 应用程序,在定位一些标签和文本字段方面需要一些帮助。

这是我的代码:

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JComboBox;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JTextField; 
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.FlowLayout;

public class AuctionClient
{
public AuctionClient()
{
    JFrame GUIFrame = new JFrame();
    JPanel GUIPanel = new JPanel();
    JLabel LabelUserName = new JLabel("UserName:");
    JTextField TextFieldUserName = new JTextField("                               ");

    JLabel LabelPassword = new JLabel("Password:");
    JTextField TextFieldPassword = new JTextField("                               ");        

    GUIFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    GUIFrame.setTitle("Auction Client");
    GUIFrame.setSize(500,250);

    GUIFrame.setLocationRelativeTo(null);

    GUIPanel.add(LabelUserName);
    GUIPanel.add(TextFieldUserName);        

    GUIPanel.add(LabelPassword);
    GUIPanel.add(TextFieldPassword);         

    GUIFrame.add(GUIPanel, BorderLayout.NORTH);
    GUIFrame.setVisible(true);
}  
}

使用上面的代码,LabelPassword 和 TextFieldPassword 与 LabelUsername 和 TextFieldUsername 位于同一行。能否请我帮忙将 LabelPassword 和 TextFieldPassword 放置在新行上。是否可以指定 X,Y 坐标来定位 JFrame 上的对象?

这是一张图片,向您展示对象当前的显示方式:

http://canning.co.nz/Java/Positioning_Image.png

【问题讨论】:

    标签: java swing jlabel jtextfield


    【解决方案1】:

    您永远不应该尝试使用坐标定位组件。而是使用适当的LayoutManager's 并使用逻辑条件和约束来定位您的组件。

    这是一个使用GridBagLayout的例子:

    import java.awt.BorderLayout;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
    
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JPasswordField;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    
    public class AuctionClient {
        public AuctionClient() {
            JFrame guiFrame = new JFrame();
            JPanel guiPanel = new JPanel(new GridBagLayout());
            JLabel userNameLabel = new JLabel("UserName:");
            JTextField userNameTextField = new JTextField(30);
    
            JLabel passwordLabel = new JLabel("Password:");
            JTextField passwordTextField = new JPasswordField(30);
    
            guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            guiFrame.setTitle("Auction Client");
            guiFrame.setSize(500, 250);
    
            guiFrame.setLocationRelativeTo(null);
            GridBagConstraints labelGBC = new GridBagConstraints();
            labelGBC.insets = new Insets(3, 3, 3, 3);
            GridBagConstraints fieldGBC = new GridBagConstraints();
            fieldGBC.insets = new Insets(3, 3, 3, 3);
            fieldGBC.gridwidth = GridBagConstraints.REMAINDER;
            guiPanel.add(userNameLabel, labelGBC);
            guiPanel.add(userNameTextField, fieldGBC);
    
            guiPanel.add(passwordLabel, labelGBC);
            guiPanel.add(passwordTextField, fieldGBC);
    
            guiFrame.add(guiPanel, BorderLayout.NORTH);
            guiFrame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new AuctionClient();
                }
            });
        }
    }
    

    【讨论】:

    • @AndrewThompson 没问题 ;-)
    【解决方案2】:
    • GridLayout, SpringLayout, GridBagLayout 默认可以这样做

    • 最简单的方法是GridLayout(2, 2, 10, 10)

      1. 但每个 JComponent 都可以通过其容器调整大小

      2. 必须更改 JLabel 的水平对齐方式(setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);setHorizontalAlignment(JLabel.RIGHT);

      3. 确定 (JTextField TextFieldUserName = new JTextField(20)) 任何 LayoutManager 的初始维度

    【讨论】:

    • 也可以考虑GroupLayout ,见here
    • 我喜欢你放置的点,因为你不能只张贴微笑。 +1
    猜你喜欢
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    相关资源
    最近更新 更多