【问题标题】:Creating Vertical Scrollable Pane for JPanels为 JPanel 创建垂直可滚动窗格
【发布时间】:2014-08-16 22:00:10
【问题描述】:

我正在尝试制作一个 JScrollPane,其中包含具有来自 JFreeChart API 的图表的 JPanel。 GenerateChartPanel 是一种在 JPanel 中返​​回图表的方法,因此我可以快速制作一堆图表。到目前为止,我主要有这个:

 public static void main (String[] args){ 
    JFrame main = new JFrame();
    main.setLayout(new BorderLayout());
    main.setPreferredSize(new Dimension(500,500));

    //Creates specFrame
    JScrollPane specScrollPane = new JScrollPane();
    JPanel container = new JPanel();
    container.setLayout(new GridLayout());

    container.add(generateSpecPanelFromSmiles("C"));
    container.add(generateSpecPanelFromSmiles("CC"));
    container.add(generateSpecPanelFromSmiles("CCC"));

    container.setVisible(true);
    specScrollPane.setVisible(true);
    specScrollPane.add(container);
    main.add(specScrollPane);

    RefineryUtilities.centerFrameOnScreen(main);
    main.setVisible(true);

当我运行它时,什么也没有出现。显然您不能打包、setCloseOp、setLayout 或居中这些窗格,所以我将它们注释掉。我错过了什么?

编辑:获取尺寸

 specPanel.addComponentListener(new java.awt.event.ComponentAdapter() {
        @Override
        public void componentResized(ComponentEvent event) {
            specPanel.setSize(Math.min(specPanel.getPreferredSize().width, specPanel.getWidth()),
                    Math.min(specPanel.getPreferredSize().height, specPanel.getHeight()));
        }
    });

谢谢

【问题讨论】:

  • 为了尽快获得更好的帮助,请发布MCVE(最小完整且可验证的示例)。

标签: java swing layout jscrollpane


【解决方案1】:

编辑

无论generateSpecPanelFromSmiles 是什么,都必须将PreferredSize 返回到parentPanel,例如(与PreferredSize 一起玩GridLayoutBoxLayout - 接受最小、最大和首选尺寸的框)

.

.

.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class JPanelsInsideJScrollPane {

    private JFrame frame = new JFrame("JPanels Inside JScrollPane");
    private JScrollPane scrollPane = new JScrollPane();
    private JPanel parentPanel, childOne, childTwo, childThree;
    private JButton button = new JButton("Change, Switch Layout Manager to BoxLayout");

    public JPanelsInsideJScrollPane() {
        parentPanel = new JPanel() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(new Dimension(800, 600));
            }

            @Override
            public void paintComponent(Graphics g) {
                int margin = 10;
                Dimension dim = getSize();
                super.paintComponent(g);
                g.setColor(Color.DARK_GRAY);
                g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
            }
        };
        parentPanel.setLayout(new GridLayout(0, 1));
        childOne = new JPanel() {
            @Override
            public Dimension getMinimumSize() {
                return new Dimension(100, 100);
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(200, 300);
            }

            @Override
            public Dimension getMaximumSize() {
                return new Dimension(500, 300);
            }

            @Override
            public void paintComponent(Graphics g) {
                int margin = 10;
                Dimension dim = getSize();
                super.paintComponent(g);
                g.setColor(Color.GREEN);
                g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
            }
        };
        childTwo = new JPanel() {
            @Override
            public Dimension getMinimumSize() {
                return new Dimension(100, 100);
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(400, 300);
            }

            @Override
            public Dimension getMaximumSize() {
                return new Dimension(600, 400);
            }

            @Override
            public void paintComponent(Graphics g) {
                int margin = 10;
                Dimension dim = getSize();
                super.paintComponent(g);
                g.setColor(Color.BLUE);
                g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
            }
        };
        childThree = new JPanel() {
            @Override
            public Dimension getMinimumSize() {
                return new Dimension(100, 100);
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(400, 300);
            }

            @Override
            public Dimension getMaximumSize() {
                return new Dimension(800, 600);
            }

            @Override
            public void paintComponent(Graphics g) {
                int margin = 10;
                Dimension dim = getSize();
                super.paintComponent(g);
                g.setColor(Color.ORANGE);
                g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
            }
        };
        parentPanel.add(childOne);
        parentPanel.add(childTwo);
        parentPanel.add(childThree);
        scrollPane.setViewportView(parentPanel);
        scrollPane.getVerticalScrollBar().setUnitIncrement(30);
        scrollPane.getHorizontalScrollBar().setUnitIncrement(30);
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                LayoutManager manager = parentPanel.getLayout();
                if ((manager != null) && (manager instanceof BoxLayout)) {
                    parentPanel.setLayout(new GridLayout(0, 1));
                    button.setText("Change, Switch Layout Manager to BoxLayout");
                } else if ((manager != null) && (manager instanceof GridLayout)) {
                    parentPanel.setLayout(new BoxLayout(parentPanel, BoxLayout.PAGE_AXIS));
                    button.setText("Change, Switch Layout Manager to GridLayout");
                }
                parentPanel.revalidate();
                parentPanel.repaint();
            }
        });
        frame.add(scrollPane);
        frame.add(button, BorderLayout.SOUTH);
        frame.setSize(400, 300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String args[]) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JPanelsInsideJScrollPane();
            }
        });
    }
}

【讨论】:

  • 我按照你的建议做了,现在我有一个 JPanel(container),我在其中添加了 3 个 JPanel。我将容器 JPanel 添加到了 ScrollPane,但现在我得到了一个什么都没有的小盒子。 (见上文)
  • 取决于(我的第三点)孩子如何将其 PreferredSize 返回到容器(JPanel),您可以设置 PreferredSize to parent JPanel by using getPreferredSize (correct ways)
  • 很确定我实现了你的建议。在创建 specPanel 之后,我添加了上面编辑的代码(SpecPanel 是图表所在的 Jpanel)。你是这个意思吗?
  • not ComponentListener 不是好办法,我会用一些关于的东西来编辑我的帖子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 2019-11-08
  • 2011-01-18
相关资源
最近更新 更多