Куда вставить JScrollPane?

1

Я сделал макет, используя GridBagLayout, чтобы заставить подкомпоненты складываться снизу и вверх.

Единственное, что у меня осталось, это сделать прокручиваемую компоненту "контейнер".

Я попытался вставить JScrollPane в разных местах, но я не нашел рабочего места.

Мои 2 внутренних JPanels выравниваются правильно снизу, и они изменяют размер правильно, когда я изменяю размер окна. Но когда я изменяю размер окна слишком мал для текста, чтобы соответствовать, я хочу, чтобы компонент "контейнер" прокручивался.

Помогите новичкам :)

ОБНОВЛЕНИЕ 1: свиток должен быть для всего GridBagLayout. Не для каждой отдельной текстовой панели.

UPDATE 2: изменил код, чтобы использовать BorderLayout вместо этого, так как это не имеет никакого значения для моей проблемы с прокруткой.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.LineBorder;

public class BorderTest extends JFrame {

private static final long serialVersionUID = 1L;

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new BorderTest().setVisible(true);
        }
    });
}

public BorderTest() {

    UIManager.put("swing.boldMetal", Boolean.FALSE);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setTitle("Grid Bag");
    setSize(500, 300);
    setLocationRelativeTo(null);

    JPanel container = new JPanel();
    container.setLayout(new BorderLayout());
    container.setBorder(new LineBorder(Color.RED, 2));
    add(container);

    JPanel bottom = new JPanel();
    bottom.setBorder(new LineBorder(Color.YELLOW, 2));
    bottom.setLayout(new BoxLayout(bottom, BoxLayout.Y_AXIS));
    container.add(bottom, BorderLayout.SOUTH);

    JTextPane textPane = new JTextPane();
    textPane.setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et ");
    textPane.setBorder(new LineBorder(Color.GREEN, 2));
    bottom.add(textPane);

    JTextPane textPane2 = new JTextPane();
    textPane2.setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et ");
    textPane2.setBorder(new LineBorder(Color.BLUE, 2));
    bottom.add(textPane2);

}

}

Снимок экрана при запуске вышеуказанного кода:

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

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

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

Как вы можете видеть, "красная" граница "снаружи" окна, поэтому размещение прокрутки здесь кажется хорошей идеей. Вот код с добавлением scrollpane:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.LineBorder;

public class BorderTest extends JFrame {

private static final long serialVersionUID = 1L;

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new BorderTest().setVisible(true);
        }
    });
}

public BorderTest() {

    UIManager.put("swing.boldMetal", Boolean.FALSE);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setTitle("Grid Bag");
    setSize(500, 300);
    setLocationRelativeTo(null);

    JScrollPane scrollPane = new JScrollPane();
    scrollPane.setBorder(new LineBorder(Color.CYAN, 2));
    add(scrollPane);

    JPanel container = new JPanel();
    container.setLayout(new BorderLayout());
    container.setBorder(new LineBorder(Color.RED, 2));
    scrollPane.setViewportView(container);

    JPanel innerContainer = new JPanel();
    innerContainer.setLayout(new BorderLayout());
    innerContainer.setBorder(new LineBorder(Color.PINK, 2));
    scrollPane.setViewportView(innerContainer);

    JPanel bottom = new JPanel();
    bottom.setBorder(new LineBorder(Color.YELLOW, 2));
    bottom.setLayout(new BoxLayout(bottom, BoxLayout.Y_AXIS));
    innerContainer.add(bottom, BorderLayout.SOUTH);

    JTextPane textPane = new JTextPane();
    textPane.setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et ");
    textPane.setBorder(new LineBorder(Color.GREEN, 2));
    bottom.add(textPane);

    JTextPane textPane2 = new JTextPane();
    textPane2.setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et ");
    textPane2.setBorder(new LineBorder(Color.BLUE, 2));
    bottom.add(textPane2);

}

}

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

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

Теги:
swing
jscrollpane

1 ответ

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

Чтобы добавить JScrollPane к компоненту, вам просто нужно создать JScrollPane с этим компонентом, а затем добавить JScrollPane на панель, где вы хотите получить компонент.

Поэтому вместо:

panel.add(component, constraints);

использование

JScrollPane scrollPane = new JScrollPane(component);
panel.add(scrollPane, constraints);

Конечно, вы можете использовать scrollPane переменную подстраивать JScrollPane немного, проверьте документацию на него, но simpling положить это в вашем коде мы имеем:

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.LineBorder;

public class GridBag extends JFrame
{

    private static final long serialVersionUID = 1L;

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() {
            public void run()
            {
                new GridBag().setVisible(true);
            }
        });
    }

    public GridBag()
    {

        UIManager.put("swing.boldMetal", Boolean.FALSE);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Grid Bag");
        setSize(500, 300);
        setLocationRelativeTo(null);

        JPanel container = new JPanel(new GridBagLayout());
        container.setBorder(new LineBorder(Color.RED, 2));
        add(container);

        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 1;
        c.weightx = 1.0;
        c.weighty = 1.0;
        c.anchor = GridBagConstraints.LAST_LINE_START;

        JPanel bottom = new JPanel();
        bottom.setLayout(new BoxLayout(bottom, BoxLayout.Y_AXIS));
        bottom.setBorder(new LineBorder(Color.GREEN, 2));
        container.add(bottom, c);

        JTextPane textPane = new JTextPane();
        textPane.setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et ");
        textPane.setBorder(new LineBorder(Color.BLACK, 2));
        bottom.add(new JScrollPane(textPane));

        JTextPane textPane2 = new JTextPane();
        textPane2.setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et ");
        textPane2.setBorder(new LineBorder(Color.BLUE, 2));
        bottom.add(new JScrollPane(textPane2));
    }
}

И делает это так:

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

Что работает, но выглядит не очень красиво, поэтому позвольте мне показать вам пример того, как сделать правильное распределение по высоте, используя свойства GridBagConstraints.weighty.

То, что я собираюсь сделать, это добавить две панели в GridBagLayout (2 ячейки) один над другим и использовать weighty числа, чтобы рассказать им, сколько места займет. Для этого я хочу изменить c.fill на BOTH.

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.LineBorder;

public class GridBag extends JFrame
{

    private static final long serialVersionUID = 1L;

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() {
            public void run()
            {
                new GridBag().setVisible(true);
            }
        });
    }

    public GridBag()
    {

        UIManager.put("swing.boldMetal", Boolean.FALSE);

        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setTitle("Grid Bag");
        setSize(500, 300);
        setLocationRelativeTo(null);

        JPanel container = new JPanel(new GridBagLayout());
        container.setBorder(new LineBorder(Color.RED, 2));
        add(container);

        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.BOTH; //make it fill both directions
        c.gridx = 0;
        c.gridy = 0;
        c.weightx = 1.0;
        c.weighty = 1.0; //modify this number to change the proportion of the screen division
        c.anchor = GridBagConstraints.CENTER; //for this example anything here goes.

        JPanel topPanel = new JPanel();
        topPanel.add(new JTextField("Put other components here"));
        //topPanel.setBorder(new LineBorder(Color.YELLOW, 2));
        container.add(topPanel, c);

        c.gridy = 1;
        c.weighty = 1.0; //modify this number to change the proportion of the screen division

        JPanel bottom = new JPanel();
        bottom.setLayout(new BoxLayout(bottom, BoxLayout.Y_AXIS));
        bottom.setBorder(new LineBorder(Color.GREEN, 2));
        container.add(bottom, c);

        JTextPane textPane = new JTextPane();
        textPane.setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et ");
        textPane.setBorder(new LineBorder(Color.BLACK, 2));
        bottom.add(new JScrollPane(textPane));

        JTextPane textPane2 = new JTextPane();
        textPane2.setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et ");
        textPane2.setBorder(new LineBorder(Color.BLUE, 2));
        bottom.add(new JScrollPane(textPane2));
    }
}

И выглядит так:

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

Это занимает половину экрана для верхних компонентов и половины для двух текстовых панелей, это связано с тем, что weighty из обеих ячеек (topPanel и bottom) равна 1,0, то же значение, поэтому пропорция равна 1:1. Вы можете изменить эти числа, чтобы изменить, сколько места они занимают. Например, если положить первое значение весового значения до 0,5, это составит 1: 2.

  • 0
    Обратите внимание, что в конце я изменил комментарий о весомых значениях, поскольку они должны идти только от 0,0 до 1,0. Помните, что сами ценности не имеют значения, но соотношение между ними. Два, имеющие 1,0, или два, имеющие 0,5, ведут себя точно так же, если их значения больше 0,0
  • 0
    Извините, но я не прояснил себя. Я не хочу полосу прокрутки для каждого компонента. Полоса прокрутки должна быть для «контейнера» (область красной границы). Я буду только заполнять «дно» большим количеством «предметов». Никакие другие компоненты не будут помещены в «контейнер»
Показать ещё 6 комментариев

Ещё вопросы

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