Почему размер окна просмотра для приложения Swing меняется, когда я меняю размер окна? - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь применить scrollPane в своем приложении Swing.
Но я не вижу свою полосу прокрутки, как только я изменяю размер окна.

Я знаю, что в области прокрутки есть 9 компонентов: область просмотра, 2 заголовка, 2 полосы прокрутки и 4 угла. Но когда я устанавливаю цвет границы на красный (который применяется к области просмотра), результат показывает, что толькоэлемент в моем окне - это просто окно просмотра (поскольку красная рамка окружает окно).

Вот мой код.

package swingDemo;

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;;

public class ScrollDemo1 extends JFrame{

    public ScrollDemo1() {
        JLabel label = new JLabel();
        label.setBounds(50,0,1000,100);
        label.setText("Do you want to have a coffee together?");

        JButton button = new JButton("Of course!");
        button.setBounds(10,60,150,50);
        button.addActionListener(e -> label.setText("Well, let's go!"));
        JButton button2 = new JButton("No,sorry.");
        button2.setBounds(170,60,150,50);
        button2.addActionListener(e -> label.setText("Well, let's go!"));

        JPanel panel = new JPanel();
        panel.setBounds(10,10,10,10);
        panel.add(button2);
        panel.add(button);
        panel.add(label);
        panel.setLayout(null);

        JScrollPane scrollPane = new JScrollPane(panel);
        scrollPane.setViewportBorder(BorderFactory.createLineBorder(Color.red));
        scrollPane.setPreferredSize(new Dimension(20,20));
        add(scrollPane);
        scrollPane.setViewportView(panel);
        setBounds(10,10,40,60);
        setTitle("Dating Robot");

    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SwingUtilities.invokeLater(() -> {
            ScrollDemo1 obj = new ScrollDemo1();
            obj.setVisible(true);
        });

    }

}

Я хотел бы видеть полосу прокрутки.Кто-нибудь, пожалуйста?Спасибо!

1 Ответ

0 голосов
/ 03 июля 2019

Есть несколько проблем с кодом, и этот пример должен решить некоторые из них.

Основная проблема была вызвана установкой менеджера макета на null.Когда панель прокрутки пыталась получить размер содержащейся панели, она не смогла получить хороший ответ, поэтому не могла отображать полосы прокрутки.

Возможно, вы заметили, что на самом деле все было наэкран, просто чтобы все было зажато.Установив размер, все видно.

Комментируя setLayout(null), я, вероятно, нарушил визуальный макет, который вы намеревались, так что подстраивайтесь под вкус.Хотя будет лучше использовать один из менеджеров компоновки.

Вызов scrollPane.setViewportView(panel) не нужен, поскольку он уже был обработан в конструкторе, когда вы вызывали new JScrollPane(panel).Возможно, это было мягко, но именно такого рода избыточные вызовы иногда вызывают странность Swing, поскольку Swing часто регистрирует слушателей и тому подобное.

Наконец, я добавил вызов setDefaultCloseOperation, чтобы приложениевыход при нажатии кнопки закрытия окна.

Надеюсь, это поможет!

package swingDemo;

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

;

public class ScrollDemo1 extends JFrame {

  public ScrollDemo1() {
    JLabel label = new JLabel();
    label.setBounds(50, 0, 1000, 100);
    label.setText("Do you want to have a coffee together?");

    JButton button = new JButton("Of course!");
    button.setBounds(10, 60, 150, 50);
    button.addActionListener(e -> label.setText("Well, let's go!"));
    JButton button2 = new JButton("No,sorry.");
    button2.setBounds(170, 60, 150, 50);
    button2.addActionListener(e -> label.setText("Well, let's go!"));

    JPanel panel = new JPanel();
    panel.setBounds(10, 10, 10, 10);
    panel.add(button2);
    panel.add(button);
    panel.add(label);
    // This causes problems:
//    panel.setLayout(null);

    JScrollPane scrollPane = new JScrollPane(panel);
    scrollPane.setViewportBorder(BorderFactory.createLineBorder(Color.red));
    scrollPane.setPreferredSize(new Dimension(20, 20));
    add(scrollPane);
    // This is redundent:
//    scrollPane.setViewportView(panel);
    setBounds(10, 10, 40, 60);
    setTitle("Dating Robot");
    // Some initial size (or "pack") is needed to make it big enough to see
    setSize(500, 500);
    // This makes the app exit cleanly when closing the frame
    this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
  }

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    SwingUtilities.invokeLater(() -> {
      ScrollDemo1 obj = new ScrollDemo1();
      obj.setVisible(true);
    });
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...