Я искал способ добавить вертикальную полосу прокрутки к JPanel
которая, в свою очередь, добавляется на панель CardLayout
. Я просмотрел все сообщения, которые были связаны с внедрением прокручиваемого JPanel
но я не мог понять, как реализовать его с помощью этого конкретного CardLayout
. Oracle не дает примера, который я мог бы использовать.
Возможно, я не использую правильную конфигурацию для JWindow
или любого другого компонента, использующего Im.
Я разместил ниже усеченную версию моей программы, для которой я хотел бы использовать вертикальную полосу прокрутки.
Мой вопрос заключается в том, как реализовать класс JPanelScrollable
в нижней части кода, чтобы он мог прокручиваться?
import javax.swing.*;
import java.awt.*;
import java.net.URL ;
public class Program2 extends JFrame
{
public Program2()
{
super("Flash CC");
Container2 container = new Container2();
setSize(700, 800);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setFocusable( true ) ;
add(container);
setVisible(true) ;
}
public static void main(String[] args)
{
Program2 prog = new Program2();
}
}
class Container2 extends JPanel
{
private CardLayout cardLayout = new CardLayout() ;
private JPanel1 jPanelFirst = new JPanel1() ;
private JPanel2 jPanelSecond = new JPanel2() ;
private JPanelScrollable jPanelThird = new JPanelScrollable() ;
//Constructor
Container2()
{
this.setLayout( cardLayout ) ;
this.setFocusable( true ) ;
JScrollPane scrollFrame = new JScrollPane(jPanelThird);
this.add( jPanelFirst, "first card" ) ;
this.add( jPanelSecond, "second card" ) ;
this.add( scrollFrame , "third card" ) ;
cardLayout.show( this, "third card" ) ;
}
}
class JPanel1 extends JPanel
{
}
class JPanel2 extends JPanel
{
}
class JPanelScrollable extends JPanel
{
// here many, many, many elemnts will go
// and a vertical scroll barr is needed to view'm all.
JPanelScrollable()
{
this.setOpaque( true ) ;
this.setLayout( null ) ;
for(int i=0; i<30; i++)
{
JButton b = new JButton("Button" + i) ;
b.setBounds(0, (i * 100), 100, 50) ;
this.add(b) ;
}
}
}
Добавить панель в JScrollPane
JScrollPane scrollPane = new JScrollPane(jPanelThird);
Добавьте панель прокрутки в CardLayout
this.add(scrollPane, "third card");
Подробнее о том, как использовать панели прокрутки для получения более подробной информации
Обновлено рабочим примером
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestCardLayout {
public static void main(String[] args) {
new TestCardLayout();
}
private int index = 0;
public TestCardLayout() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
final CardLayout cl = new CardLayout();
final JPanel cardPane = new JPanel(cl);
cardPane.add(new JLabel("Hello"), "1");
cardPane.add(new JScrollPane(createForm()), "2");
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(cardPane);
frame.setSize(200, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
JButton next = new JButton("Next");
next.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
index++;
if (index > 1) {
index = 0;
}
if (index == 0) {
cl.show(cardPane, "1");
} else {
cl.show(cardPane, "2");
}
}
});
frame.add(next, BorderLayout.SOUTH);
}
});
}
public JPanel createForm() {
JPanel form = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
for (int index = 0; index < 100; index++) {
form.add(new JTextField(10), gbc);
}
return form;
}
}
Метод Container.add(...)
принимает любой компонент. CardLayout не ограничивается панелями.
Добавьте панель в панель JScrollPane и добавьте панель прокрутки в макет карты.
I have also implemented some buttons in case you'd like to run it
- не используйте нулевой макет. Полосы прокрутки появятся только тогда, когда предпочтительный размер компонента, добавляемого в область прокрутки, больше, чем размер области прокрутки. При использовании нулевого макета предпочтительный размер панели равен 0.
Если вы используете eclipse, подумайте об использовании WindowBuilder. Он бесплатный и позволяет вам делать то, что вам нужно, перетаскивая и изменяя некоторые свойства.