Прокручиваемая JPanel в CardLayout?

1

Я искал способ добавить вертикальную полосу прокрутки к 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) ;
        }

    }
}
Теги:
user-interface
layout
swing
cardlayout

3 ответа

2
Лучший ответ

Добавить панель в JScrollPane

JScrollPane scrollPane = new JScrollPane(jPanelThird);

Добавьте панель прокрутки в CardLayout

this.add(scrollPane, "third card");

Подробнее о том, как использовать панели прокрутки для получения более подробной информации

Обновлено рабочим примером

Изображение 174551Изображение 174551

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;
    }
}
  • 0
    Спасибо, я пробую эту опцию, также я видел эту ссылку раньше, но безрезультатно.
  • 0
    это не похоже на работу.
Показать ещё 8 комментариев
2

Метод Container.add(...) принимает любой компонент. CardLayout не ограничивается панелями.

Добавьте панель в панель JScrollPane и добавьте панель прокрутки в макет карты.

  • 0
    Я попробую это прямо сейчас, спасибо
  • 0
    @twimB, I have also implemented some buttons in case you'd like to run it - не используйте нулевой макет. Полосы прокрутки появятся только тогда, когда предпочтительный размер компонента, добавляемого в область прокрутки, больше, чем размер области прокрутки. При использовании нулевого макета предпочтительный размер панели равен 0.
0

Если вы используете eclipse, подумайте об использовании WindowBuilder. Он бесплатный и позволяет вам делать то, что вам нужно, перетаскивая и изменяя некоторые свойства.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню