Сделать Java JScrollpane прокручивать вертикально, а не горизонтально - PullRequest
0 голосов
/ 26 апреля 2018

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

Вот мой код:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class GridView {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    JFrame frame = new JFrame("Display Buttons");
    frame.setBounds(30, 30, 300, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    GridLayout grid = new GridLayout(3, 4, 30, 20);
    Container content = frame.getContentPane(); 
    content.setLayout(grid); 
    JPanel panel = new JPanel();
    JButton button = null;
    for (int i = 1; i <= 100; i++) {
        panel.add(button = new JButton(" Press " + i));
    }
    content.add(panel);
    frame.add(panel, BorderLayout.NORTH);
    frame.add(new JScrollPane(panel), BorderLayout.CENTER);
    frame.pack();
    frame.setVisible(true);
}
}

Может кто-нибудь сказать мне, почему моя прокрутка отображается горизонтально и какпочини это?Любой ответ будет высоко ценится.

РЕДАКТИРОВАТЬ: я извиняюсь.Мой вопрос был неполным.Я хочу сделать это примерно так, но с вертикальной прокруткой.

enter image description here

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018
//GridLayout grid = new GridLayout(3, 4, 30, 20);
GridLayout grid = new GridLayout(0, 4, 30, 20);

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

//content.setLayout(grid); 
//JPanel panel = new JPanel();
JPanel panel = new JPanel(grid);

Вы добавляете кнопки на панель, поэтому вам нужно установить менеджер раскладки панели.В противном случае JPanel будет использовать FlowLayout по умолчанию, который отображает все кнопки в одной строке.

0 голосов
/ 26 апреля 2018

Отображается горизонтально, потому что кнопки добавляются горизонтально, поэтому ширина panel превышает порт просмотра.Если вы добавили кнопки по вертикали, с помощью другого менеджера по расположению, панель прокрутки будет отображаться вертикально.Например:

JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));  //or setLayout(grid); if you meant to use tge gridlayout for the buttons 
/*JButton button = null;*/ //never used
for (int i = 1; i <= 100; i++) {
    panel.add(new JButton(" Press " + i));
}

Редактировать , чтобы ответить на отредактированный вопрос.Смотрите комментарии:

public static void main(String[] args) {

    JFrame frame = new JFrame("Display Buttons");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    GridLayout grid = new GridLayout(0, 4, 30, 20);
    JPanel panel = new JPanel(grid);
    for (int i = 1; i <= 100; i++) {
        panel.add(new JButton(" Press " + i));
    }

    JScrollPane sp = new JScrollPane(panel);
    //by default scrollpane will appear as needed, vertically AND horizontally
    //to prevent it from showing horizontally :
    sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    frame.add(sp, BorderLayout.CENTER);
    frame.pack();
    frame.setVisible(true);
}
...