2014-02-10 66 views
1

我想通過Jframe中的JButton刪除單行。 但我不知道怎麼... 我試過媒體鏈接:通過TextArea中的JButton刪除單行

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

但它不工作... 我欣賞每一個怎樣的幫助:)) 或任何knews解決這個問題的另一種方法?

+0

這隻會計數變量的值。你忘了粘貼一些代碼? – OlivierLi

+0

我不這麼認爲......並且我不知道如何修復該程序:P 它也顯示了get line,但我不確定它是如何工作的 – user3272186

+0

定義「line」 - 這是一條物理線路,用「\ n」分隔,新行或文本行出現在文本區域中? – MadProgrammer

回答

1

您需要使用GetText()來獲取TextArea中的內容,然後刪除該行。一旦你修改了文本,你可以使用SetText()重新放回。

當然,這可以在一行中完成,但分離步驟有助於易讀性。

+0

它幾乎可以正常工作,但我想刪除一行,並且不能使用getText(),因爲如果您有 兩件事在該地區: asdf1 asdf2 您可以將文本設置爲(「」) 但比不僅asdf1是越來越刪除,但也asdf2 對不起我的英語不好而難過偷你的時間:d – user3272186

+0

在你舉例asdf1和asdf2在同一行上。如果你只想擺脫一個你可以使用String.split()來分離它們。有關詳細信息,請參閱http://stackoverflow.com/questions/3481828/how-to-split-a-string-in-java。 – OlivierLi

+0

別擔心,你不是在偷我的時間。如果您覺得我的答案解決了您的問題,您可以使用複選標記來接受它。這將足夠支付! – OlivierLi

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