Как для jpanel больше, чем JFrame, содержащие его, а затем использовать полосы прокрутки?

Я пытаюсь создать JFrame, содержащие 2Д массив размером n*m, содержащих меньше для jpanel (каждый 50*50)

У меня есть вопросы, когда Арай получил больше, чем мою форму. Поскольку для jpanel, содержащий массив будет больше, чем форму.

Мой вопрос Могу ли я иметь этого jpanel больше, чем мой JFrame и использовать полосу прокрутки для перемещения по ней ?

Ил уже пытался использовать setpreferredsize то и getpreferredsize с setUndecorated(правда).

Без setUndecorated мой jpanel по стать очень маленьким, и все его содержимое, а также.

С ним мой форму растет, чтобы иметь необходимый размер, чтобы для jpanel внутри него и даже расти с экрана.

Как вы можете видеть в коде, я попытался использовать метод setsize() хорошо, но я не мог получить то, что хочу.

Форму :


import javax.swing.*;
import java.awt.*;

public class BoardWindow extends RowdyWindow {
    private RowdyPanel[][] panels;
    private BoardPanel principal;
    public RowdyPanel[][] getPanels() {
        return panels;
    }
    public BoardWindow(String title, Dimension dimension, OnCloseAction action) {
        super(title, dimension, action);
        //this.setExtendedState(JFrame.MAXIMIZED_BOTH);
        this.setUndecorated(true);
        int lineIndex = GUIController.getStartMenu().getGridHeight();
        int columnIndex = GUIController.getStartMenu().getGridWidth();
        panels = WindowBuilder.createPanelBoard(lineIndex, columnIndex);
        principal = new BoardPanel(this);
        principal.setBackground(Color.BLACK);
        principal.setLayout(new GridBagLayout());
        //principal.setLayout(new GridLayout(panels.length, panels[0].length));
        createBoard(lineIndex, columnIndex);
        principal.setSize(panels[0].length*50, panels.length*50);
        principal.setPreferredSize(principal.getPreferredSize());
        principal.setMinimumSize(principal.getPreferredSize());
        this.setContentPane(principal);
        this.setPreferredSize(getPreferredSize());
        GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
        int width = gd.getDisplayMode().getWidth();
        int height = gd.getDisplayMode().getHeight();
        this.setSize(width, height);
        this.setVisible(true);
    }
    public Dimension getPreferredSize() {
        GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
        int width = panels.length*50;
        int height = panels[0].length*50;
        return new Dimension( width, height );
    }
    private void createBoard(int lineIndex, int columnIndex) {
        GridBagConstraints gbc = new GridBagConstraints();
        for (int lIndex = 0; lIndex<lineIndex; lIndex++){
            for (int cIndex = 0; cIndex<columnIndex; cIndex++){
//                principal.add(panels[lIndex][cIndex]);
                gbc.gridx = cIndex;
                gbc.gridy = lIndex;
                gbc.gridheight = 1;
                gbc.gridwidth = 1;
                principal.add(panels[lIndex][cIndex], gbc);
            }
        }
    }
}

Для jpanel :


import javax.swing.*;
import java.awt.*;

public class BoardPanel extends JPanel {
    private BoardWindow window;
    public BoardPanel(BoardWindow window){
        this.window = window;
    }
    public Dimension getPreferredSize() {
        GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
        int width = window.getPanels().length*50;
        int height = window.getPanels()[0].length*50;
        return new Dimension( width, height );
    }
}

Методами, которые я использую для создания 2D массива :

public static RowdyPanel[][] createPanelBoard(int lineLength, int columnLength){
        RowdyPanel[][] panels = new RowdyPanel[lineLength][columnLength];
        boolean switchColor = true;
        for (int lineIndex = 0; lineIndex < lineLength; lineIndex++){
            for (int columnIndex = 0; columnIndex < columnLength; columnIndex++){
                if (switchColor){
                    panels[lineIndex][columnIndex] = panelBoard(lineIndex, columnIndex,Color.LIGHT_GRAY,Color.DARK_GRAY);
                    switchColor=false;
                } else {
                    panels[lineIndex][columnIndex] = panelBoard(lineIndex, columnIndex,Color.WHITE,Color.DARK_GRAY);
                    switchColor=true;
                }
            }
            if (columnLength%%2 == 0){
                switchColor = !switchColor;
            }
        }
        return  panels;
    }

    private static RowdyPanel panelBoard(int lineIndex, int columnIndex, Color colorOk, Color notOk) {
        RowdyPanel panel = new RowdyPanel();
        if (RowdyRacer.isAWall(lineIndex, columnIndex)){
            panel.setBackground(notOk);
            panel.setPreferredSize(new Dimension(50,50));
            panel.setSize(new Dimension(50,50));
        } else {
            panel.setBackground(colorOk);
            RowdyButton button = new RowdyButton("");
            button.setPreferredSize(new Dimension(50,50));
            button.setSize(new Dimension(50,50));
            button.setVisible(false);
            panel.setPreferredSize(new Dimension(50,50));
            panel.setSize(new Dimension(50,50));
            panel.setButton(button);
        }
        if (RowdyRacer.isStartingPos(lineIndex,columnIndex)){
            if(RowdyRacer.isP1(lineIndex, columnIndex)){
                panel.getP1().ChangeVisible(true);
            } else {
                panel.getP2().ChangeVisible(true);
            }
        }
        return panel;
    }

То, что я хотел бы получить это в JFrame, имеющие размер экрана и наличие полосы прокрутки на стороне.

Внутри моего компонента jpanel будет иметь больший размер, чем JFrame и я мог использовать полосу прокрутки, чтобы увидеть everypart из него.

Спасибо за вашу помощь.

0
2019-09-18 15:11:07
источник
0 ответов

Посмотрите другие вопросы по меткам