2013-06-03 5 views
0

В настоящее время у меня есть основной JFrame, который содержит несколько JPanels с некоторым текстом в каждой панели. Код для создания JPanels находится в отдельном классе (который «реализует» JPanel). Как добавить JScrollPane только к отдельным панелям?Добавление JScrollPane в JPanel?

Прошли некоторое время, пытаясь сделать это сейчас, но ничего не происходит. Мой JPanel использует GridLayout кстати

public class HoldingPanel extends JPanel { 

private String code, title, fee, loanPeriod; 
private LMSGUI view; 
private LMSModel model; 
private JPanel holder;       //holds holding info with scrollPane 

private JScrollPane scrollPaneBar; 


    public HoldingPanel(LMSModel m, LMSGUI g, 
         int code, String title, int fee, int loanPeriod, String type) 
    { 
     this.view = view; 
     this.code = Integer.toString(code); 
     this.title = title; 
     this.fee = Integer.toString(fee); 
     this.loanPeriod = Integer.toString(loanPeriod); 
     this.holder = new JPanel(); 

     scrollPaneBar = new JScrollPane(holder, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);  
     holder.add(scrollPaneBar); 
     this.add(holder); 

     if(type.equals("Video"))                //set panel border to red if video 
      this.setBorder(BorderFactory.createMatteBorder(5, 5, 5, 5, Color.red)); 

     if(type.equals("Book"))                //set panel border to blue if book 
      this.setBorder(BorderFactory.createMatteBorder(5, 5, 5, 5, Color.blue)); 

     view = g; 
     holder.setLayout(new GridLayout(4,1)); 
     holder.add(new JLabel(this.code)); 
     holder.add(new JLabel(this.title)); 
     holder.add(new JLabel(this.fee)); 
     holder.add(new JLabel(this.loanPeriod)); 


     holder.addMouseListener(view.getDeleteHoldingListener()); 
     holder.setBackground(Color.GRAY); 

    } 

Приведенный выше класс является переменной экземпляра другого класса панели, которая является переменной экземпляра из главной панели «MenuHolder». Но главный класс JFrame, который использует "MenuHolder" выглядит следующим образом:

package lms.view; 

import javax.swing.*; 

import java.awt.*; 


import lms.controller.DeleteHoldingListener; 
import lms.controller.WindowCloseListener; 
import lms.model.Holding; 
import lms.model.facade.*; 


public class LMSGUI extends JFrame 
{ 
    LMSModel model; 
    private MenuHolder menuHolder;          //holds panel container for JMenu and JButton options (NORTH) 
    private StatusHolder statusHolder;         //status bar panel(SOUTH) 

    private HoldingGrid holdingGridHolder;       //displays grid of available holdings 

    private AddCollectionWindow addCollectionWindow; 
    private AddHoldingWindow addHoldingWindow;        //adds books/video depending on paramaters received 
    private AboutWindow aboutWindow; 

    private DeleteHoldingListener deleteHoldingListener; 

    public LMSGUI(LMSModel model) 
    { 
     this.model=model; 
     deleteHoldingListener = new DeleteHoldingListener(model, this); 

     Container cp = this.getContentPane(); 
     cp.setLayout(new BorderLayout(3,5)); 

     JPanel controlPanel = new JPanel(); 
     controlPanel.setLayout(new GridLayout(0,1,2,2)); 

     //Menu Holder/--------------------------------------------------------------------------------------/ 
     menuHolder = new MenuHolder(model, this); 
     cp.add(menuHolder, BorderLayout.NORTH); 

     //holding display grid/--------------------------------------------------------------------------------------/ 
     holdingGridHolder = new HoldingGrid(model, this); 
    // holdingGridHolder.updateGrid(model.getAllHoldings()); 
     cp.add(holdingGridHolder, BorderLayout.CENTER); 

     //Status bar Holder/--------------------------------------------------------------------------------------/ 
     statusHolder = new StatusHolder(model, this); 
     cp.add(statusHolder, BorderLayout.SOUTH); 


     this.setSize(800,550); 
     this.setLocation(300,200); 
     this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); 
     this.addWindowListener(new WindowCloseListener(model, this));          //show confirmation dialogue 



    } 


    public void initializeAddHoldingWindow(String type) 
    { 
     addHoldingWindow = new AddHoldingWindow(type,model,this); 
     addHoldingWindow.setVisible(true); 
    } 

    public void initializeAddCollectionWindow() { 
     addCollectionWindow = new AddCollectionWindow(model, this); 
     addCollectionWindow.setVisible(true); 

    } 

    public void initializeAboutWindow() { 
     aboutWindow = new AboutWindow(); 
     aboutWindow.setVisible(true); 

    } 

    public AddHoldingWindow getAddHoldingWindowDetails(){ 
     return addHoldingWindow; 
    } 

    public AddCollectionWindow getAddCollectionWindowDetails(){ 
     return addCollectionWindow; 
    } 

    public void updateHoldingGrid(Holding[] holdings){ 
     holdingGridHolder.updateGrid(holdings); 
    } 

    public void resetHoldingGrid(){ 
     holdingGridHolder.resetGrid(); 
    } 

    public DeleteHoldingListener getDeleteHoldingListener(){ 
     return deleteHoldingListener; 
    } 

    public void updateSatusBar(Holding[] holdings){ 
     statusHolder.updateStatusBar(holdings); 
    } 


} 

ИСКЛЮЧЕНИЕ

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: adding container's parent to itself 
    at java.awt.Container.checkAddToSelf(Unknown Source) 
    at java.awt.Container.addImpl(Unknown Source) 
    at java.awt.Container.add(Unknown Source) 
    at lms.view.HoldingPanel.<init>(HoldingPanel.java:38) 
    at lms.view.HoldingGrid.updateGrid(HoldingGrid.java:80) 
    at lms.view.LMSGUI.updateHoldingGrid(LMSGUI.java:90) 
    at lms.controller.AddBookListener.actionPerformed(AddBookListener.java:63) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 
    at java.awt.Component.processEvent(Unknown Source) 
    at java.awt.Container.processEvent(Unknown Source) 
    at java.awt.Component.dispatchEventImpl(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Window.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$200(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
+3

обновления вопрос с кодом – pinkpanther

+0

добавил код, по-прежнему получает сообщение об ошибке: исключения в потоке «АВТ-EventQueue-0» java.lang.IllegalArgumentException: добавление родительского контейнера к себе –

+1

эй просто добавить оба ваши классы в вопрос не только один, и если вы получите какие-либо исключения, вставьте трассировку стека в вопрос – pinkpanther

ответ

0
JScrollPane scroll = new JScrollPane(panelInstance); 
frame.add(scroll); 
+0

я получаю следующее сообщение об ошибке: исключение в потоке «АВТ-EventQueue-0» java.lang.IllegalArgumentException: добавление родительского контейнера к себе –

2

Первый параметр в JScrollPane «s конструктора компонент будет отображаться (например, JTable), а не тот, который содержит его. Таким образом, эти две линии делают бесконечный цикл (вид):

scrollPaneBar = new JScrollPane(holder, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);  
    holder.add(scrollPaneBar); 

Replace holder (в первой строке) компонентом вашего JScrollPane предназначается для отображения.

+0

привет, я добавил следующие строки кода: 'данные JLabel = новый JLabel (» Это текст »); scrollPaneBar = новый JScrollPane (данные, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); \t .add (scrollPaneBar); \t \t .add (данные); ' , но я просто получить крошечные спецификации (которые могут быть полосы прокрутки) рядом с моим JLabel –

+0

Это может работать тогда. Попытайтесь добавить компонент, который будет абсолютно необходим вместо прокрутки, например большой JTable. – Aeronth

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