Отображение неизвестного количества JButtons в JPanel с фиксированным размером - PullRequest
1 голос
/ 03 июля 2019

Итак, я играю в маленькую игру Uno, и Swing, похоже, пинает меня в зад. Проблема, которую я получаю, состоит в том, когда игрок видит и выбирает, какую из своих карт отложить. У меня есть заданная панель с фиксированным размером и динамическое количество карт (JButtons с ImageIcons). В настоящее время я использую FlowLayout, чтобы эти карты выглядели красиво, но если их слишком много, они начинают исчезать внизу.

Изящное решение, которое я хотел написать, состоит в том, чтобы иметь одну строку со всеми картами и просто рассчитать расстояние между картами в зависимости от количества, чтобы они равномерно распределялись в Panel. Если есть много карт, они будут перекрываться, и это может быть решено чисто с помощью JLayeredPane. Я не очень далеко продвинулся, но если у вас есть решение для этого, я был бы очень признателен.

Теперь второй и более важный вопрос, вероятно, заключается в том, что я не понимаю, что совершил какую-то глупую ошибку. В этот момент я был бы счастлив, если бы карты исчезли внизу и просто имели полосу прокрутки, чтобы перейти вниз и выбрать их, но, похоже, это тоже не работает.

SSCCE:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class ScrollPaneTest {

    public static void main(String[] args) {
        new ScrollPaneTest().init();
    }

    public void init() {

        JFrame frame = new JFrame();

        JPanel panel2 = new JPanel();
        JPanel panel = new JPanel();

        panel.setPreferredSize(new Dimension(200, 100));
        panel.setBackground(Color.GREEN);
        panel.setLayout(new FlowLayout());

        for (int i = 0; i < 15; i++) {
            panel.add(new JButton("Hi :)"));
        }

        JScrollPane scroll = new JScrollPane(panel);
        scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        scroll.add(panel);

        panel2.add(panel, BorderLayout.WEST);

        frame.getContentPane().add(panel2, BorderLayout.NORTH);
        frame.setVisible(true);
        frame.pack();

    }
}

Заранее спасибо.

1 Ответ

1 голос
/ 03 июля 2019
JScrollPane scroll = new JScrollPane(panel);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scroll.add(panel);
panel2.add(panel, BorderLayout.WEST);

Это не то, как вы используете JScrollPane.Комментарии для каждой из 4 строк кода:

  1. первая строка верна.Это создаст JScrollPane и добавит панель в область просмотра панели прокрутки.

  2. вам не нужно устанавливать политику полосы прокрутки.Полоса прокрутки появится автоматически, если это необходимо.

  3. не добавляйте компонент непосредственно на панель прокрутки.Компоненты должны быть добавлены в JViewport панели прокрутки (что сделано для вас в первой строке кода)

  4. Не добавляйте «панель» в другуюпанель.У компонента Swing может быть только один родитель.Этот оператор удалит «панель» из панели прокрутки

Вместо этого вам нужно добавить панель прокрутки в родительскую панель:

panel2.add(scroll, BorderLayout.WEST);
...