【问题标题】:How to add Components into a JPanel如何将组件添加到 JPanel
【发布时间】:2016-06-05 06:59:37
【问题描述】:

我只想在面板中添加一些组件并设置面板背景颜色。但我做不到。任何人都可以建议我,怎么做?这是我的代码。

public Multiple2() {
        getContentPane().setLayout(null);

        JPanel p1 = new JPanel();
        p1.setBackground(Color.RED);
        getContentPane().add(p1,BorderLayout.SOUTH);

        lb1 = new JLabel("Enter the First Number: ");
        lb1.setBounds(10, 10, 250, 20);

        tf1 = new JTextField(100);
        tf1.setBounds(155, 10, 400, 20);

        lb2 = new JLabel("Enter the Second Number: ");
        lb2.setBounds(10, 35, 250, 20);

        tf2 = new JTextField(100);
        tf2.setBounds(155, 35, 400, 20);

        getContentPane().add(lb1);
        getContentPane().add(tf1);
        getContentPane().add(lb2);
        getContentPane().add(tf2);


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

【问题讨论】:

  • 一如既往地在 Stack Overflow 上,请说明预期和实​​际行为,并发布完整代码(我可能错了,但我认为你可以做一个更小的例子仍然显示您不想要的行为)。 “做不到”似乎含糊不清;准确告诉我们您尝试时发生了什么。
  • 避免使用null 布局,像素完美的布局是现代用户界面设计中的一种错觉。影响组件单个尺寸的因素太多,您无法控制。 Swing 旨在与核心的布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正。首先看看Laying Out Components Within a Container

标签: java swing jpanel


【解决方案1】:

您似乎正在尝试将 p 添加到 contentPane 的 BorderLayout.SOUTH 位置,但您已删除 contentPane 的布局管理器,因此它没有 SOUTH 位置,因此您永远不会在任何地方查看 p1。

要将组件添加到p1 JPanel,您需要使用add(...) 方法,就像使用JFrame 的contentPane 一样。所以不是

getContentPane().add(foo);

你会这样做:

p1. add(foo);

那么您可能需要将 p1 JPanel 添加到 contentPane 的 BorderLayout.CENTER 位置,而不是使用 null 布局。

虽然空布局和setBounds() 在 Swing 新手看来是创建复杂 GUI 的最简单和最好的方法,但创建的 Swing GUI 越多,使用它们时遇到的困难就越严重。当 GUI 调整大小时,它们不会调整您的组件大小,它们是增强或维护的皇家女巫,放置在滚动窗格中时它们完全失败,在与原始不同的所有平台或屏幕分辨率上查看时它们看起来很糟糕.

例如:

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.*;

public class Mult2 extends JPanel {
    private JTextField field1 = new JTextField(10);
    private JTextField field2 = new JTextField(10);

    public Mult2() {
        setLayout(new GridBagLayout());

        add(new JLabel("Enter the First Number:"), createGbc(0, 0));
        add(field1, createGbc(1, 0));
        add(new JLabel("Enter the Second Number:"), createGbc(0, 1));
        add(field2, createGbc(1, 1));

        setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        setBackground(Color.PINK);
    }

    private static GridBagConstraints createGbc(int x, int y) {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridheight = 1;
        gbc.gridwidth = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;
        int right = x % 2 == 0 ? 15 : 5;
        gbc.insets = new Insets(5, 5, 5, right);
        return gbc;
    }

    private static void createAndShowGui() {
        Mult2 mainPanel = new Mult2();

        JFrame frame = new JFrame("Multiply");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多