【问题标题】:Display empty JScrollpane显示空的 JScrollpane
【发布时间】:2018-05-16 21:28:05
【问题描述】:

我们有一个JScrollpane 和一个带有按钮的JPanel

一开始不会显示任何按钮。

那时我们的 GUI 总是会被销毁。我们怎样才能解决这个问题?

我们希望显示空的JScrollPane

JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridBagLayout());
buttonPanel.setPreferredSize(new Dimension(450, 500));
buttonPanel.setMinimumSize(new Dimension(450, 500));
buttonPanel.setBackground(Color.WHITE);

JScrollPane pane = new JScrollPane();
pane.setSize(new Dimension(450, 500));
pane.setMinimumSize(new Dimension(450, 500));

// GridBagConstraint for button
GridBagConstraints constraint = new GridBagConstraints();
constraint.anchor = GridBagConstraints.WEST;
constraint.fill = GridBagConstraints.HORIZONTAL;
constraint.gridx = 0;
constraint.gridy = GridBagConstraints.RELATIVE;
constraint.weightx = 1.0f;
constraint.weighty = 1.0f;

for (int i = 0; i < countVeranstaltungen; i++) {
    JButton button = new JButton();
    button.setText(events[i].getTitel() + " " + events[i].getTreffpunkt() + " " + events[i].getTermin());
    button.setPreferredSize(new Dimension(40, 100));
    buttonPanel.add(button, constraint);

    Veranstaltungsdetails details = new Veranstaltungsdetails(events[i]);
    button.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            details.setVisible(true);
        }
    });
}

pane.setViewportView(buttonPanel);
this.jPanel3.add(pane);
pane.updateUI();

【问题讨论】:

  • 如果为空,则不需要显示。请张贴您希望在没有创建按钮时显示的图片和正确的minimal reproducible example
  • ScrollPane 不是空的,buttonPanel 是。无法显示空的 JPanel。当没有按钮时,您应该有一个默认图像来显示。
  • 谢谢!!但问题只是在 catch 块末尾缺少一个括号。

标签: java swing jscrollpane


【解决方案1】:

您可能想要覆盖JPanelgetPreferredSize 方法,其中包含由JScrollPane 持有的按钮。这样总有一些东西要显示。

如果您希望始终显示JScrollBars,您需要使用JScrollPanel(Component, int vsbPolicy, int hsbPolicy) 构造函数创建您的JScrollPane,如下面的代码所示。

例如:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class EmptyJScrollPane {
    private JFrame frame;
    private JScrollPane scroll;
    private JPanel pane;
    private JButton addButtons;
    private int number = 0;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new EmptyJScrollPane()::createAndShowGui);
    }

    @SuppressWarnings("serial")
    private void createAndShowGui() {
        frame = new JFrame(getClass().getSimpleName());

        pane = new JPanel() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(200, 200);
            }
        };

        pane.setLayout(new GridLayout(0, 3));
        pane.setBorder(BorderFactory.createLineBorder(Color.RED));

        scroll = new JScrollPane(pane, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        addButtons = new JButton("Add more buttons");
        addButtons.addActionListener(e -> {
            pane.add(new JButton("Button " + number));
            number++;

            pane.revalidate();
            pane.repaint();
        });

        frame.add(scroll);
        frame.add(addButtons, BorderLayout.SOUTH);

        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

旁注:

请注意,上面的代码是MCVE,您在接下来的问题中将需要它。

这是运行上述代码时添加按钮前后的图片:

【讨论】:

  • 谢谢!!但问题只是在 catch 块末尾缺少一个括号。
猜你喜欢
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多