gpt4 book ai didi

java - 如何将 JPanel 添加到 JScrollPane?

转载 作者:行者123 更新时间:2023-12-01 17:03:20 31 4
gpt4 key购买 nike

我正在使用 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com