Показать пустой JScrollpane - PullRequest
0 голосов
/ 17 мая 2018

У нас есть 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();

1 Ответ

0 голосов
/ 17 мая 2018

Возможно, вы захотите переопределить getPreferredSize метод JPanel, содержащий кнопки, удерживаемые JScrollPane.Таким образом, всегда есть что отображать.

Если вы хотите, чтобы всегда отображались JScrollBar, вам нужно создать свой JScrollPane, используя конструктор JScrollPanel(Component, int vsbPolicy, int hsbPolicy), как показанов приведенном ниже коде.

Например:

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 , который потребуетсяот вас на ваши следующие вопросы.

Вот до и после добавления изображений кнопок, когда вышеупомянутый код выполняется:

enter image description here enter image description here

...