Управление уменьшением размера ScrollPane в GridBagLayout - PullRequest
0 голосов
/ 08 февраля 2019

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

Я думал, что использование GridBagLayout было бы способом, но когда я делаю, поведение изменения размера удержания ScrollPaneизображение является неожиданным: когда окно графического интерфейса пользователя уменьшается в размере, так что доступное пространство слишком мало для изображения в ScrollPane, компонент ScrollPane сразу же уменьшает размер до размера, намного меньшего, чем доступное пространство.

Изображение для примера кода: qm.png

import scala.swing.{ Button, GridBagPanel, Label, MainFrame, ScrollPane, SimpleSwingApplication }
import javax.swing.ImageIcon

object GridBag_vs_ScrollPane extends SimpleSwingApplication {
    def top = new MainFrame {
        title = "GridBag vs ScrollPane"
        contents = gui
    }

    val gui = new GridBagPanel {
        val fp_img = """.\resources\qm.png"""
        val scrPane = new ScrollPane( new Label { icon = new ImageIcon(fp_img) } )
        val button1 = new Button("Button 1")

        val c = new Constraints
        c.gridx = 0
        c.gridy = 0
        layout(button1) = c

        c.weighty = 1.0
        c.gridx = 0
        c.gridy = 1
        layout(scrPane) = c
    }
}

Поведение ScrollPane, которое я искал, больше похоже на поведение следующего фрагмента кода:

import javax.swing.ImageIcon

import scala.swing.{Label, MainFrame, ScrollPane, SimpleSwingApplication}

object SimpleScrollPane extends SimpleSwingApplication {
    def top = new MainFrame {
        title = "Simple ScrollPane"
        val fp_img = """.\resources\qm.png"""
        contents = new ScrollPane( new Label { icon = new ImageIcon(fp_img) } )
    }
}

Я не могу понять, как получить желаемое поведение, и почему ScrollPane ведет себя по-разному в обеих реализациях GUI.

Может ли кто-нибудь просветить меня?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Предложение Эндрю Томпсона привело меня на полпути.Мне нужно было добавить как c.fill = Fill.Both, так и c.weightx = 1.0 в ограничения для области прокрутки.

Тот факт, что ограничение заполнения является частью решения, для меня противоречит интуиции, так как учебник по GridBagLayout описывает ограничения заполнения как «Используется, когда область отображения компонента больше, чем запрошенный размер компонента, чтобы определить, нужно ли и как изменить размер компонента.», Тогда как в моем случае запрошенный размер компонента области прокрутки был фактическибольше доступной области отображения.

0 голосов
/ 08 февраля 2019

В компоненте, который вы добавляете в область прокрутки, переопределите

public Dimension getMinimumSize() 

или

public Dimension getPreferredSize()

Различные менеджеры по расположению используют эти значения.

...