【问题标题】:Adding a JScrollPane removes all the components inside JPanel添加 JScrollPane 会删除 JPanel 中的所有组件
【发布时间】:2017-06-25 07:26:31
【问题描述】:

当我将 JScrollPane 添加到 JPanel 时,JPanel 内的所有按钮都消失了,它变成了空的。我正在关注这篇帖子 here 以及其他类似的帖子。

这是没有 JScrollPane 的代码:

    JPanel panel = new JPanel();
    panel.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
    panel.setBounds(5, 5, 286, 573);
    contentPane.add(panel);
    panel.setLayout(null);

    JPanel panel_1 = new JPanel();
    panel_1.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
    panel_1.setBounds(12, 53, 262, 484);
    panel.add(panel_1);
    panel_1.setLayout(null);

    //this panel is the one the scrollPane is being added to and contains the buttons
    JPanel panel_2 = new JPanel();
    panel_2.setBounds(12, 68, 238, 403);
    panel_2.setLayout(new BoxLayout(panel_2, BoxLayout.Y_AXIS));

    for(int i = 0; i < 50; i++) {
        JButton bttn = new JButton("TEST");
        panel_2.add(bttn);
        panel_2.revalidate();

    }
    panel_1.add(panel_2);

这给出了:

还有带JScrollPane的代码,最后一行换成这样:

JScrollPane scrollPane = new JScrollPane(panel_2);
panel_1.add(scrollPane);
//panel_1.add(panel_2);

但是,所有按钮都消失了:

编辑:这是完整的代码:

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.SpringLayout;
import javax.swing.border.BevelBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.EtchedBorder;


public class Test extends JFrame {


    private JPanel contentPane;

    public static void main(String[] args) {
        Test frame = new Test();
        frame.setVisible(true);
    }


    /**
     * Create the frame.
     */
    public Test() {
        setTitle("Test Program");
        setResizable(false);
        setBackground(Color.WHITE);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 871, 630);

        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        SpringLayout sl_contentPane = new SpringLayout();
        contentPane.setLayout(sl_contentPane);

        JPanel panel = new JPanel();
        sl_contentPane.putConstraint(SpringLayout.NORTH, panel, 5, SpringLayout.NORTH, contentPane);
        sl_contentPane.putConstraint(SpringLayout.WEST, panel, 5, SpringLayout.WEST, contentPane);
        sl_contentPane.putConstraint(SpringLayout.SOUTH, panel, 578, SpringLayout.NORTH, contentPane);
        sl_contentPane.putConstraint(SpringLayout.EAST, panel, 291, SpringLayout.WEST, contentPane);
        panel.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
        contentPane.add(panel);
        SpringLayout sl_panel = new SpringLayout();
        panel.setLayout(sl_panel);

        JPanel panel_1 = new JPanel();
        sl_panel.putConstraint(SpringLayout.NORTH, panel_1, 53, SpringLayout.NORTH, panel);
        sl_panel.putConstraint(SpringLayout.WEST, panel_1, 12, SpringLayout.WEST, panel);
        sl_panel.putConstraint(SpringLayout.SOUTH, panel_1, 537, SpringLayout.NORTH, panel);
        sl_panel.putConstraint(SpringLayout.EAST, panel_1, 274, SpringLayout.WEST, panel);
        panel_1.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
        panel.add(panel_1);
        SpringLayout sl_panel_1 = new SpringLayout();
        panel_1.setLayout(sl_panel_1);

        JSeparator separator = new JSeparator();
        sl_panel_1.putConstraint(SpringLayout.NORTH, separator, 54, SpringLayout.NORTH, panel_1);
        sl_panel_1.putConstraint(SpringLayout.WEST, separator, 12, SpringLayout.WEST, panel_1);
        sl_panel_1.putConstraint(SpringLayout.SOUTH, separator, 69, SpringLayout.NORTH, panel_1);
        sl_panel_1.putConstraint(SpringLayout.EAST, separator, 250, SpringLayout.WEST, panel_1);
        panel_1.add(separator);

        JLabel lblNewLabel = new JLabel("Results:");
        sl_panel_1.putConstraint(SpringLayout.NORTH, lblNewLabel, 13, SpringLayout.NORTH, panel_1);
        sl_panel_1.putConstraint(SpringLayout.WEST, lblNewLabel, 12, SpringLayout.WEST, panel_1);
        sl_panel_1.putConstraint(SpringLayout.SOUTH, lblNewLabel, 55, SpringLayout.NORTH, panel_1);
        sl_panel_1.putConstraint(SpringLayout.EAST, lblNewLabel, 115, SpringLayout.WEST, panel_1);
        lblNewLabel.setFont(new Font("Tahoma", Font.BOLD, 21));
        panel_1.add(lblNewLabel);

        JPanel panel_2 = new JPanel();
        panel_2.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
        sl_panel_1.putConstraint(SpringLayout.NORTH, panel_2, -2, SpringLayout.SOUTH, separator);
        sl_panel_1.putConstraint(SpringLayout.WEST, panel_2, 2, SpringLayout.WEST, lblNewLabel);
        sl_panel_1.putConstraint(SpringLayout.SOUTH, panel_2, 398, SpringLayout.SOUTH, separator);
        sl_panel_1.putConstraint(SpringLayout.EAST, panel_2, 0, SpringLayout.EAST, separator);
        panel_2.setLayout(new BoxLayout(panel_2, BoxLayout.Y_AXIS));
        for(int i = 0; i < 50; i++) {
            JButton bttn = new JButton("TEST");
            panel_2.add(bttn);
        }   

        JScrollPane scrollPane = new JScrollPane(panel_2);
        sl_panel_1.putConstraint(SpringLayout.NORTH, scrollPane, 0, SpringLayout.NORTH, panel_1);
        sl_panel_1.putConstraint(SpringLayout.WEST, scrollPane, 0, SpringLayout.WEST, panel_1);
        sl_panel_1.putConstraint(SpringLayout.SOUTH, scrollPane, 0, SpringLayout.NORTH, panel_1);
        sl_panel_1.putConstraint(SpringLayout.EAST, scrollPane, 0, SpringLayout.WEST, panel_1);
        panel_1.add(scrollPane);

        //panel_1.add(panel_2); if this is used instead of the above 6 lines of scrollPane, then the buttons appear

    }
}

这是整个应用程序的图像;带有“测试”按钮的结果选项卡下方的面板是滚动窗格的位置:

任何帮助将不胜感激!

【问题讨论】:

  • 请编辑您的问题以包含minimal reproducible example,说明您想要解决的问题没有 null 布局。
  • panel.setLayout(null); 空布局和滚动窗格不能一起使用。更一般地,Java GUI 必须在不同的语言环境中使用不同的 PLAF 在不同的操作系统、屏幕尺寸、屏幕分辨率等上工作。因此,它们不利于像素完美布局。而是使用布局管理器,或combinations of them 以及white space 的布局填充和边框。 - 按照@trashgod 的建议发布 MCVE,以获得进一步的建议。
  • 那么,如果 panel2 有一个布局管理器,但如果它在 panel1 中没有布局管理器,那么滚动窗格将无法与 panel2 一起使用?如果是这样的话,我想这就是我的问题的答案。
  • 更新了问题,因此 SpringLayout 被用于 contentPane 和所有面板。问题仍然存在。删除 scrollPane 代码并用 panel_1.add(panel_2) 替换它仍然给我按钮。

标签: java swing jscrollpane null-layout-manager


【解决方案1】:

你的约束有点奇怪:

    sl_panel_1.putConstraint(SpringLayout.NORTH, scrollPane, 0, SpringLayout.NORTH, panel_1);
    sl_panel_1.putConstraint(SpringLayout.WEST, scrollPane, 0, SpringLayout.WEST, panel_1);
    sl_panel_1.putConstraint(SpringLayout.SOUTH, scrollPane, 0, SpringLayout.NORTH, panel_1);
    sl_panel_1.putConstraint(SpringLayout.EAST, scrollPane, 0, SpringLayout.WEST, panel_1);

更改为,例如:

    sl_panel_1.putConstraint(SpringLayout.NORTH, scrollPane, 0, SpringLayout.SOUTH, separator);
    sl_panel_1.putConstraint(SpringLayout.WEST, scrollPane, 0, SpringLayout.WEST, panel_1);
    sl_panel_1.putConstraint(SpringLayout.SOUTH, scrollPane, 0, SpringLayout.SOUTH, panel_1);
    sl_panel_1.putConstraint(SpringLayout.EAST, scrollPane, 0, SpringLayout.EAST, panel_1);

并且不要将panel_2 的约束添加到sl_panel_1

如果您添加了具有这些约束且没有滚动窗格的 panel_2,它也不会显示

【讨论】:

  • 我想这里要吸取的教训是不要相信自动 GUI 构建器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多