Limpar uma JTextArea . dá sempre erro

9 respostas
F

Ola!
Estou a escrever um programa que usa uma JTextArea onde se escreve e quando se clica no enter, supostamente apaga tudo mas da-me sempre um erro. Em baixo vai um exemplo de como eu uso isto.
Eu já tentei :
writeArea.replaceRange("",0,doc.getLength());
writeArea.setText("");
doc.remove(0,doc.getLength());
VER LINHA 74
Não consigo pensar em mais nada para resolver o problema!

Alguem me pode ajudar por favor? Obrigado

import java.awt.event.*;
import javax.swing.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;



public class exemplo extends JPanel implements DocumentListener, KeyListener 
{

	
	public int lastPos=0;
	public static String text="";
	public static boolean enterPressed=false;
    
    public static JPanel leftPane;
    public static JPanel rightPane;
    public static JPanel mainPane;
    	
    public JTextArea chatArea, writeArea;
       	
	 	
    public exemplo() 
     {	
     	setLayout(new BorderLayout()); 

        chatArea = new JTextArea("");  	
        chatArea.setEditable(false); 														  
        chatArea.setLineWrap(true);				
        chatArea.setWrapStyleWord(true);	
        	
        
        JScrollPane areaScrollPane = new JScrollPane(chatArea);
        areaScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
        areaScrollPane.setPreferredSize(new Dimension(550, 400)); 
        areaScrollPane.setBorder(BorderFactory.createCompoundBorder( 
                                BorderFactory.createEmptyBorder(5,5,5,5),      
                                areaScrollPane.getBorder()));
                                  
        writeArea = new JTextArea("");  	
        writeArea.setEditable(true); 														  
        writeArea.setFont(new Font("Arial", Font.PLAIN, 11)); 
        writeArea.setLineWrap(true);				
        writeArea.setWrapStyleWord(true);	
        writeArea.getDocument().addDocumentListener(this); // adds DocumentListener
        writeArea.getDocument().putProperty("name", "You");	
        writeArea.addKeyListener(this);
        
        JScrollPane writeScrollPane = new JScrollPane(writeArea);
        writeScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
        writeScrollPane.setPreferredSize(new Dimension(550, 100)); 
        writeScrollPane.setBorder(BorderFactory.createCompoundBorder( 
                                BorderFactory.createEmptyBorder(5,5,5,5),      
                                writeScrollPane.getBorder()));
        
        mainPane = new JPanel(new BorderLayout());
        mainPane.add(areaScrollPane,BorderLayout.PAGE_START);
        mainPane.add(writeScrollPane,BorderLayout.CENTER);

     }

	public void insertUpdate(DocumentEvent e)  
	{	
		try {
			Document doc = (Document)e.getDocument();
			text = doc.getText(0,doc.getLength());
			lastPos+=1;
				if(enterPressed)
				{
				chatArea.append("You: " + text);
    			chatArea.setCaretPosition(chatArea.getDocument().getLength());	 			
				writeArea.replaceRange("",0,doc.getLength()); // AQUI ESTÁ O PROBLEMA		
				lastPos=0;
		        text="";		       
				}
			}
		catch (BadLocationException ble) {
					ble.printStackTrace();
				}
		
		/*chatArea.setText("");
            writeArea.setText("");
            writeArea.requestFocusInWindow();*/
    }
    public void removeUpdate(DocumentEvent e) 
    {
    }
	public void changedUpdate(DocumentEvent e) 
	{
    }
    public void keyTyped(KeyEvent e)
    { 	    	     
    }
    public void keyPressed(KeyEvent e) 
    {   		
    	int keyCode = e.getKeyCode();
    	if (keyCode==10)
    		enterPressed=true;
    	else
    		enterPressed=false;			
    }
    public void keyReleased(KeyEvent e) 
    {
    }
   
	private static void CreateAndShowGUI() 
    {
    	JFrame f = new JFrame ("Cliente");
	 	f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	 	
	 	f.add(new exemplo());
	 	f.add(mainPane);

	 	f.pack();
        f.setVisible(true);
    }
    
    
	public static void main (String[] args) 
	{	
       CreateAndShowGUI();
    }
}

9 Respostas

lordtiago

Qual erro ele retorna?

F
Durante o run, eu escrevo qualquer coisa e assim que  eu carrego no enter aparece isto: ( que eu não sei interpretar )

Exception in thread AWT-EventQueue-0 java.lang.IllegalStateException: Attempt to mutate in notification

at javax.swing.text.AbstractDocument.writeLock(AbstractDocument.java:1323)

at javax.swing.text.AbstractDocument.replace(AbstractDocument.java:644)

at javax.swing.JTextArea.replaceRange(JTextArea.java:502)

at exemplo.insertUpdate(exemplo.java:74)

at javax.swing.text.AbstractDocument.fireInsertUpdate(AbstractDocument.java:185)

at javax.swing.text.AbstractDocument.handleInsertString(AbstractDocument.java:734)

at javax.swing.text.AbstractDocument.insertString(AbstractDocument.java:693)

at javax.swing.text.PlainDocument.insertString(PlainDocument.java:114)

at javax.swing.text.AbstractDocument.replace(AbstractDocument.java:655)

at javax.swing.text.JTextComponent.replaceSelection(JTextComponent.java:1351)

at javax.swing.text.DefaultEditorKit$InsertBreakAction.actionPerformed(DefaultEditorKit.java:952)

at javax.swing.plaf.basic.BasicTextUI$TextActionWrapper.actionPerformed(BasicTextUI.java:2065)

at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1636)

at javax.swing.JComponent.processKeyBinding(JComponent.java:2849)

at javax.swing.JComponent.processKeyBindings(JComponent.java:2884)

at javax.swing.JComponent.processKeyEvent(JComponent.java:2812)

at java.awt.Component.processEvent(Component.java:5818)

at java.awt.Container.processEvent(Container.java:2058)

at java.awt.Component.dispatchEventImpl(Component.java:4413)

at java.awt.Container.dispatchEventImpl(Container.java:2116)

at java.awt.Component.dispatchEvent(Component.java:4243)

at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848)

at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:697)

at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:962)

at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:834)

at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:661)

at java.awt.Component.dispatchEventImpl(Component.java:4285)

at java.awt.Container.dispatchEventImpl(Container.java:2116)

at java.awt.Window.dispatchEventImpl(Window.java:2440)

at java.awt.Component.dispatchEvent(Component.java:4243)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
ambuzr

É meu crú mas só isso é suficiente para limpá-lo

No lugar disso tudo

writeArea.replaceRange("",0,doc.getLength()); writeArea.setText(""); doc.remove(0,doc.getLength());

Coloque so isso

seuObjetoJTextArea.setText("");
lordtiago

Se não funcionar, tenta criar um evento que ouve a tecla enter, e quando ela for precionada ele simplesmente faz um getText(), e vc pega o texto. E em seguida limpa com um setText()

F

Mas eu não pus isso tudo :smiley:
Eu pus um de cada vez e nenhum resultou. Nem sequer o writeArea.setText();

Eu tenho quase a certeza de que é noutra situação isso funcionaria mas por alguma razão na hora de fazer run isto não está a funcionar

Obrigado

lordtiago

Modelei um exemplo aki, rode-o e veja se te ajuda brother:

package evento_enter;

import javax.swing.JOptionPane;
public class Teste extends javax.swing.JFrame {

    public Teste() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        keyboard = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        keyboard.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                keyboardKeyPressed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(39, 39, 39)
                .addComponent(keyboard, javax.swing.GroupLayout.PREFERRED_SIZE, 315, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(46, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(40, 40, 40)
                .addComponent(keyboard, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(232, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    private void keyboardKeyPressed(java.awt.event.KeyEvent evt) {
        if(evt.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER){
            JOptionPane.showMessageDialog(null, keyboard.getText());
            keyboard.setText("");
        } 
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Teste().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JTextField keyboard;
    // End of variables declaration

}
F
Eu fiz mais ou menos o que você disse:

No metodo keyPressed do KeyListener eu escrevi:

public void keyPressed(KeyEvent e)

{   		

int keyCode = e.getKeyCode();

if (keyCode==10)

{

enterPressed=true;

text=writeArea.getText();

writeArea.setText("");

chatArea.append("You: " + text);

chatArea.setCaretPosition(chatArea.getDocument().getLength());

}		

}

E DEU!!!
Mas agora eu fiquei sem perceber para que ser o documentListener

lordtiago

O código que te passei acima faz isso:

private void keyboardKeyPressed(java.awt.event.KeyEvent evt) { if(evt.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER){ JOptionPane.showMessageDialog(null, keyboard.getText()); keyboard.setText(""); } }

O Document Listener é usado quando se precisa por exemplo formatar o texto em tempo real.
Eu usei quando precisava converter de minusculas para maiusculas em tempo real.

Mas quando os eventos não resolvem, só aí apelamos para o DocumentListener =)

F

Peço desculpa. Escrevemos as mensagens ao mesmo tempo e eu publiquei a minha resposta antes de ler a sua :smiley:

Muito Obrigado!!

Criado 29 de agosto de 2011
Ultima resposta 30 de ago. de 2011
Respostas 9
Participantes 3