1

JTextAreaユーザーがさらにテキストを入力すると、キャレットの位置が常に表示されるようにスクロールする方法は?

これは私にはばかげた質問のように思えます。以前に尋ねられたに違いないような気がしますが、検索しても答えが見つかりません。

に埋め込まれた複数行のテキスト領域がありJScrollPaneます。ユーザーがテキスト領域を埋めるまで入力を続けると、最終的にキャレットが (表示されている領域の下に) 見えなくなり、ユーザーは入力内容を見ることができなくなります。これがデフォルトの動作になるのは奇妙に思えます。テキスト領域が常にキャレットのある行までスクロールするようにするにはどうすればよいですか。

テキスト領域で改行が有効になっていることに注意してください。

4

1 に答える 1

1

私の意見では、メソッドは限られた数のコンポーネントで使用され、プログラマーが提供するサイジングのヒントに応じて、背後で使用されるsetXxXSize()ことを念頭に置いて使用する必要があります。LayoutLayout Manager

したがって、そのサイズを計算するためのヒントを提供するのに十分なとのようなコンポーネントの場合JTextArea、可能な限り、いくつかの方法を使用してハードコードされたサイズに関連付けるべきではありません。RowsColumnsLayoutsetXxXSize()

ここで、同じサンプルコードを提供しました:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.EventHandler;
import javax.swing.*;

public class DialogWithScroller
{
    private JFrame frame;
    private JButton showButton;
    private MyDialog myDialog;

    private void displayGUI()
    {
        frame = new JFrame("Dialog ScrollPane Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel contentPane = new JPanel(new BorderLayout(5, 5));
        showButton = new JButton("Show Dialog");
        showButton.addActionListener((ActionListener)
                EventHandler.create(ActionListener.class,
                        DialogWithScroller.this, "buttonActions", ""));     
        contentPane.add(showButton);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }   

    public void buttonActions(ActionEvent ae)
    {
        myDialog = new MyDialog(frame
                , "TextArea with ScrollPane", true);
    }

    public static void main(String[] args)
    {
        Runnable runnable = new Runnable()
        {
            @Override
            public void run()
            {
                new DialogWithScroller().displayGUI();
            }
        };
        EventQueue.invokeLater(runnable);
    }
}

class MyDialog extends JDialog
{
    private JTextArea tArea;
    private JButton hideButton;

    private ActionListener buttonActions =
                            new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent ae)
        {
            MyDialog.this.dispose();
        }
    };

    public MyDialog()
    {}

    public MyDialog(Frame owner, String title, boolean modal)
    {
        super(owner, title, modal);
        displayGUI();
    }

    private void displayGUI()
    {
        JPanel contentPane = new JPanel(
                        new BorderLayout(5, 5));
        contentPane.setBorder(
                BorderFactory.createTitledBorder(
                            "My Personal Text Area"));
        /*
         * Here one can simply initialize the
         * JTextArea like this too, using the
         * constructor itself for specifying
         * the Rows and Columns, which will
         * help the layout concern to determine
         * its size
         */
        tArea = new JTextArea(20, 20);
        tArea.setLineWrap(true);
        tArea.setWrapStyleWord(true);
        JScrollPane textScroller = new JScrollPane(tArea);
        //textScroller.setViewportView(tArea);

        hideButton = new JButton("Hide Dialog");
        hideButton.addActionListener(buttonActions);

        contentPane.add(textScroller, BorderLayout.CENTER);
        contentPane.add(hideButton, BorderLayout.PAGE_END);
        setContentPane(contentPane);
        pack();
        setLocationByPlatform(true);
        setVisible(true);
    }   
}

コンテナーでWindow.pack()を呼び出すことは、常に賢明な方法であると考えられています。これにより、この Window は、そのサブコンポーネントの優先サイズとレイアウトに合わせてサイズ変更されます。ただし、このような呼び出しは、プログラマーがすべてのコンポーネントをコンテナーに追加した後、コンテナーを可視状態に設定する前に行う必要があります。

于 2013-07-13T04:18:20.783 に答える