您好以下代码是一个带有一些实用程序的文本编辑器,但是我无法找出为什么我的doPre()方法找不到我搜索的上一个单词,就像找到下一个的doNext()方法一样我搜索过的单词。有什么不对,所以它会正常工作?提前谢谢!
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class MyEditor extends JFrame {
public MyEditor() {
super("MyEditor");
initComponents();
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
private void initComponents() {
p = new JPanel(new BorderLayout());
ta = new JTextArea(10, 50);
sc = new JScrollPane(ta);
p.add(sc);
tb = new JToolBar();
tb.setFloatable(false);
newButton = new JButton("new");
newButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
doNew();
}
});
newButton.setToolTipText("New file...");
newButton.setIcon(new ImageIcon(getClass().getResource("/images/New16.png")));
openButton = new JButton("open");
openButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
doOpen();
}
});
openButton.setToolTipText("Open a file...");
openButton.setIcon(new ImageIcon(getClass().getResource("/images/Open16.gif")));
saveButton = new JButton("save");
saveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
doSave();
}
});
saveButton.setToolTipText("Save a file...");
saveButton.setIcon(new ImageIcon(getClass().getResource("/images/Save16.gif")));
findButton = new JButton("find");
findButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
doFind();
}
});
findButton.setToolTipText("Find...");
findButton.setIcon(new ImageIcon(getClass().getResource("/images/Search16.png")));
nextButton = new JButton("next");
nextButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
doNext();
}
});
nextButton.setToolTipText("Next...");
nextButton.setEnabled(false);
previousButton = new JButton("pre");
previousButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
doPre();
}
});
previousButton.setToolTipText("P...");
previousButton.setEnabled(true);
aboutButton = new JButton("about");
aboutButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
doAbout();
}
});
aboutButton.setToolTipText("About...");
aboutButton.setIcon(new ImageIcon(getClass().getResource("/images/Info16.png")));
tb.add(newButton);
tb.add(openButton);
tb.add(saveButton);
tb.add(findButton);
tb.add(nextButton);
tb.add(previousButton);
tb.add(aboutButton);
p.add(tb, BorderLayout.NORTH);
add(p);
fc = new JFileChooser();
pack();
}
private void doOpen() {
fc.showOpenDialog(this);
theFile = fc.getSelectedFile();
if (theFile == null) {
return;
}
ta.setText(null);
FileReader myFile = null;
BufferedReader buff = null;
try {
myFile = new FileReader(theFile);
buff = new BufferedReader(myFile);
while (true) {
String line = buff.readLine();
if (line == null) { //EOF
break;
}
ta.append(line + "\n");
}
} catch (IOException e) {
System.out.println(e.getMessage());
} finally {
try {
if (buff != null) {
buff.close();
}
if (myFile != null) {
myFile.close();
}
} catch (IOException e1) {
System.out.println(e1.getMessage());
}
}
}
private void doSave() {
fc.showSaveDialog(this);
theFile = fc.getSelectedFile();
if (theFile == null) {
return;
}
FileWriter myFile = null;
BufferedWriter buff = null;
try {
myFile = new FileWriter(theFile);
buff = new BufferedWriter(myFile);
buff.write(ta.getText());
System.out.println("File writing is complete");
} catch (IOException e) {
System.out.println(e.getMessage());
} finally {
try {
if (buff != null) {
buff.flush();
buff.close();
}
if (myFile != null) {
myFile.close();
}
} catch (IOException e1) {
System.out.println(e1.getMessage());
}
}
}
private void doNew() {
ta.setText(null);
}
private void doFind() {
findString = JOptionPane.showInputDialog(this, "Find What", "Find", JOptionPane.INFORMATION_MESSAGE);
ta.requestFocusInWindow();
if (findString != null && findString.length() > 0) {
String txt = ta.getText();
int findLength = findString.length();
findLocation = txt.indexOf(findString);
if (findLocation > -1) {
ta.setCaretPosition(findLocation);
ta.moveCaretPosition(findLocation + findLength);
ta.getCaret().setSelectionVisible(true);
nextButton.setEnabled(true);
}
}
}
private void doNext() {
String txt = ta.getText();
int findLength = findString.length();
if (findLocation > -1) {
findLocation = txt.indexOf(findString, findLocation + 1);
if (findLocation > -1) {
ta.setCaretPosition(findLocation);
ta.moveCaretPosition(findLocation + findLength);
ta.getCaret().setSelectionVisible(true);
} else {
nextButton.setEnabled(false);
}
}
}
private void doPre() {
String txt = ta.getText();
int findLength = findString.length();
if (findLocation > -1) {
findLocation = txt.indexOf(findString, (findLocation-1) + 1);
if (findLocation > -1) {
ta.setCaretPosition(findLocation);
ta.moveCaretPosition((findLocation-(findLocation+1)) + findLength +1);
ta.getCaret().setSelectionVisible(true);
} else {
nextButton.setEnabled(false);
}
}
private void doAbout() {
JOptionPane.showMessageDialog(this, "TEI Java Editor\nSummer Semester 2015", "About", JOptionPane.INFORMATION_MESSAGE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new MyEditor().setVisible(true);
}
});
}
private JPanel p;
private JTextArea ta;
private JScrollPane sc;
private JToolBar tb;
private JButton newButton, openButton, saveButton, findButton, aboutButton, nextButton, previousButton;
private JFileChooser fc;
private File theFile;
private String findString;
private int findLocation;
}
到目前为止,我设法让它转到上一个词,但我无法弄清楚如何让它成为最佳。例如,如果我们在文本编辑器中得到相同单词的4倍,如:
findLocation
findLocation
findLocation
findLocation
并且我当前状态标记了它将跳跃并标记第二个单词的第三个单词,如果我再次按下前一个按钮它就不会跳跃并标记第一个单词。任何想法?
private void doPre() {
String txt = ta.getText();
int findLength = findString.length();
if (findLocation > -1) {
findLocation = txt.lastIndexOf(findString, findLocation + 1);
if (findLocation > -1) {
ta.setCaretPosition(findLocation);
ta.moveCaretPosition(findLocation - findLength - 1);
ta.getCaret().setSelectionVisible(true);
} else {
previousButton.setEnabled(false);
}
}
答案 0 :(得分:4)
我注意到你的doPre方法中有这个
findLocation = txt.indexOf(findString, (findLocation-1) + 1);
如果你减去一个再添加一个,似乎findLocation将完全相同。尝试取出+1;
findLocation = txt.indexOf(findString, findLocation - 1);
这一行也是一样的:
ta.moveCaretPosition((findLocation-(findLocation+1)) + findLength +1);
在这里,findLocation - findLocation + 1
只会给你1,这是多余的。
答案 1 :(得分:1)
我不知道它是什么意思“无法正常工作” 只有我看到的是:
ta.moveCaretPosition((findLocation-(findLocation+1))+findLength+1);
简化:
( findLocation - ( findLocation + 1 ) ) + findLength +1
为:
( findLocation - findLocation - 1) + findLength + 1 =
( -1 ) + findLength + 1 =
findLength
所以这意味着:
ta.moveCaretPosition(findLength);