6

我有一个 JFrame,它显示存储在我的计算机上的当前电影。它将文件的名称显示为Strings 中的JTextArea.

我想要做的是双击一个特定的String(它代表我计算机上的一个实际文件)并且该文件将被打开。

打开部分和双击部分已经解决了,但是当我双击时String,我JTextArea只会选择其中的一部分String。(我正在使用JTextArea.getSelectedText())。

我想要的是整个String被选中并且我可以检索String. 我需要这样做,因为我的一些电影文件具有相似的名称,并且会打开错误的文件。

是否有任何已经实现的方法可以将选择扩展到整行?我试过用谷歌搜索这个问题,但没有任何东西会选择整行文本。

一个例子:http: //i47.tinypic.com/wvol6a.png


谢谢大家的意见,很抱歉我不清楚 JTextArea,JTextArea 是强制性的。

我现在有了解决问题的方法,为此我感谢充满鳗鱼的气垫船。

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

考虑使用 JList 而不是 JTextArea。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

无论如何,您可以尝试像这样快速而肮脏的 hack:

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 回答