一个JFrame中的多个JPanel未显示顶部面板

时间:2015-02-26 22:48:06

标签: java string swing user-interface jpanel

所以我正在编写一个程序,其中我希望单个JFrame包含一个单独颜色的JPanel标题,并且直接在下面有一个单独的JPanel中的按钮网格。到目前为止,我的程序完美地工作,除了标题字符串不在NORTH面板中显示的事实。相反,我得到一个包含设置背景颜色的框,中间有一个小灰框。我想知道我是否没有正确设置面板的大小?

我听说这可以使用JLabel完成,但是当我尝试这样做时,它不会显示我设置的背景颜色。

那么,有没有人可以告诉我如何使用JPanel实现以下功能(最好是因为我想知道它是如何工作的以及我缺少的)或使用JLabel:填充那个小灰盒子带有字符串的标题中间。

这是我的代码:

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

public class Example {

    public static void main(String[] args) {

        // Initialize a panel for the header, and mainGrid which will contain buttons
        JPanel panel = new JPanel();
        JPanel header = new JPanel();
        JPanel mainGrid = new JPanel();

        // Initialize the header
        DisplayPanel message = new DisplayPanel();
        header.setBackground(Color.ORANGE);
        header.add(message);

        // Initialize the mainGrid panel
        mainGrid.setLayout(new GridLayout(2,2,2,2));
        mainGrid.add(new JButton("1"));
        mainGrid.add(new JButton("2"));
        mainGrid.add(new JButton("3"));
        mainGrid.add(new JButton("4"));

        // Add the two subpanels to the main panel
        panel.setLayout(new BorderLayout());
        panel.add(header, BorderLayout.NORTH); // The issue is this panel isn't displaying the String created in DisplayPanel
        panel.add(mainGrid, BorderLayout.CENTER);

        // Add main panel to JFrame
        JFrame display = new JFrame("Test");
        display.setContentPane(panel);
        display.setSize(200,100);
        display.setLocation(500,200);
        display.setVisible(true);
        display.setResizable(false);
        display.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private static class DisplayPanel extends JPanel {
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawString("header" , 20, 20); // The string I want to be displayed
        }
    }
}

我非常感谢任何人的帮助或输入,因为我只学习了几个月的Java,这是我的第一篇文章。提前谢谢。

此外,我们将非常感谢您提出的任何关于写作的一般提示。

2 个答案:

答案 0 :(得分:2)

我想知道您的问题是否是您将邮件JPanel嵌套在标头JPanel中,而容器标头JPanel使用JPanel默认的FlowLayout。因此,它所拥有的组件不会自行扩展,而且仍然很小。

  • 考虑给标题JPanel一个BorderLayout,以便消息在其中扩展,或者
  • 使用JLabel显示您的文本,而不是JPanel的paintComponent方法。 JLabel的大小应足以显示其文本。如果您这样做并希望它显示背景颜色,您只需在JLabel上调用setOpaque(true),然后重新设置。

实际上,如果你嵌套JLabel,那么就没有必要让它变得不透明。就这样做:

  JPanel header = new JPanel();
  JPanel mainGrid = new JPanel();
  JLabel message = new JLabel("Header", SwingConstants.CENTER);
  header.setBackground(Color.ORANGE);
  header.setLayout(new BorderLayout());
  header.add(message);

答案 1 :(得分:0)

我强烈建议使用GUI构建器WYSIWYG IDE,如NetBeans,您可以轻松地将组件拖放到需要的位置。如果您正在进行任何类型的复杂GUI布局,那么尝试编写和维护代码可能是疯狂的(在我看来,这是荒谬的)。

您尝试实施的布局在NetBeans中将是微不足道的。