Дизайн Swing GUI с JScrollPane и JLayeredPane - PullRequest
2 голосов
/ 04 февраля 2011

Я хотел бы настроить GUI, как показано на рисунке ниже.

Размер JLayeredPane всегда должен быть одинаковым, но размеры JPanel и JScrollPane могут изменяться. Мне нужно, чтобы JScrollPane мог отображать JLayedPane, нажимая стрелки, а что нет, если JPanel и JScrollPane недостаточно велики, чтобы показать весь JLayeredPane.

Проблема в том, что с кодом ниже, JLayeredPane всегда расширяется до размера JScrollPane и в случае, если JScrollPane меньше, чем JLayeredPane, он не обеспечивает прокрутку способность.

Есть идеи о том, что происходит? Есть ли более простой код для этого?

Спасибо

<code>
contentPanePanel = new javax.swing.JPanel();
contentPaneScollPane = new javax.swing.JScrollPane();
contentPane = new javax.swing.JLayeredPane();

contentPanePanel.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));

contentPane.setRequestFocusEnabled(false);
contentPane.setVerifyInputWhenFocusTarget(false);

contentPaneScollPane.setViewportView(contentPane);

javax.swing.GroupLayout contentPanePanelLayout = new javax.swing.GroupLayout(contentPanePanel);

contentPanePanel.setLayout(contentPanePanelLayout);

contentPanePanelLayout.setHorizontalGroup(
    contentPanePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addComponent(contentPaneScollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 968, Short.MAX_VALUE)
);
contentPanePanelLayout.setVerticalGroup(
    contentPanePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addComponent(contentPaneScollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 628, Short.MAX_VALUE)
);

Ответы [ 2 ]

1 голос
/ 04 февраля 2011

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

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

public class ScrollPaneSSCCE
{
    private static void createAndShowUI()
    {
        JPanel center = new JPanel();
        center.setPreferredSize( new Dimension(300, 300) );
        center.setBackground( Color.RED );

        JPanel main = new JPanel( new GridBagLayout() );
        main.add(center, new GridBagConstraints());

        JFrame frame = new JFrame("Basic ScrollPaneSSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new JScrollPane( main ) );
        frame.setSize(400, 400);
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}
1 голос
/ 04 февраля 2011

Это предполагаемое поведение JScrollPane .., которое обеспечивает область просмотра для базового компонента. Это означает, что, если компонент имеет значение JLayeredPane, тогда вся панель рассматривается как прикрепленное представление области прокрутки, и нет никаких невидимых вставок, которые размещают многослойную панель по центру, как вам нужно, при этом удерживая область прокрутки больше.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...