Макет для динамического отображения панелей с помощью полосы прокрутки - PullRequest
3 голосов
/ 31 октября 2011

В Java я пытался создать панель, которая может принимать другие панели с полосой прокрутки.

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

Я пытался использовать flowlayout, но это заставляет панели течь горизонтально, поскольку есть полоса прокрутки.

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

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

Ответы [ 2 ]

5 голосов
/ 31 октября 2011

Constrained Grid

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

/** This lays out components in a column that is constrained to the
top of an area, like the entries in a list or table.  It uses a GridLayout
for the main components, thus ensuring they are each of the same size.
For variable height components, a BoxLayout would be better. */
class ConstrainedGrid {

    ConstrainedGrid() {
        final JPanel gui = new JPanel(new BorderLayout(5,5));
        gui.setBorder(new EmptyBorder(3,3,3,3));
        gui.setBackground(Color.red);

        JPanel scrollPanel = new JPanel(new BorderLayout(2,2));
        scrollPanel.setBackground(Color.green);
        scrollPanel.add(new JLabel("Center"), BorderLayout.CENTER);
        gui.add(new JScrollPane(scrollPanel), BorderLayout.CENTER);

        final JPanel componentPanel = new JPanel(new GridLayout(0,1,3,3));
        componentPanel.setBackground(Color.orange);
        scrollPanel.add(componentPanel, BorderLayout.NORTH);

        JButton add = new JButton("Add");
        gui.add(add, BorderLayout.NORTH);
        add.addActionListener( new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                componentPanel.add(new JTextField());
                gui.validate();
            }
        });

        Dimension d = gui.getPreferredSize();
        d = new Dimension(d.width, d.height+100);
        gui.setPreferredSize(d);

        JOptionPane.showMessageDialog(null, gui);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                ConstrainedGrid cg = new ConstrainedGrid();
            }
        });
    }
}
1 голос
/ 31 октября 2011

Предполагая JScrollPane, см. Определение размера области прокрутки .Для удобства Scrollable клиентов, таких как JTable, предлагают setPreferredScrollableViewportSize(), но вы всегда можете явно указать размер области просмотра.

...