2014-10-26 3 views
0

Я реализую простое приложение чата, используя Java. Я хочу, чтобы мое приложение чата, чтобы иметь «пузырь» стиль сообщения, как современные приложения сообщений, так что я построил 2 классов LeftArrowBubble и RightArrowBubble, которые проходят 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); 
    } 
} 

Теперь у меня есть окно 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 после нажатия на кнопку! Я застрял в этой проблеме часами, очень ценю, если вы, ребята, можете помочь!

+0

Просьба попытаться опубликовать основной код приложения, чтобы мы могли вам помочь –

ответ

3

Вы не можете использовать .add таким образом на JScrollPane. JScrollPane может прокручивать только один компонент, который устанавливается либо передачей его его конструктору, либо путем вызова .setViewportView.

Вместо этого можно создать отдельный контейнер для пузырьков, такие как вертикальная коробка, и установить, что в качестве отдельного компонента прокручивать панели прокрутки:

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

При добавлении пузыря, добавьте его в коробка (и называют .revalidate() уложить его):

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

Edit: Кроме того, ваши пузырьки не будут, по умолчанию, иметь любой размер, если не дать им такой размер, как по телефону setPreferredSize или путем переопределения getPreferredSize или путем помещения компонентов внутри них.

+0

Спасибо большое! Я только что редактировал свой код, как то, что вы предложили, но пока ничего не изменилось :(Можете ли вы взглянуть на мой код, пожалуйста: http://tny.cz/24666822 – sonlexqt

+1

@ rainman_TS7 Ваша JScrollPane создана сгенерированным кодом , поэтому используйте это вместо того, чтобы создавать вторую JScrollPane. Поэтому вызовите 'jScrollPane1.setViewportView (box);'. Вам нужно сделать это * после *, создавая компонент окна, в противном случае полевая переменная все равно равна нулю.Также вы вызываете 'setPreferredSize' неправильно; назовите его на пузырь, а не на JFrame. – Boann

+0

Извините, я только что обновил свой код так же, как то, что вы сказали, но опять же, похоже, что он не работает ... Я нажимаю кнопку, и в jScroolPane1 ничего не отображается :(Это мой новый код: http://tny.cz/b50bbf5d – sonlexqt

2

С JScrollPane вы всегда должны добавлять компоненты в JViewPort панели прокрутки. Посмотрите на документацию here, она довольно хорошо объясняет концепцию класса.

Краткое описание: JScrollPane содержит полосы прокрутки и порт представления. Порт представления представляет собой компонент, который отображает только часть своего содержимого - в этом случае часть, которая видна на экране. Полосы прокрутки сообщают портам просмотра, какая часть должна отображаться.

Смежные вопросы