java - 如何将 JPanel 添加到 JScrollPane?

标签 java swing jframe jpanel jscrollpane

我正在使用 Java 实现一个简单的聊天应用程序。我希望我的聊天应用程序具有像现代消息应用程序一样的“气泡”消息样式,因此我构建了 2 个类 LeftArrowBubbleRightArrowBubble ,它们扩展了 JPanel 以说明发送者和接收者气泡,像这样:

enter image description here

这是我的 LeftArrowBubble 类的代码(与 RightArrowBubble 非常相似):

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.RenderingHints;
import java.awt.geom.Area;
import java.awt.geom.RoundRectangle2D;
import javax.swing.JPanel;
/**
 * @author harsh
 */
public class LeftArrowBubble extends JPanel {
   private static final long serialVersionUID = -5389178141802153305L;
   private int radius = 10;
   private int arrowSize = 12;
   private int strokeThickness = 3;
   private int padding = strokeThickness / 2;
   @Override
   protected void paintComponent(final Graphics g) {
      final Graphics2D g2d = (Graphics2D) g;
      g2d.setColor(new Color(0.5f, 0.8f, 1f));
      int x = padding + strokeThickness + arrowSize;
      int width = getWidth() - arrowSize - (strokeThickness * 2);
      int bottomLineY = getHeight() - strokeThickness;
      g2d.fillRect(x, padding, width, bottomLineY);
      g2d.setRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON));
      g2d.setStroke(new BasicStroke(strokeThickness));
      RoundRectangle2D.Double rect = new RoundRectangle2D.Double(x, padding, width, bottomLineY, radius, radius);
      Polygon arrow = new Polygon();
      arrow.addPoint(20, 8);
      arrow.addPoint(0, 10);
      arrow.addPoint(20, 12);
      Area area = new Area(rect);
      area.add(new Area(arrow));
      g2d.draw(area);
   }
}

现在我有一个 JFrame 窗口,上面有一个 JScrollPane,如下所示:

enter image description here

我现在想做的是,当我单击该 CreateNewBubble 按钮时,将创建一个新的 Left(or Right)ArrowBubble JPanel 并显示在该 中>JScrollPane (如果里面有更多气泡,这个 JScrollPane 将是垂直滚动的)。我已经尝试过这种方法:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    BubbleTest.LeftArrowBubble leftArrowBubble = new BubbleTest.LeftArrowBubble();
    jScrollPane1.add(leftArrowBubble);
}

但它没有按我的预期工作:单击按钮后,JScrollPane 中没有显示任何内容! 我已经被这个问题困扰了几个小时,如果你们能提供帮助,我真的很感激!

最佳答案

您不能在 JScrollPane 上以这种方式使用 .add。 JScrollPane 只能滚动单个组件,该组件通过将其传递给其构造函数或调用 .setViewportView 来设置。

相反,为气泡创建一个单独的容器,例如垂直的 Box,并将其设置为由滚动 Pane 滚动的单个组件:

Box box = new Box(BoxLayout.Y_AXIS);
JScrollPane jScrollPane1 = new JScrollPane(box);

添加气泡后,将其添加到框中(并调用 .revalidate() 对其进行布局):

box.add(leftArrowBubble);
box.revalidate();
<小时/>

编辑:此外,默认情况下,您的气泡不会有任何大小,除非您通过调用 setPreferredSize 或覆盖 getPreferredSize 或通过将组件放入其中。

关于java - 如何将 JPanel 添加到 JScrollPane?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26574496/

相关文章:

java - 在Eclipse中,是否可以默认设置注释处理和工厂路径?

java - 从列表创建 JsonArray

java - JButtons、ActionListener 和 JOptionPane

java - 如何使用 MYSQL 在 JSwing 中创建并注册和登录表单

java - 更新 JFrame 窗口

java - 使用反射调用方法并返回 map

Java Regex - 使用别名更改路径

java - 如何自定义 JPanel 在 Jpanel 中的位置

java - 如何在屏幕右侧设置 jFrame 位置?

java - 无法在 JPanel 中添加操作监听器