简体   繁体   English

Java JPanel和JLabel的

[英]Java JPanel and JLabel's

I am trying to create 2 sets of JLabels, one set would include a name and the second set would include values. 我正在尝试创建2组JLabel,其中一组将包含名称,而第二组将包含值。 The values get pulled from a database and get displayed to the second set of JLabels. 这些值将从数据库中提取并显示到第二组JLabel。

I cant seem how to line up the 2 sets of JLabels so that the set with the names would be on the left side of the panel and the set with the values would be directly to the right. 我似乎无法如何将2组JLabel排列在一起,以使具有名称的组位于面板的左侧,而具有值的组将直接位于面板的右侧。 I know my gridlayout has a factor in it I just dont know what it should be. 我知道我的网格布局有一个因素,我只是不知道它应该是什么。

package Frames;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;

import Application.Main;

public class AccountFrame extends JPanel implements PropertyChangeListener, ActionListener {

    private static JFrame accountFrame;

    private JLabel firstNameLabel;
    private JLabel lastNameLabel;
    private JLabel dobLabel;
    private JLabel emailLabel;
    private JLabel usernameLabel;
    private JLabel passwordLabel;

    private static String firstNameLabelText = "First Name: ";
    private static String lastNameLabelText = "Last Name: ";
    private static String dobLabelText = "Date Of Birth: ";
    private static String emailLabelText = "Email: ";
    private static String usernameLabelText = "Username: ";
    private static String passwordLabelText = "Password: ";

    private static JButton editButton;
    private static JButton closeButton;

    public AccountFrame() {
        super(new BorderLayout());

        firstNameLabel = new JLabel(firstNameLabelText);
        firstNameLabel.setForeground(Color.WHITE);
        firstNameLabel.setFont(new Font("Andalus", Font.BOLD, 18));

        lastNameLabel = new JLabel(lastNameLabelText);
        lastNameLabel.setForeground(Color.WHITE);
        lastNameLabel.setFont(new Font("Andalus", Font.BOLD, 18));

        dobLabel = new JLabel(dobLabelText);
        dobLabel.setForeground(Color.WHITE);
        dobLabel.setFont(new Font("Andalus", Font.BOLD, 18));

        emailLabel = new JLabel(emailLabelText);
        emailLabel.setForeground(Color.WHITE);
        emailLabel.setFont(new Font("Andalus", Font.BOLD, 18));

        usernameLabel = new JLabel(usernameLabelText);
        usernameLabel.setForeground(Color.WHITE);
        usernameLabel.setFont(new Font("Andalus", Font.BOLD, 18));

        passwordLabel = new JLabel(passwordLabelText);
        passwordLabel.setForeground(Color.WHITE);
        passwordLabel.setFont(new Font("Andalus", Font.BOLD, 18));

        editButton = new JButton("Edit");
        editButton.setBackground(new Color(129,13,13));
        editButton.setForeground(Color.WHITE);
        editButton.setFocusPainted(false);
        editButton.setFont(new Font("Andalus", Font.BOLD, 18));
        editButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
//EDIT ACCOUNT INFORMATION.
            }
        });

        closeButton = new JButton("Close");
        closeButton.setBackground(new Color(129,13,13));
        closeButton.setForeground(Color.WHITE);
        closeButton.setFocusPainted(false);
        closeButton.setFont(new Font("Andalus", Font.BOLD, 18));
        closeButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                accountFrame.dispose();
            }
        });

        TitledBorder accountPanelBorder = BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.WHITE), "Account", TitledBorder.CENTER , TitledBorder.TOP, new Font("Andalus", Font.BOLD, 18));
        accountPanelBorder.setTitleColor(Color.WHITE);

        //this is where the labels need to have values 
        //added on to the string to get values from the current character.
        JPanel accountPanel = new JPanel(new GridLayout(0, 1));
        accountPanel.add(firstNameLabel, BorderLayout.WEST);
        accountPanel.add(lastNameLabel, BorderLayout.WEST);
        accountPanel.add(dobLabel, BorderLayout.WEST);
        accountPanel.add(emailLabel, BorderLayout.WEST);
        accountPanel.add(usernameLabel, BorderLayout.WEST);
        accountPanel.add(passwordLabel, BorderLayout.WEST);
        accountPanel.setBackground(new Color(82,80,80));
        accountPanel.setBorder(accountPanelBorder);
        accountPanel.setPreferredSize(new Dimension(400,200));

//      JPanel accountValuesPanel = new JPanel(new GridLayout(0, 1));
//      accountValuesPanel.add(firstNameValue);
//      accountValuesPanel.setBackground(new Color(82,80,80));

        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.CENTER));
        buttons.add(editButton);
        buttons.add(closeButton);
        buttons.setBackground(new Color(82,80,80));

        setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
        setBackground(new Color(82,80,80));
        add(accountPanel, BorderLayout.WEST);
        add(buttons, BorderLayout.SOUTH);
//      add(accountValuesPanel, BorderLayout.LINE_END);
    }

    /**
     * Create the GUI and show it. For thread safety,
     * this method should be invoked from the 
     * event dispatch thread.
     */
    public static void createAndShowGUI() {
        accountFrame = new JFrame("OVERRATED");
        accountFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        accountFrame.setBackground(Color.red);
        accountFrame.add(new AccountFrame());
        accountFrame.setVisible(true);
        accountFrame.pack();
        accountFrame.setLocationRelativeTo(null);   
        accountFrame.setTitle("OVERRATED");
        accountFrame.setResizable(false);
        //startupFrame.setIconImage(new ImageIcon().getImage());
        JFrame.setDefaultLookAndFeelDecorated(false);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        // TODO Auto-generated method stub

    }

    public static void main(String[] args) {
        AccountFrame a = new AccountFrame();
        a.createAndShowGUI();
    }
}

First of all, even though your accountPanel layout is gridLayout, you have used it is BorderLayout: 首先,即使您的accountPanel布局是gridLayout,您仍然使用它是BorderLayout:

JPanel accountPanel = new JPanel(new GridLayout(0, 1));
accountPanel.add(firstNameLabel, BorderLayout.WEST); // BorderLayout.WEST wrong

My suggestion, You should use gridbaglayout for it. 我的建议是,您应该使用gridbaglayout。 GridbagLayout may look difficult to learn but it is actually quite logic. GridbagLayout看起来很难学习,但实际上是很合逻辑的。

I have changed your code a little bit. 我对您的代码做了一些更改。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;

@SuppressWarnings("serial")
public class AccountFrame extends JPanel implements PropertyChangeListener,
        ActionListener {
    private static JFrame accountFrame;
    private JTextField firstNameTextField, lastNameTextField, dobTextField,
            emailTextField, userNameTextField;
    private JPasswordField passwordPasswordField;

    private JLabel firstNameLabel;
    private JLabel lastNameLabel;
    private JLabel dobLabel;
    private JLabel emailLabel;
    private JLabel usernameLabel;
    private JLabel passwordLabel;

    private static String firstNameLabelText = "First Name: ";
    private static String lastNameLabelText = "Last Name: ";
    private static String dobLabelText = "Date Of Birth: ";
    private static String emailLabelText = "Email: ";
    private static String usernameLabelText = "Username: ";
    private static String passwordLabelText = "Password: ";

    private static JButton editButton;
    private static JButton closeButton;

    public AccountFrame() {
        super(new BorderLayout());

        firstNameLabel = new JLabel(firstNameLabelText);
        firstNameLabel.setForeground(Color.WHITE);
        firstNameLabel.setFont(new Font("Andalus", Font.BOLD, 18));

        lastNameLabel = new JLabel(lastNameLabelText);
        lastNameLabel.setForeground(Color.WHITE);
        lastNameLabel.setFont(new Font("Andalus", Font.BOLD, 18));

        dobLabel = new JLabel(dobLabelText);
        dobLabel.setForeground(Color.WHITE);
        dobLabel.setFont(new Font("Andalus", Font.BOLD, 18));

        emailLabel = new JLabel(emailLabelText);
        emailLabel.setForeground(Color.WHITE);
        emailLabel.setFont(new Font("Andalus", Font.BOLD, 18));

        usernameLabel = new JLabel(usernameLabelText);
        usernameLabel.setForeground(Color.WHITE);
        usernameLabel.setFont(new Font("Andalus", Font.BOLD, 18));

        passwordLabel = new JLabel(passwordLabelText);
        passwordLabel.setForeground(Color.WHITE);
        passwordLabel.setFont(new Font("Andalus", Font.BOLD, 18));

        // lets create JTextFields and a JPasswordField
        firstNameTextField = new JTextField(20);
        lastNameTextField = new JTextField(20);
        dobTextField = new JTextField(20);
        emailTextField = new JTextField(20);
        userNameTextField = new JTextField(20);
        passwordPasswordField = new JPasswordField(20);

        editButton = new JButton("Edit");
        editButton.setBackground(new Color(129, 13, 13));
        editButton.setForeground(Color.WHITE);
        editButton.setFocusPainted(false);
        editButton.setFont(new Font("Andalus", Font.BOLD, 18));
        editButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // EDIT ACCOUNT INFORMATION.
            }
        });

        closeButton = new JButton("Close");
        closeButton.setBackground(new Color(129, 13, 13));
        closeButton.setForeground(Color.WHITE);
        closeButton.setFocusPainted(false);
        closeButton.setFont(new Font("Andalus", Font.BOLD, 18));
        closeButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                accountFrame.dispose();
            }
        });

        TitledBorder accountPanelBorder = BorderFactory.createTitledBorder(
                BorderFactory.createLineBorder(Color.WHITE), "Account",
                TitledBorder.CENTER, TitledBorder.TOP, new Font("Andalus",
                        Font.BOLD, 18));
        accountPanelBorder.setTitleColor(Color.WHITE);

        // this is where the labels need to have values
        // added on to the string to get values from the current character.
        JPanel accountPanel = new JPanel(new GridBagLayout());
        accountPanel.setBackground(new Color(82, 80, 80));
        accountPanel.setBorder(accountPanelBorder);
        accountPanel.setPreferredSize(new Dimension(400, 200));

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.CENTER;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.insets = new Insets(0, 0, 0, 0);

        // lets add labels and textfields

        // 1. row
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.gridwidth = 1;
        gbc.gridheight = 1;
        accountPanel.add(firstNameLabel, gbc);

        gbc.gridx = 1;
        gbc.gridwidth = 2;
        accountPanel.add(firstNameTextField, gbc);

        // 2. row
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.gridwidth = 1;
        gbc.gridheight = 1;
        accountPanel.add(lastNameLabel, gbc);

        gbc.gridx = 1;
        gbc.gridwidth = 2;
        accountPanel.add(lastNameTextField, gbc);

        // 3. row
        gbc.gridx = 0;
        gbc.gridy = 2;
        gbc.gridwidth = 1;
        gbc.gridheight = 1;
        accountPanel.add(dobLabel, gbc);

        gbc.gridx = 1;
        gbc.gridwidth = 2;
        accountPanel.add(dobTextField, gbc);

        // 4. row
        gbc.gridx = 0;
        gbc.gridy = 3;
        gbc.gridwidth = 1;
        gbc.gridheight = 1;
        accountPanel.add(emailLabel, gbc);

        gbc.gridx = 1;
        gbc.gridwidth = 2;
        accountPanel.add(emailTextField, gbc);

        // 5. row
        gbc.gridx = 0;
        gbc.gridy = 4;
        gbc.gridwidth = 1;
        gbc.gridheight = 1;
        accountPanel.add(usernameLabel, gbc);

        gbc.gridx = 1;
        gbc.gridwidth = 2;
        accountPanel.add(userNameTextField, gbc);

        // 6. row
        gbc.gridx = 0;
        gbc.gridy = 5;
        gbc.gridwidth = 1;
        gbc.gridheight = 1;
        accountPanel.add(passwordLabel, gbc);

        gbc.gridx = 1;
        gbc.gridwidth = 2;
        accountPanel.add(passwordPasswordField, gbc);

        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.CENTER));
        buttons.add(editButton);
        buttons.add(closeButton);
        buttons.setBackground(new Color(82, 80, 80));

        setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
        setBackground(new Color(82, 80, 80));
        add(accountPanel, BorderLayout.WEST);
        add(buttons, BorderLayout.SOUTH);
        // add(accountValuesPanel, BorderLayout.LINE_END);
    }

    /**
     * Create the GUI and show it. For thread safety, this method should be
     * invoked from the event dispatch thread.
     */
    public static void createAndShowGUI() {
        accountFrame = new JFrame("OVERRATED");
        accountFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        accountFrame.setBackground(Color.red);
        accountFrame.add(new AccountFrame());

        accountFrame.pack();
        accountFrame.setTitle("OVERRATED");
        accountFrame.setResizable(false);
        accountFrame.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        // TODO Auto-generated method stub

    }

    public static void main(String[] args) {
        AccountFrame a = new AccountFrame();
        a.createAndShowGUI();
    }
}

屏幕截图

Your issue is that your GridLayout only has 1 column. 您的问题是您的GridLayout只有1列。 You need to create your GridLayout like this: new GridLayout(0, 2) . 您需要像这样创建GridLayoutnew GridLayout(0, 2) Below is a small runnable example that lays out pairs of JLabels right next to each other. 下面是一个小的可运行示例,该示例将JLabel对彼此相邻布置。

public static void main(String[] args) {
    JFrame f = new JFrame("Good day");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(400, 250);

    JPanel panel = new JPanel(new GridLayout(0, 2));
    JLabel left = new JLabel("Foo");
    JLabel right = new JLabel(("Bar"));
    JLabel hello = new JLabel("Hello");
    JLabel world = new JLabel("World");
    panel.add(left);
    panel.add(right);
    panel.add(hello);
    panel.add(world);
    f.add(panel);

    f.setVisible(true);
}

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

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