How to place components in the vertical scroll area only?

I have a difficult question that I cannot find anywhere.

here is an example:

public static void main(final String[] args) {
    final JFrame frame = new JFrame("test");
    final JPanel bigPane = new JPanel(new GridLayout(0, 1));
    frame.setContentPane(new JScrollPane(bigPane, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
            ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER));
    bigPane.add(new JTextField("reterterter ertertrert erterter ert"));
    bigPane.add(new JTextField(" ertertrert erterter ert"));
    bigPane.add(new JTextField("reterterter ertertrert  ert"));
    bigPane.add(new JTextField("reterterter ertertrert erterter "));
    frame.pack();
    frame.setSize(frame.getSize().width/2, frame.getSize().height);
    frame.setVisible(true);
}

Here it is clear that the text fields are cut. More precisely, bigPane is cut. But I would like the text fields to be changed, not cut, so we can still use them.

Since horizontal scrollbar is not allowed, I would like the layout to forget the preferred width of the view (bigPane) and always increase the width of the view to the width of the viewport. Like the virtual viewport for horizontal direction, only in the vertical area.

I can’t find a solution to this or even hack if you can help.

Niko.

PS: it looks like the code for ViewportLayout does not contain any code for this

PS2: http://www.nraynaud.com/kilombo/testLayout.png, .

+3
3

, "" - :

public class ScrollPaneWidthTrackingPanel extends JPanel implements Scrollable {
    private static final long serialVersionUID = 1L;

    public ScrollPaneWidthTrackingPanel(LayoutManager layoutManager) {
        super(layoutManager);
    }

    public Dimension getPreferredScrollableViewportSize() {
        return getPreferredSize();
    }

    public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
        return Math.max(visibleRect.height * 9 / 10, 1);
    }

    public boolean getScrollableTracksViewportHeight() {
        return false;
    }

    public boolean getScrollableTracksViewportWidth() {
        return true;
    }

    public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
        return Math.max(visibleRect.height / 10, 1);
    }
}

:

final ScrollPaneWidthTrackingPanel bigPane = new ScrollPaneWidthTrackingPanel(new GridLayout(0, 1));
frame.setContentPane(new JScrollPane(bigPane));

JScrollPane . , JScrollPane. , getScrollableTracksViewportHeight:

if (getParent() instanceof JViewport) {
    JViewport viewport = (JViewport) getParent();
    return component.getPreferredSize().height < viewport.getHeight();
}
+4

JTextField, int . . setText ( ).

, (setMaximumSize, setMinimumSize) .

+1

JavaDoc:

:
- , ,
- , ; , ,

Since you call constructor 0, you get an implementation of “everything that naturally turns out” that takes the length of your lines too long. A simple call to the column constructor with a non-zero value will fix this for you. Try these lines:

bigPane.add(new JTextField("reterterter ertertrert erterter ert",3));
bigPane.add(new JTextField(" ertertrert erterter ert",3));
bigPane.add(new JTextField("reterterter ertertrert  ert",3));
bigPane.add(new JTextField("reterterter ertertrert erterter ",3));

Here is a screenshot of the resulting panel:

alt text
(source: mcglashan.net )

+1
source

Source: https://habr.com/ru/post/1714664/


All Articles