6

コンピューターに保存されている現在の映画を表示する JFrame があります。ファイルの名前が の として表示されStringますJTextArea

私がやりたいのは、特定Stringのファイル (コンピューター上の実際のファイルを表す) をダブルクリックすると、そのファイルが開かれるということです。

オープニング部分とダブルクリック部分は解決済みですが、ダブルクリックするStringJTextAreaその部分だけStringが選択されます。(私は使用してJTextArea.getSelectedText()います)。

私が望むのは、全体Stringが選択され、String. 一部のムービー ファイルの名前が似ていて、間違ったファイルが開かれるため、これを行う必要があります。

選択を行全体に拡張できる方法が既に実装されていますか? 問題を Google で検索しようとしましたが、テキスト行全体を選択するものはありません。

例: http://i47.tinypic.com/wvol6a.png


ご意見をお寄せいただきありがとうございます。JTextArea について不明確で申し訳ありませんでした。JTextArea は必須でした。

これで問題の解決策が見つかりました。Hovercraft Full Of Eels に感謝します。

4

5 に答える 5

4

あなたの最善の策は、上記の多くの人が推奨しているように JList を使用することです。JTextArea を使用する必要がある場合は、これを行うことができますが、JTextArea のviewToModel(Point p)メソッドを使用して、マウス プレス位置の Point をテキスト内のオフセット位置に変換する必要があります。その後、javax.swing.text.Utilities クラスの静的ユーティリティ メソッドを使用して、選択した行の開始と終了を見つけることができますgetRowStart(...)getRowEnd(...)たとえば、私の SSCCE:

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;

import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.text.BadLocationException;
import javax.swing.text.Utilities;

public class GetLineFromTextArea {
   private static final int MIN_CHARS = 4;
   private static final int MAX_CHARS = 8;
   private static final int WORDS_PER_LINE = 10;
   private static final int ROWS = 30;

   public static void main(String[] args) {
      Random random = new Random();
      final JTextArea textArea = new JTextArea(20, 50);
      JScrollPane scrollpane = new JScrollPane(textArea);
      StringBuilder sb = new StringBuilder();

      for (int row = 0; row < ROWS ; row++) {
         sb = new StringBuilder();
         for (int words = 0; words < WORDS_PER_LINE; words++) {
            int maxChars = random.nextInt(MAX_CHARS - MIN_CHARS) + MIN_CHARS;
            for (int charsPerWord = 0; charsPerWord < maxChars; charsPerWord++) {
               char c = (char) (random.nextInt('z' - 'a' + 1) + 'a');
               sb.append(c);
            }
            sb.append(" ");
         }
         textArea.append(sb.toString() + "\n");
      }

      textArea.addMouseListener(new MouseAdapter() {
         @Override
         public void mouseClicked(MouseEvent e) {
            if (e.getButton() != MouseEvent.BUTTON1) {
               return;
            }
            if (e.getClickCount() != 2) {
               return;
            }

            int offset = textArea.viewToModel(e.getPoint());

            try {
               int rowStart = Utilities.getRowStart(textArea, offset);
               int rowEnd = Utilities.getRowEnd(textArea, offset);
               String selectedLine = textArea.getText().substring(rowStart, rowEnd);
               System.out.println(selectedLine);

            } catch (BadLocationException e1) {
               e1.printStackTrace();
            }

         }
      });


      JOptionPane.showMessageDialog(null, scrollpane);
   }
}
于 2013-01-12T21:14:46.160 に答える
3

JTextArea の代わりに JList を使用することを検討してください。JList を使用すると、セットから要素を選択できます。したがって、このセットに必要な文字列を入力するだけで、ユーザーに選択させることができます。

于 2013-01-12T20:53:51.897 に答える
2

あなたのニーズには JList の方が適していると思います。

簡単な例: http://www.cs.cf.ac.uk/Dave/HCI/HCI_Handout_CALLER/node143.html

それとも、JTextArea を使用する必要がありますか?

于 2013-01-12T20:53:16.277 に答える
1

基本的に、その JTextArea から行を抽出する必要があります。ただし、ユースケースにより適したコンポーネントに切り替えることをお勧めします: http://docs.oracle.com/javase/6/docs/api/javax/swing/JList.html

とにかく、次のような簡単で汚いハックを試すことができます。

public static String getLineOfSelectionStart(JTextArea textArea) {
    String contents = textArea.getText();
    int selStart = textArea.getSelectionStart();

    if (selStart >= 0) {
        int selEnd = selStart; // don't use getSelectionEnd(), since one
                                // could select multiple lines;

        while (selStart > 0) {
            switch (contents.charAt(selStart)) {
            case '\r':
            case '\n':
                break;
            default:
                --selStart;
                continue;
            }
            break;
        }
        while (selEnd < contents.length()) {
            switch (contents.charAt(selEnd)) {
            case '\r':
            case '\n':
                break;
            default:
                ++selEnd;
                continue;
            }
            break;
        }

        return contents.substring(selStart, selEnd);
    }
    return null;
}

しかし、実際には、大量のファイルを一覧表示するときに String をいじっていても、うまく機能しません。

于 2013-01-12T21:15:12.150 に答える
0

JList を使用し、選択したオプションを取得するには、getSelectedIndex()を使用してインデックスを取得するか、 を使用しgetSelectedValue()て値を取得します。

ここを参照してください: getSelectedIndex() メソッドを参照してください

于 2013-01-12T21:01:34.730 に答える