2013-06-03 148 views
0

我目前有一个主JFrame,它包含几个JPanel,每个面板中都有一些文本。创建JPanels的代码是在一个单独的类中(它实现了JPanel)。我如何才能将JScrollPane添加到单个面板?将JScrollPane添加到JPanel?

已经花了一些时间尝试做到这一点,但没有任何反应。 我的JPanel顺便说

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

    } 

使用GridLayout的上述类是另一个面板类,它是一个主面板“MenuHolder”的一个实例变量的一个实例变量。但是,它使用 “MenuHolder” 主JFrame类如下:

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


} 

EXCEPTIONS

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

问题添加的代码,仍然得到一个错误: 异常在线程“AWT-EventQueue的 - 0” java.lang.IllegalArgumentException异常:将容器的父本身 –

+1

哎只是在同时添加你的类不只是一个问题,如果你有任何异常粘贴在问题 – pinkpanther

回答

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

我收到以下错误: 线程“AWT-EventQueue-0”中的异常java.lang.IllegalArgumentException:向其自身添加容器的父项 –

2

JScrollPane的构造的第一个参数是它会显示组件(例如一个JTable ),而不是包含它的那个。通过您的JScrollPane是指显示组件

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

替换holder(在第一行):因此,这两条线使无限循环(排序的)。

+0

嗨,我添加了以下几行代码: 'JLabel data = new JLabel(“这是一些文字“); scrollPaneBar = new JScrollPane(data,JScrollPane.VERTICAL_SCROLLBAR_​​AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_​​AS_NEEDED); \t .add(scrollPaneBar); \t \t 。新增(数据);' 但我只是得到一个微小的规范(这可能是滚动条)旁边的JLabel我这 –

+0

可能会工作,然后。尝试添加一个绝对需要滚动条的组件,比如一个大型的JTable。 – Aeronth