java - 将 JScrollPane 添加到 JPanel?

标签 java swing jpanel jscrollpane grid-layout

我目前有一个主 JFrame,其中包含几个 JPanel,每个面板中都有一些文本。创建 JPanel 的代码位于一个单独的类中(它“实现”JPanel)。如何仅将 JScrollPane 添加到各个面板?

现在已经花了一些时间尝试执行此操作,但没有任何反应。 顺便说一句,我的 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”的实例变量。但使用“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);
    }


}

异常(exception)

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)

最佳答案

JScrollPane 构造函数中的第一个参数是它将显示的组件(例如 JTable),而不是包含它的组件。因此,这两行形成了一个无限循环(某种程度上):

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

holder(第一行中)替换为 JScrollPane 要显示的组件。

关于java - 将 JScrollPane 添加到 JPanel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16896088/

相关文章:

java - 递增数字

java - 无法弄清楚如何在java中重叠图像

java - 在 JPanel 的一部分中绘制而不重新绘制其余部分

java - 不删除文件的现有内容

java - android 互联网连接可用性

java - Struts 升级后 Struts Action Context 发生变化

java - 了解 Java GUI 开发、管理和设置 JComponents

java - Berkeley DB(Java 版)在应用程序运行之间不持久

java - 如何选择表中最后插入的行?

java.sql.SQLException : Column Index out of range, 2 > 1