Перенос строки в JTextArea приводит к неправильной работе JScrollPane с MiGLayout - PullRequest
5 голосов
/ 17 мая 2011

У меня проблемы с тем же человеком, что и с этим парнем:

MigLayout JTextArea не сжимается при использовании с linewrap = true

и я использовал решение, описанное в одном из ответов; установить минимальный размер явно. Это прекрасно работает, если поместить JPanel, которая содержит JTextArea, непосредственно в JFrame, а затем изменить размер окна.

Однако при размещении панели, содержащей JTextArea, внутри JScrollPane, та же проблема возникает снова. Почему это так и как это можно исправить?

Приветствия

РЕДАКТИРОВАТЬ: пример

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());
    JScrollPane scrollPane = new JScrollPane(panel);
    //add(panel);
    add(scrollPane);
    pack();
}
public static void main(String[] args){
    new MiGTest2().setVisible(true);
}
}

Если вы раскомментируете //add(panel); и комментируете add(scrollPane);, уменьшение размера окна также уменьшит JTextArea. То есть он не работает с JScrollPane. Также обратите внимание, как менеджер раскладки, кажется, переворачивается и начинает «встряхивать» все его содержимое при уменьшении размера окна после его первого увеличения

Ответы [ 4 ]

8 голосов
/ 20 октября 2011

У меня была очень похожая проблема, и ответ на вопрос в упомянутом вопросе мне тоже не помог. Тем не менее, это дало ценную идею - проблема в ширине JTextArea с включенным переносом.

Для меня работало установка минимальной и предпочтительной ширины на уровне компонента с помощью команды width. Например, width 10:500:.

7 голосов
/ 15 ноября 2011

У меня были похожие проблемы с JTextAreas и переносом при использовании с JScrollPanes.

Решение, которое работало для меня, состояло в том, чтобы создать пользовательскую панель, которая реализует интерфейс Scrollable и переопределяет метод getScrollableTracksViewportWidth () для возврата true. Это приводит к тому, что область прокрутки выполняет только вертикальную прокрутку, и позволяет переносу строк в JTextArea работать, как и ожидалось.

/**
 * 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);
    }
}

и MigTest2 становится:

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);
    }
}
0 голосов
/ 24 октября 2011

Не совсем уверен, чего вы здесь добиваетесь, попробуйте запустить его и посмотреть, соответствует ли он вашим потребностям?


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(new JScrollPane(textArea), "wmin 10, grow, push");

        setLayout(new MigLayout("fill"));

        JScrollPane scrollPane = new JScrollPane(panel);
        add(scrollPane, "grow, push");

        pack();
    }

    public static void main(String[] args) {
        new MiGTest2().setVisible(true);
    }
}

0 голосов
/ 17 мая 2011

Обычно вы помещаете JTextArea в вашу JScrollPane.Как это:

JTextArea area = new JTextArea();
JScrollPane scroll = new JScrollPane(area);
JPanel panel = new JPanel();
panel.add(scroll);
...