Jscrollpane не для для jpanel внутри jpanel по


Прочитавэтот ответ , я пришел к, используя getPreferredSize вместо setPreferredSize . Но я все еще не могу использовать @Override getPreferredSize, но это не главная проблема, с которой я сейчас сталкиваюсь.

Меня CardLayout приложения, которое вызывает класс с именем HiraganaData

HiraganaData - это класс, который расширяет JPanel, поэтому он может использоваться CardLayout, но он также имеет еще 2 JPanels на нем, один для кнопки" назад " и один для остальных кнопок, перед использованием этой идеи я использовал JTable, но столкнулся с проблемами при создании ячеек в качестве кнопок, поэтому я отказался от этой идеи и пришел с этим новым, используя GridLayout. Некоторые кнопки будут отключены, в любом случае я могу это сделать и не буду включать этот код, поскольку он не имеет отношения к делу.

Таким образом, мой фактический вопрос или проблема таковы:
  • Как я могу добавить a JScrollPane только к buttonsPanel, сделал все возможное попытка добавить его даже ко всей "глобальной" панели без успеха.

Это самое aproximate GUI я могу сделать с тем же кодом моего класса, который я только что добавил в него JFrame.

Не уверен, что это уместно, но я использую CardLayout с разными размерами, как @MadProgrammer предложил на этот ответ.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.*;
import javax.swing.table.TableCellRenderer;
import javax.swing.DefaultCellEditor;
import java.awt.Dimension;

public class HiraganaPage extends JPanel {
    JFrame frame = new JFrame("Hello");
    JButton kanas[][] = new JButton[26][5];
    JButton backButton = new JButton("back");
    JPanel backPanel = new JPanel();
    JPanel buttonsPanel = new JPanel();

    public static void main(String args[]) {
        new HiraganaPage();
    }

    public HiraganaPage() {
        JPanel pane = new JPanel();
        backPanel.add(backButton);
        buttonsPanel.setLayout(new GridLayout(0, 5));
        pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));
        pane.add(backPanel);

        //pane.setPreferredSize(new Dimension(500, 500));

        for (int i = 0; i < 26; i++) {
            for (int j = 0; j < 5; j++) {
                kanas[i][j] = new JButton("1");
                buttonsPanel.add(kanas[i][j]);
            }
        }

        JScrollPane scroll = new JScrollPane(buttonsPanel);
        pane.add(buttonsPanel);
        this.add(pane, BorderLayout.CENTER);
        frame.add(this);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocation(50, 50);
        frame.setSize(300, 300);
    }
}

Вот как это выглядит в моем полном приложении

Введите описание изображения здесь

И вот как это выглядит в MCVE.

Введите описание изображения здесь

1 4

1 ответ:

Основная проблема, с которой вы столкнулись, заключается в том, что вы удаляете buttonsPane из области прокрутки, когда добавляете его в pane...

JScrollPane scroll = new JScrollPane(buttonsPanel);
pane.add(buttonsPanel);
this.add(pane, BorderLayout.CENTER);

И тот факт, что вы никогда не добавляете панель прокрутки ни к чему, тоже не помогает.

Компонент может иметь только одного родителя, поэтому при добавлении buttonsPane к pane он эффективно удаляется из области прокрутки

Вместо этого установите диспетчер компоновки HiraganaPage в BorderLayout, добавьте buttonsPanel в область прокрутки и добавьте прокрутку панель в положение CENTER HiraganaPage затем добавьте pane в положение NORTH HiraganaPage

Кнопки

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestScrollPane {

    public static void main(String[] args) {
        new TestScrollPane();
    }

    public TestScrollPane() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new HiraganaPage());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class HiraganaPage extends JPanel {

        JFrame frame = new JFrame("Hello");
        JButton kanas[][] = new JButton[26][5];
        JButton backButton = new JButton("back");
        JPanel backPanel = new JPanel();
        JPanel buttonsPanel = new JPanel();

        public HiraganaPage() {
            setLayout(new BorderLayout());

            JPanel pane = new JPanel();
            backPanel.add(backButton);
            buttonsPanel.setLayout(new GridLayout(0, 5));
            pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));
            pane.add(backPanel);

//            pane.setPreferredSize(new Dimension(500, 500));

            for (int i = 0; i < 26; i++) {
                for (int j = 0; j < 5; j++) {
                    kanas[i][j] = new JButton("1");
                    buttonsPanel.add(kanas[i][j]);
                }
            }

            add(pane, BorderLayout.NORTH);
            add(new JScrollPane(buttonsPanel));
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(500, 500);
        }
    }

}