java - 添加 JPanel 数组时,JScrollPane 不显示滚动条

标签 java swing

我在 JScrollPane 中添加 JPanel 数组。 JPanel 数组正在添加到 JScrollPane,但滚动条不会显示。

public class MyFrame extends JFrame {

    private JPanel contentPane;
    private JPanel panel_1;
    private JScrollPane scrollPane;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MyFrame frame = new MyFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public MyFrame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 288, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        panel_1 = new JPanel();
        panel_1.setBounds(10, 114, 434, 136);
        panel_1.setLayout(null);

        scrollPane = new JScrollPane(panel_1);
        scrollPane.setBounds(52, 57, 164, 126);
        scrollPane.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Histogram", TitledBorder.LEADING, TitledBorder.TOP, null, Color.BLUE));
        scrollPane.setLayout(new ScrollPaneLayout());
        contentPane.add(scrollPane);

        buildBar();
    }

    JPanel[] barPanel;
    private void buildBar(){
        int x=0,y=22,w=100,h=80,s=10,n=3;   
        barPanel = new JPanel[n];
        for(int i=0; i<n; i++){
            barPanel[i] = new JPanel();
            barPanel[i].setBounds(x, y, w, h);
            barPanel[i].setBackground(new Color(255,0,0));
            panel_1.add(barPanel[i]);
            panel_1.revalidate();
            panel_1.repaint();
            x = x + w + s;
        }
    }
}

我已经为此工作了几个小时。也许我错过了一些东西。

最佳答案

你用这两句话搬起石头砸自己的脚:

    panel_1.setBounds(10, 114, 434, 136);
    panel_1.setLayout(null);

这两者都会扰乱 JScrollPane 使用和显示滚动条的能力。您需要做的是:不要使用 setBounds,而是让组件使用其首选大小,并避免使用空布局,因为这不会更改容器的首选大小。

这是刻意避免空布局的另一个原因。

例如,

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import javax.swing.*;

public class MyPanel2 extends JPanel {
    private static final int PREF_W = 388;
    private static final int PREF_H = PREF_W;
    public static final int INNER_PREF_W = 434;
    public static final int INNER_PREF_H = 126;
    private static final int HISTO_PANEL_COUNT = 6;
    private static final Dimension VP_SZ = new Dimension(164, 126);
    private JPanel holderPanel = new JPanel(new GridLayout(0, 1));

    public MyPanel2() {
        int w = INNER_PREF_W;
        int h = INNER_PREF_H;
        for (int i = 0; i < HISTO_PANEL_COUNT; i++) {
            holderPanel.add(new InnerPanel(w, h));
        }

        JScrollPane scrollPane = new JScrollPane(holderPanel);
        scrollPane.getViewport().setPreferredSize(VP_SZ);

        setLayout(new GridBagLayout());
        add(scrollPane);
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }

    private class InnerPanel extends JPanel {
        private int w;
        private int h;

        public InnerPanel(int w, int h) {
            this.w = w;
            this.h = h;
            setBorder(BorderFactory.createLineBorder(Color.BLUE));
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            int x = 0, y = 22, w = 100, h = 80, s = 10, n = 3;
            g.setColor(Color.RED);
            for (int i = 0; i < n; i++) {
                g.fillRect(x, y, w, h);
                x = x + w + s;
            }
        }

        @Override
        public Dimension getPreferredSize() {
            if (isPreferredSizeSet()) {
                return super.getPreferredSize();
            }
            return new Dimension(w, h);
        }
    }

    private static void createAndShowGui() {
        MyPanel2 mainPanel = new MyPanel2();

        JFrame frame = new JFrame("MyPanel2");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            createAndShowGui();
        });
    }
}

关于java - 添加 JPanel 数组时,JScrollPane 不显示滚动条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35818305/

相关文章:

java - JFrame:如何添加一个向框架添加新文本字段的按钮?

java - 使用 Spring Security 保护 Spring Cloud 功能

java - 如果作为类添加,JPanel 不会显示在 JFrame 上

java - 该服务器不支持项目构面动态 Web 模块 4.0

java - 如何从 ssh 输出中删除颜色等

java - 如何从 .xml 配置文件 (JSF) 引用 Java .properties 文件?

Java 小程序多次显示自身

java - 有没有办法重写 MenuItemActionPerformed 中的 PaintComponent 方法?

java - 如何让 JTextField 响应回车键

java - JComboBox 箭头按钮的工具提示位置