通过TextArea中的JButton删除单个行

时间:2014-02-10 19:27:28

标签: java jframe textarea line jbutton

我想通过Jframe中的JButton删除一行。 但我不知道怎么...... 我已经尝试过了:

 public void button1_ActionPerformed(ActionEvent evt) {
int count = 1;
count = TextArea1.getLineCount();

但它不起作用...... 我感谢各种帮助:)) 或者任何人都知道另一种方法来解决这个问题?

2 个答案:

答案 0 :(得分:1)

您需要使用GetText()来获取TextArea中已有的内容,然后删除该行。修改完文本后,可以使用SetText()将其恢复。

当然这可以在一行中完成,但分离步骤有助于提高可读性。

答案 1 :(得分:1)

答案取决于“线”的定义。例如,如果您使用包装JTextArea,其中一条连续的文本行环绕视图,则可以将一行视为从视图的一侧到另一侧的文本。

在这种情况下,您需要深入研究模型并根据视图计算文本的偏移量,并基本上删除两点之间的内容,例如......

Remove Lines

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);