Line wrap in a JTextArea causes JScrollPane to missbehave with MiGLayout

前端 未结 4 2014
轻奢々
轻奢々 2021-02-10 01:58

I am having trouble with the same thing as this guy:

MigLayout JTextArea is not shrinking when used with linewrap=true

and I used the solution described in one o

4条回答
  •  名媛妹妹
    2021-02-10 02:30

    I've had similar problems with JTextAreas and wrapping when used with JScrollPanes.

    A solution that worked for me was to create a custom panel that implements the Scrollable interface and overrides the getScrollableTracksViewportWidth() method to return true. This forces causes the scroll pane to only scroll vertically and lets line wrapping in the JTextArea work as expected.

    /**
     * A panel that, when placed in a {@link JScrollPane}, only scrolls vertically and resizes horizontally as needed.
     */
    public class OnlyVerticalScrollPanel extends JPanel implements Scrollable
    {
        public OnlyVerticalScrollPanel()
        {
            this(new GridLayout(0, 1));
        }
    
        public OnlyVerticalScrollPanel(LayoutManager lm)
        {
            super(lm);
        }
    
        public OnlyVerticalScrollPanel(Component comp)
        {
            this();
            add(comp);
        }
    
        @Override
        public Dimension getPreferredScrollableViewportSize()
        {
            return(getPreferredSize());
        }
    
        @Override
        public int getScrollableUnitIncrement(Rectangle visibleRect,
                int orientation, int direction)
        {
            return(10);
        }
    
        @Override
        public int getScrollableBlockIncrement(Rectangle visibleRect,
                int orientation, int direction)
        {
            return(100);
        }
    
        @Override
        public boolean getScrollableTracksViewportWidth()
        {
            return(true);
        }
    
        @Override
        public boolean getScrollableTracksViewportHeight()
        {
            return(false);
        }
    }
    

    and MigTest2 becomes:

    public class MiGTest2 extends JFrame
    {   
        public MiGTest2()
        {
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JPanel panel = new JPanel(new MigLayout("fillx, debug", "[fill]"));
            JTextArea textArea  = new JTextArea();
            textArea.setLineWrap(true);
            panel.add(textArea, "wmin 10");
            //panel.add(new JTextField());
    
            //Wrap panel with the OnlyVerticalScrollPane to prevent horizontal scrolling
            JScrollPane scrollPane = new JScrollPane(new OnlyVerticalScrollPanel(panel));
            //add(panel);
            add(scrollPane);
            pack();
        }
    
        public static void main(String[] args)
        {
            new MiGTest2().setVisible(true);
        }
    }
    

提交回复
热议问题