Возможно, вы захотите переопределить 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 , который потребуетсяот вас на ваши следующие вопросы.
Вот до и после добавления изображений кнопок, когда вышеупомянутый код выполняется: