Java (Swing): JScrollPane.setBounds () не применяется? - PullRequest
1 голос
/ 24 марта 2011

Я пытаюсь создать простой JList с полосой прокрутки, и поэтому мне нужно, чтобы JList был внутри JScrollPane.Все идет нормально.Тем не менее, по какой-то причине я не могу изменить размер / положение JScrollPane !?Звучит логично, что все внутри него должно растягиваться до 100%, поэтому, если я установлю JScrollPane шириной 300 пикселей, элементы внутри тоже будут.Это правильно?

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

Заранее спасибо, qwerty

РЕДАКТИРОВАТЬ: Вот скриншот его работает: http://i.stack.imgur.com/sLGgQ.png

Ответы [ 3 ]

2 голосов
/ 24 марта 2011

Метод setVisibleRowCount() для JList особенно удобен для этого, как предлагается в соответствующем руководстве .ListDemo является хорошим примером.

Приложение:

Пожалуйста, критикуйте и дайте мне советы ...

Ну, таквы спрашиваете: не вызывайте публичные методы в конструкторе;сделайте их приватными или вызовите их после , когда конструктор завершит работу.Нет необходимости искать последний индекс для add(), когда доступно addElement().Кроме того, обязательно создайте свой графический интерфейс в потоке отправки событий .

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

/** @see http://stackoverflow.com/questions/5422160 */
public class ListPanel extends JPanel {

    private DefaultListModel model = new DefaultListModel();
    private JList list = new JList(model);

    ListPanel() {
        list.setVisibleRowCount(5);
    }

    public void append(String inputString) {
        model.addElement(inputString);
    }

    private void init() {
        for (int i = 0; i < 10; i++) {
            this.append("String " + String.valueOf(i));
        }
        JFrame mainFrame = new JFrame("GUI");
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JScrollPane jsp = new JScrollPane(list);
        mainFrame.add(jsp);
        mainFrame.pack();
        mainFrame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ListPanel().init();
            }
        });
    }
}
1 голос
/ 24 марта 2011

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

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

1 голос
/ 24 марта 2011

Попробуйте поместить JScrollPane в JPanel и добавить панель в рамку.

JPanel panel = new JPanel();
panel.add (logWrapper);
mainFrame.add(panel);

Затем установите границы панели вместо JScrollpane

panel.setBounds(10, 10, 20, 50);

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

...