2014-10-26 85 views
0

我正在使用Java实现一个简单的聊天应用程序。我希望我的聊天应用程序,有一个像现代信息应用的“泡沫”消息的风格,所以我已经建立了2类LeftArrowBubbleRightArrowBubble其扩展JPanel来说明发送&接收机气泡,就像这样:如何将JPanels添加到JScrollPane?

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); 
    } 
} 

现在我有上有一个JScrollPane一个JFrame窗口,它看起来像这样:

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显示出来! 我一直坚持这个问题几个小时,真的很感激,如果你们可以帮忙!

+0

请尝试发布主应用程序代码,以使我们能够协助您 – 2014-10-26 15:22:23

回答

3

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

相反,创建用于气泡,诸如垂直Box中的单独的容器中,并设置为单个部件通过滚动窗格滚动:

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

在添加泡沫,将其添加到箱(并调用.revalidate()打下出来):

box.add(leftArrowBubble); 
box.revalidate(); 

编辑:另外,你的气泡不会在默认情况下,具有任意大小,除非你给他们一个大小如通过调用setPreferredSize或覆盖getPreferredSize或将组件放入其中。

+0

非常感谢!我刚刚编辑了我的代码,就像你的建议,但似乎没有改变:(你可以看看我的代码请:http://tny.cz/24666822 – sonlexqt 2014-10-26 15:40:56

+1

@ rainman_TS7你的JScrollPane是由生成的代码创建的,所以使用它而不是创建第二个JScrollPane,所以调用'jScrollPane1.setViewportView(box);'。*创建box组件后需要这样做,否则box变量仍然为null。你也调用错误的'setPreferredSize';在泡泡上调用它,而不是JFrame。 – Boann 2014-10-26 15:47:37

+0

对不起,我刚刚更新了我的代码,就像你说的一样,但是再一次,它似乎并没有工作......我按下按钮,没有出现在jScroolPane1内部的东西:(这是我的新代码: http://tny.cz/b50bbf5d – sonlexqt 2014-10-26 16:02:13

2

使用JScrollPane,您应该始终将组件添加到滚动窗格的JViewPort。看看文档here,它很好地解释了课堂背后的概念。

简短摘要:JScrollPane包含滚动条和视图端口。视图端口是一个仅显示其内容的一部分的组件 - 在这种情况下,该部件在屏幕上可见。滚动条告诉查看端口要显示的部分。