我有一个JFrame,显示存储在我的计算机上的当前电影。它会在String
中将文件名称显示为JTextArea
。
我想要做的是双击特定的String
(代表我计算机上的实际文件),该文件将被打开。
开口部分和双击部分已经解决,但当我双击String
中的JTextArea
时,只会选择String
的一部分。 (我正在使用JTextArea.getSelectedText()
)。
我想要的是选择了整个String
并且我可以检索String
。我需要这样做,因为我的一些电影文件有相似的名字,而且会打开错误的文件。
是否有任何已经实现的方法可以将选择范围扩展到整行?我试图谷歌问题,但没有任何东西会选择整行文字。
一个例子: http://i47.tinypic.com/wvol6a.png
感谢大家的投入,对不起我对JTextArea不清楚,JTextArea是强制性的。
我现在已经解决了我的问题,我感谢Hovercraft Full Of Eels。
答案 0 :(得分: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);
}
}
答案 1 :(得分:3)
考虑使用JList而不是JTextArea。 JList允许您从某些集合中选择一个元素。因此,您只需使用用户选择的任何字符串填充此集合。
答案 2 :(得分:2)
我认为JList更适合您的需求。
简单示例:http://www.cs.cf.ac.uk/Dave/HCI/HCI_Handout_CALLER/node143.html
或者是否需要使用JTextArea?
答案 3 :(得分: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会徘徊不会很好。
答案 4 :(得分:0)
使用JList并检索所选选项使用getSelectedIndex()
检索索引或使用getSelectedValue()
获取值。