5

私はこの男と同じことで問題を抱えています:

linewrap = trueで使用した場合、MigLayoutJTextAreaは縮小しません

そして、私は答えの1つで説明されている解決策を使用しました。最小サイズを明示的に設定します。これは、JTextAreaを含むJPanelを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

4 に答える 4

9

私は非常によく似た問題を抱えていましたが、上記の質問の答えに従うことも役に立ちませんでした。ただし、それは貴重なアイデアを提供しました。問題は、ラップが有効になっているJTextAreaの幅にあります。

私にとってうまくいったのは、コマンドを使用してコンポーネントレベルで最小幅と優先幅の両方を設定することでしたwidth。たとえば、width 10:500:

于 2011-10-20T08:59:19.357 に答える
7

JScrollPanesで使用すると、JTextAreasとラッピングで同様の問題が発生しました。

私のために働いた解決策は、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);
    }
}
于 2011-11-15T01:42:07.203 に答える
0

通常、JTextAreaをJScrollPaneに配置します。このような:

JTextArea area = new JTextArea();
JScrollPane scroll = new JScrollPane(area);
JPanel panel = new JPanel();
panel.add(scroll);
于 2011-05-16T20:52:11.923 に答える
0

ここで何を達成しようとしているのかよくわからない場合は、これを実行して、ニーズに合っているかどうかを確認してください。


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

于 2011-10-24T08:59:33.047 に答える