【问题标题】:JTextArea added to BorderLayout is not visible添加到 BorderLayout 的 JTextArea 不可见
【发布时间】:2016-11-02 12:19:08
【问题描述】:

我有四个组件,我想将它们添加到设置了 BorderLayout 的框架中。 MenuBar 向北,JScrollPane 向中心,JTextField 向南,JTextArea 向东。问题是最后一个组件不可见。

setLayout(new BorderLayout());

add(menu, BorderLayout.NORTH);
add(scrollChatPane, BorderLayout.CENTER);
add(myMessage, BorderLayout.SOUTH);
add(users, BorderLayout.EAST);

上面的代码工作如下:

但是当我用简单的按钮替换我的组件时,一切正常:

setLayout(new BorderLayout());

add(new Button("North"), BorderLayout.NORTH);
add(new Button("Center"), BorderLayout.CENTER);
add(new Button("South"), BorderLayout.SOUTH);
add(new Button("West"), BorderLayout.WEST);
add(new Button("East"), BorderLayout.EAST);

上面的代码工作如下:

有人可以帮忙吗?谢谢。

【问题讨论】:

    标签: java swing border-layout


    【解决方案1】:

    您的JTextArea 没有初始大小,因此不可见。我假设你想要一个固定的宽度和一个可变的高度,所以我认为这就是你想要的

    JTextArea users = new JTextArea();
    users.setPreferredSize(new Dimension(100, users.getHeight()));
    add(users, BorderLayout.EAST);
    

    【讨论】:

    • 它有效。我尝试了同样的事情,但使用了 setMinimumSize() 并忘记检查 setPreferredSize()。你知道为什么第一种方法不起作用吗?
    • 不完全是。 AFAIK setMinimumSize()setMaximumSize() 在调整框架大小时缩放组件时提供限制。 setPreferredSize() 定义初始缩放。但并不总是确定何时使用哪个。
    • 他不必设置大小,他可以打电话给jFrame.pack()
    • @SaclyrBarlonium 否。JTextArea 如果没有初始内容,则没有初始大小。此外,pack() 调用将给出零宽度大小。
    • @ArcticLord - pack() 使用首选大小。这一切都是自动的。尝试在不定义尺寸的情况下创建 GUI。 BorderLayou 很简单。并最终使用它。
    【解决方案2】:

    你试过了吗

    frame.getContentPane().add(menu, BorderLayout.NORTH);
    frame.getContentPane().add(scrollChatPane, BorderLayout.CENTER);
    frame.getContentPane().add(myMessage, BorderLayout.SOUTH);
    frame.getContentPane().add(users, BorderLayout.EAST);
    

    如果直接使用 JFrame 的内容窗格,则不需要 setLayout

    【讨论】:

      【解决方案3】:

      您需要将组件设置到滚动窗格中。 例如如果你需要滚动myMessage:

      scrollChatPane.setViewportView(myMessage);
      setLayout(new BorderLayout());
      
      add(menu, BorderLayout.NORTH);
      add(scrollChatPane, BorderLayout.CENTER);
      add(users, BorderLayout.EAST); // probably add(new JScrollPane(users), BorderLayout.EAST);
      

      【讨论】:

        【解决方案4】:

        确保 JTextArea 有要显示的消息。使用 Swing 类时需要考虑 3 种不同的尺寸:最小尺寸、最大尺寸和首选尺寸。布局将利用这些尺寸来显示组件。在 BorderLayout 的情况下,这应该在 SOUTH、NORTH、WEST 和 EAST 组件上调用 getMinimumSize(),对 CENTER 组件调用 getPreferredSize()。 JTextArea 的最小大小是适合文本所需的大小,因此没有文本集的 JTextArea 将返回一个新的 Dimension(0, 0)。

        PS:在运行时对 Swing 组件执行的更改应通过 SwingUtilities 在 Swing 线程上完成。因此,如果您在运行时为 JTextArea 定义文本,则需要执行以下操作

        Runnable something = new Runnable(() -> {
            component.revalidate();
            component.repaint();
        };
        SwingUtilities.invokeLater(something);
        

        【讨论】:

          猜你喜欢
          • 2017-10-14
          • 2013-09-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-28
          相关资源
          最近更新 更多