- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Java 实现一个简单的聊天应用程序。我希望我的聊天应用程序具有像现代消息应用程序一样的“气泡”消息样式,因此我构建了 2 个类 LeftArrowBubble
和 RightArrowBubble
,它们扩展了 JPanel 以说明发送者和接收者气泡,像这样:
这是我的 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
,如下所示:
我现在想做的是,当我单击该 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/
我是一名优秀的程序员,十分优秀!