我想通过Jframe中的JButton删除一行。 但我不知道怎么...... 我已经尝试过了:
public void button1_ActionPerformed(ActionEvent evt) {
int count = 1;
count = TextArea1.getLineCount();
但它不起作用...... 我感谢各种帮助:)) 或者任何人都知道另一种方法来解决这个问题?
答案 0 :(得分:1)
您需要使用GetText()来获取TextArea中已有的内容,然后删除该行。修改完文本后,可以使用SetText()将其恢复。
当然这可以在一行中完成,但分离步骤有助于提高可读性。
答案 1 :(得分:1)
答案取决于“线”的定义。例如,如果您使用包装JTextArea
,其中一条连续的文本行环绕视图,则可以将一行视为从视图的一侧到另一侧的文本。
在这种情况下,您需要深入研究模型并根据视图计算文本的偏移量,并基本上删除两点之间的内容,例如......
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.Element;
import javax.swing.text.JTextComponent;
import javax.swing.text.Utilities;
public class TestDeleteLine {
public static void main(String[] args) {
new TestDeleteLine();
}
private JTextArea ta;
public TestDeleteLine() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
ta = new JTextArea(20, 40);
ta.setWrapStyleWord(true);
ta.setLineWrap(true);
JButton deleteLine = new JButton("Delete current line");
deleteLine.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
int offset = ta.getCaretPosition();
int rowStart = Utilities.getRowStart(ta, offset);
int rowEnd = Utilities.getRowEnd(ta, offset);
Document document = ta.getDocument();
int len = rowEnd - rowStart + 1;
if (rowStart + len > document.getLength()) {
len--;
}
String text = document.getText(rowStart, len);
document.remove(rowStart, len);
} catch (BadLocationException ex) {
ex.printStackTrace();
}
}
});
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new JScrollPane(ta));
frame.add(deleteLine, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
现在,如果您不关心换行并且想要删除整行(从一个新行到另一行),您可以使用...
public int getLineByOffset(int offset) throws BadLocationException {
Document doc = ta.getDocument();
if (offset < 0) {
throw new BadLocationException("Can't translate offset to line", -1);
} else if (offset > doc.getLength()) {
throw new BadLocationException("Can't translate offset to line", doc.getLength() + 1);
} else {
Element map = doc.getDefaultRootElement();
return map.getElementIndex(offset);
}
}
public int getLineStartOffset(int line) throws BadLocationException {
Element map = ta.getDocument().getDefaultRootElement();
if (line < 0) {
throw new BadLocationException("Negative line", -1);
} else if (line >= map.getElementCount()) {
throw new BadLocationException("No such line", ta.getDocument().getLength() + 1);
} else {
Element lineElem = map.getElement(line);
return lineElem.getStartOffset();
}
}
public int getLineEndOffset(int line) throws BadLocationException {
Element map = ta.getDocument().getDefaultRootElement();
if (line < 0) {
throw new BadLocationException("Negative line", -1);
} else if (line >= map.getElementCount()) {
throw new BadLocationException("No such line", ta.getDocument().getLength() + 1);
} else {
Element lineElem = map.getElement(line);
return lineElem.getEndOffset();
}
}
public int[] getLineOffsets(int line) throws BadLocationException {
int[] offsest = new int[2];
offsest[0] = getLineStartOffset(line);
offsest[1] = getLineEndOffset(line);
return offsest;
}
要计算行的开始和结束位置,请计算文本的长度并将其从Document
中移除,这可能看起来更像......
int offset = ta.getCaretPosition();
int line = getLineByOffset(offset);
int[] lineOffsets = getLineOffsets(line);
int len = lineOffsets[1] - lineOffsets[0] - 1;
Document document = ta.getDocument();
String text = document.getText(lineOffsets[0], len);
document.remove(lineOffsets[0], len);