gpt4 book ai didi

java - 如何将多个 jpanel 相互对齐

转载 作者:行者123 更新时间:2023-12-01 11:43:23 25 4
gpt4 key购买 nike

在下面的代码中我尝试创建选项卡。

1-根据下面的代码,jlabel中包含“Demo”一词,在运行时,它不显示!为什么会发生这种情况以及如何强制该 jlabel 出现?

2-正如您在代码中看到的,函数 createTab1() 应该创建 jTextField 和 JPasswordField。在运行时它们出现,但它们水平排列,我想要的是,水平显示 JTextField 及其 jlabel 并排,第二个 jlabel 和 JpassworfField 彼此相邻但位于 jTextField 及其 jLabel 下方,如下所示:

 Labe     jtextField
label jPasswordField

但是下面的代码导致 GUI 显示在 this image

代码:

private void setUpGUI() {
// TODO Auto-generated method stub
jFrame_Main = new JFrame("Main Window");
jPanel_ContainerPanel = new JPanel(new BorderLayout());
jPanel_ContainerPanel.setBorder(BorderFactory.createLoweredBevelBorder());
jLabel_ContainerLabel = new JLabel("Demo");
jLabel_ContainerLabel.setHorizontalAlignment(SwingConstants.CENTER);

jPanel_ContainerPanel.add(jLabel_ContainerLabel, BorderLayout.NORTH);

createTab1();
//createTab2();

jTabbedPane = new JTabbedPane();
jTabbedPane.add("tab1", jPanel1);

jFrame_Main.getContentPane().add(jPanel_ContainerPanel);
jFrame_Main.getContentPane().add(jTabbedPane);
jFrame_Main.pack();
jFrame_Main.setVisible(true);
}

private void createTab1() {
// TODO Auto-generated method stub
jPanel1 = new JPanel();
jPanel1.setBounds(10, 15, 150, 20);
jLabel1 = new JLabel("userName");
jPanel1.add(jLabel1);

JTextField field = new JTextField();
field.setBounds( 10, 35, 150, 50 );
jPanel1.add( field );

JLabel label2 = new JLabel( "Password:" );
label2.setBounds( 10, 60, 150, 20 );
jPanel1.add( label2 );

JPasswordField fieldPass = new JPasswordField();
fieldPass.setBounds( 10, 80, 150, 20 );
jPanel1.add( fieldPass );
}

public static void main(String[] args) {
GUITabs guiTabs = new GUITabs();
}

}

最佳答案

问题:

  • 您正在使用 setBounds(...) 将组件添加到默认情况下使用 FlowLayout 的容器(JPanel),这是一种不考虑大小/位置/边界属性的布局其组成部分。
  • 虽然是的,您可以在明确定义为使用 null 布局的 JPanel 上使用 setBounds(...),但我建议您不要这样做这是因为这使得 GUI 非常不灵活,虽然它们在一个平台上看起来不错,但在大多数其他平台或屏幕分辨率上看起来很糟糕,而且很难更新和维护。相反,您需要研究和学习布局管理器,然后嵌套 JPanel,每个 JPanel 使用自己的布局管理器来创建在所有操作系统上看起来都不错的令人愉悦且复杂的 GUI。
  • 有人建议您使用 NetBeans 拖放操作来创建复杂的 GUI,虽然这可行,但您将无法理解 NetBeans 和 Swing 所使用的底层布局,因此最终会遇到一个当您需要超越 NetBeans 的能力时,例如您想要在程序运行过程中更改布局或添加组件时,请使用 wall。因此,您最好学习并使用布局管理器。您可以在这里找到布局管理器教程:Layout Manager Tutorial ,您可以在此处找到 Swing 教程和其他 Swing 资源的链接:Swing Info .
  • 您需要通过 setColumn(int column) 为您的 JTextField 和 JPasswordField 提供一个列值。这将为字段提供一些宽度。
  • 我自己,我会使用 GridBagLayout 将 JLabel、JTextFields 和 JPasswordFields 放入您的 JPanel
  • 我也不会从选项卡获取用户名和密码信息,而是从模式对话框(例如 JOptionPane)获取用户名和密码信息。这样,用户就无法访问您的主 GUI,直到他适本地处理模式对话框。
<小时/>

例如:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.Arrays;
import javax.swing.*;

public class UserNamePassword {
private static final int COLUMN_COUNT = 10;
private static final int I_GAP = 3;
private JTextField userNameField = new JTextField();
private JPasswordField passwordField = new JPasswordField();
private JPanel mainPanel = new JPanel(new GridBagLayout());

public UserNamePassword() {
userNameField.setColumns(COLUMN_COUNT);
passwordField.setColumns(COLUMN_COUNT);

GridBagConstraints gbc = getGbc(0, 0, GridBagConstraints.BOTH);
mainPanel.add(new JLabel("User Name:"), gbc);
gbc = getGbc(1, 0, GridBagConstraints.HORIZONTAL);
mainPanel.add(userNameField, gbc);
gbc = getGbc(0, 1, GridBagConstraints.BOTH);
mainPanel.add(new JLabel("Password:"), gbc);
gbc = getGbc(1, 1, GridBagConstraints.HORIZONTAL);
mainPanel.add(passwordField, gbc);
}

public static GridBagConstraints getGbc(int x, int y, int fill) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = x;
gbc.gridy = y;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.insets = new Insets(I_GAP, I_GAP, I_GAP, I_GAP);
gbc.fill = fill;

return gbc;
}

public String getUserName() {
return userNameField.getText();
}

public char[] getPassword() {
return passwordField.getPassword();
}

public JComponent getMainPanel() {
return mainPanel;
}

private static void createAndShowGui() {
UserNamePassword project2 = new UserNamePassword();

int input = JOptionPane.showConfirmDialog(null, project2.getMainPanel(),
"Login", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
if (input == JOptionPane.OK_OPTION) {
if (project2.getUserName().equals("username") &&
Arrays.equals(project2.getPassword(), "password".toCharArray())) {
// you're good
} else {
JOptionPane.showMessageDialog(project2.getMainPanel(),
"error message", "Error Title", JOptionPane.ERROR_MESSAGE);
}
}
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}

关于java - 如何将多个 jpanel 相互对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29327925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com