【问题标题】:JPanels: One with a JTextArea and another with a JLabelJPanels:一个带有 JTextArea,另一个带有 JLabel
【发布时间】:2014-03-18 20:28:46
【问题描述】:

我在这方面已经有一段时间了,但我似乎无法掌握它。我正在尝试生成一个 JPanel,上面有一个 JTextArea,下面有两个 JLabel,但是我的 JLabel 最终位于 JTextArea 的左侧,我无法让另一个出现。

这是我的代码(抱歉显示的东西 - 真的只是填充物):

public JPanel contentPane() {
    JPanel something = new JPanel();

    String information = "Please";

    info = new JTextArea(information, 4, 30);
    info.setEditable(false);
    info.setLineWrap(true);
    info.setWrapStyleWord(true);

    JPanel one = new JPanel(new BorderLayout());
    one.setBackground(Color.WHITE);
    one.setLocation(10, 10);
    one.setSize(50, 50);
    one.add(info, BorderLayout.CENTER);
    something.add(one, BorderLayout.NORTH);

    JPanel two = new JPanel(new BorderLayout());
    two.setBackground(null);
    two.setLocation(220, 10);
    two.setSize(50, 50);
    two.add(new JLabel("Please work"), BorderLayout.EAST);
    two.add(new JLabel("Oh gosh, please"), BorderLayout.WEST);
    something.add(two, BorderLayout.SOUTH);

    something.setOpaque(true);
    return something;
}

public static void GUI() {
    JFrame frame = new JFrame("You Guessed It!");

    DisplayStudent panel = new DisplayStudent();
    frame.setContentPane(panel.contentPane());

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

请并感谢任何花时间提供帮助的人。

【问题讨论】:

  • 你使用的是哪个版本的JDK?
  • @masterX244 7.4 我相信。

标签: java swing user-interface layout layout-manager


【解决方案1】:

当您创建 something 时,您没有指定任何布局管理器,但稍后您尝试使用将 one 添加到 something BorderLayout 常量——这不起作用,因为 JPanel 的默认布局管理器是 FlowLayout。

试试这个;

JPanel something = new JPanel(new BorderLayout());

【讨论】:

  • 或者,您可以使用 GridLayout() 将任何元素放置在网格中:docs.oracle.com/javase/tutorial/uiswing/layout/grid.html
  • GridLayout 很好,只要您希望面板中的所有组件具有完全相同的大小。当您开始混合尺寸并希望拥有不同的动态时(例如,有些可能水平缩放,有些可能垂直缩放,锚定 NORTH,有些应该拉伸等等),您需要更改为 GridBagLayout,它是迄今为止最“通用的” " 我正在使用的布局管理器。
  • @Markus Millfjord 它有效,但现在我的 JLabels 出现在中间,而不是在东西方。我还缺少什么?
  • 好吧,BorderLayout 可能不是这里的最佳选择,因为它只会显示实际添加的组件。而且,不同的地方(NORTH、CENTER、SOUTH 等)都以不同的方式对待它们的组件; CENTER 组件水平和垂直拉伸,而 NORTH 和 SOUTH 仅水平拉伸。在您的情况下,您的标签位于 two 中,并且您尝试将其大小设置为 (50,50),并将 two 放在 something 中 南。要将标签强制为 EAST 和 WEST,您需要在 two 的 CENTER 中添加一个虚拟组件,并使用 two 的 setSize
  • 此外,如果您正在使用布局管理器,则根本不应该尝试设置位置。因此,如果您想要一种快速且简单的方法,仅以您指定的方式显示组件(因为您使用 setLocation 和 setSize),您可以将 something 的布局管理器设置为 null相反,允许您在像素级别手动放置。我个人不喜欢不使用布局管理器,但我想这一切都取决于您想要做什么以及最终应用程序需要多么动态。
猜你喜欢
  • 2016-06-16
  • 2016-01-11
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多