10

現在作成しているプログラム内に機能を実装しようとしていますが、JTextArea内の特定のテキストまでスクロールダウンする方法を学びたいと思います。たとえば、次のようなものがあるとします。

JTextArea area = new JTextArea(someReallyLongString);

someReallyLongStringは、段落または非常に大きなテキスト(垂直スクロールバーが表示される)を表します。そして、私がやろうとしているのは、そのテキスト領域内の特定のテキストまでスクロールダウンすることです。たとえば、someReallyLongStringにスクロールバーの中央近くに「the」という単語が含まれているとしましょう(この単語は表示されません)。その特定のテキストまでスクロールダウンするにはどうすればよいですか?

おかげで、どんな助けでも大いに感謝するでしょう。

4

4 に答える 4

24

これは非常に基本的な例です。これは基本的にドキュメントをウォークしてドキュメント内の単語の位置を見つけ、テキストが表示可能領域に移動することを保証します。

試合もハイライトします

ここに画像の説明を入力してください

public class MoveToText {

    public static void main(String[] args) {
        new MoveToText();
    }

    public MoveToText() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new FindTextPane());
                frame.setSize(400, 400);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class FindTextPane extends JPanel {

        private JTextField findField;
        private JButton findButton;
        private JTextArea textArea;
        private int pos = 0;

        public FindTextPane() {
            setLayout(new BorderLayout());
            findButton = new JButton("Next");
            findField = new JTextField("Java", 10);
            textArea = new JTextArea();
            textArea.setWrapStyleWord(true);
            textArea.setLineWrap(true);

            Reader reader = null;
            try {
                reader = new FileReader(new File("Java.txt"));
                textArea.read(reader, null);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    reader.close();
                } catch (Exception e) {
                }
            }

            JPanel header = new JPanel(new GridBagLayout());

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.anchor = GridBagConstraints.WEST;
            header.add(findField, gbc);
            gbc.gridx++;
            header.add(findButton, gbc);

            add(header, BorderLayout.NORTH);
            add(new JScrollPane(textArea));

            findButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    // Get the text to find...convert it to lower case for eaiser comparision
                    String find = findField.getText().toLowerCase();
                    // Focus the text area, otherwise the highlighting won't show up
                    textArea.requestFocusInWindow();
                    // Make sure we have a valid search term
                    if (find != null && find.length() > 0) {
                        Document document = textArea.getDocument();
                        int findLength = find.length();
                        try {
                            boolean found = false;
                            // Rest the search position if we're at the end of the document
                            if (pos + findLength > document.getLength()) {
                                pos = 0;
                            }
                            // While we haven't reached the end...
                            // "<=" Correction
                            while (pos + findLength <= document.getLength()) {
                                // Extract the text from teh docuemnt
                                String match = document.getText(pos, findLength).toLowerCase();
                                // Check to see if it matches or request
                                if (match.equals(find)) {
                                    found = true;
                                    break;
                                }
                                pos++;
                            }

                            // Did we find something...
                            if (found) {
                                // Get the rectangle of the where the text would be visible...
                                Rectangle viewRect = textArea.modelToView(pos);
                                // Scroll to make the rectangle visible
                                textArea.scrollRectToVisible(viewRect);
                                // Highlight the text
                                textArea.setCaretPosition(pos + findLength);
                                textArea.moveCaretPosition(pos);
                                // Move the search position beyond the current match
                                pos += findLength;
                            }

                        } catch (Exception exp) {
                            exp.printStackTrace();
                        }

                    }
                }
            });

        }
    }
}
于 2012-11-18T07:57:41.973 に答える
3

これは機能するはずです:

textArea.setCaretPosition(posOfTextToScroll);

posOfTextToScrollモデルごとに入手できますDocument。Javadocでそれについて読んでください。

于 2012-11-18T06:15:16.573 に答える
1

まず、テキスト領域に設定したテキストを取得し、マップを使用してインデックスを作成し、文字とその位置を保持します。

これに基づいて、提案された以前の回答では、マップから取得した値を使用してsetCaretPositionを使用しました。

于 2012-11-18T07:10:25.800 に答える
0

MadProgrammerによるコメントに追加します。

scrollRectToVisible(viewRect)Java SE9で非推奨になり、次のように置き換えられました。scrollRectToVisible2D(viewRect)

非推奨の関数を使用せずにテキストを表示する適切な方法は次のとおりです。

java.awt.geom.Rectangle2D view = area.modelToView2D(pos); // View where pos is visible
area.scrollRectToVisible(view.getBounds()); // Scroll to the rectangle provided by view
area.setCaretPosition(pos); // Sets carat position to pos
于 2020-06-29T18:28:10.430 に答える