gpt4 book ai didi

java - JTextField 堆叠在 JTextArea 之上

转载 作者:行者123 更新时间:2023-12-01 21:53:40 25 4
gpt4 key购买 nike

我正在开发一个小型 GUI 项目,该项目构建一个图书管理器来管理一本书。在我的布局中,我想要一个 textArea 来显示有关我的书的信息,在我的 textArea 下显示一个文本 JLabel 和一个 JTextArea code> 让我在 JLabel 的同一列和 Label 旁边的 1 行输入信息。但是,当我运行程序时,textAreaLabel 完全覆盖了我的 textArea

如何解决这个问题。谢谢!!

import java.awt.*;
import javax.swing.*;

public class Design extends JFrame {

JButton button1;
JTextArea outputArea;
JLabel stockLabel, bookPriceLabel;
JTextField stockTextField, priceTextField;
JPanel panel;
GridBagConstraints gc;

public Design(){
super("Book Info");

gc = new GridBagConstraints ();
panel = new JPanel();
outputArea = new JTextArea(20, 50);
stockLabel = new JLabel ("Books In Stock");
bookPriceLabel = new JLabel("Book Price");
stockTextField = new JTextField(10);
button1 = new JButton ("button1");

panel.setLayout(new GridBagLayout());
panel.setSize(600, 600);

gc.anchor = GridBagConstraints.NORTHWEST;
gc.weightx = 1;
gc.weighty = 1;
panel.add(outputArea, gc);

gc.gridx = 2;
gc.gridy = 2;
panel.add(stockLabel, gc);

gc.gridx = 3;
gc.gridy = 2;
panel.add(stockTextField, gc);

this.getContentPane().add(panel);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(600,600);
setVisible(true);
setLocationRelativeTo(null);
}

public static void main (String args[]){
Design frame = new Design();
}
}

最佳答案

您可以申请gridWidth JTextArea 的约束这将允许它跨越多个列。

记住,GridBagLayout仍然基于网格(行和列)的概念,但它提供了很大的灵 active 来自定义组件如何填充和跨越该网格

也许像...

Layout

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Design extends JFrame {

JButton button1;
JTextArea outputArea;
JLabel stockLabel, bookPriceLabel;
JTextField stockTextField, priceTextField;
JPanel panel;
GridBagConstraints gc;

public Design() {
super("Book Info");

gc = new GridBagConstraints();
panel = new JPanel();
outputArea = new JTextArea(20, 50);
stockLabel = new JLabel("Books In Stock");
bookPriceLabel = new JLabel("Book Price");
stockTextField = new JTextField(10);
button1 = new JButton("button1");

panel.setLayout(new GridBagLayout());

gc.anchor = GridBagConstraints.NORTHWEST;
gc.gridx = 0;
gc.gridy = 0;
gc.weightx = 1;
gc.weighty = 1;
gc.gridwidth = GridBagConstraints.REMAINDER;
panel.add(new JScrollPane(outputArea), gc);

gc.weightx = 0;
gc.weighty = 0;
gc.anchor = GridBagConstraints.WEST;
gc.gridwidth = 1;
gc.gridx = 0;
gc.gridy = 2;
panel.add(stockLabel, gc);

gc.gridx++;
gc.gridy = 2;
panel.add(stockTextField, gc);

this.getContentPane().add(panel);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
setLocationRelativeTo(null);
}

public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

Design frame = new Design();
}
});
}
}

参见How to Use GridBagLayout了解更多详情

一些一般反馈:

  • 调用setSize没有任何意义。在将添加到使用布局管理器的容器中的组件上,该操作将被忽略,布局管理器将调用 setSize与它想要使用的东西
  • JTextArea确实应该包含在 JScrollPane 中,如果不这样做,你会得到一些奇怪的结果(它会随着文本占据更多空间而增长)
  • 首选 JFrame#pack超过JFrame#setSize ,这将考虑框架边框,将框架包裹在内容周围
  • 您确实应该避免直接从顶级容器(如JFrame)扩展,除了将您锁定在单个用例之外,您实际上没有向框架添加任何新功能。相反,从类似 JPanel 的内容开始,在此基础上构建核心 UI,然后在需要时将其添加到您想要的任何容器

关于java - JTextField 堆叠在 JTextArea 之上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34755178/

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