[RESOLVIDO] source code e swing

6 respostas
zerokelvin

salve pessoal!

não sei qual (j avançado ou inteface grafica ) seria o melhor forum pra postar… mas vai nese.

Tenho o stacktrace abaixo lançado qdo digito apenas uma letra num jcombobox com autocomplete… ele funcionava normalmente, mas agora lanças a exceção abaixo… e eu nao consigo encontrar (nao sei se existe pra baixar) o source code do swing, pra eu ver se corrijo o problema…

Exception in thread AWT-EventQueue-0 java.lang.IllegalArgumentException: bad position: 54

at javax.swing.text.JTextComponent.moveCaretPosition(JTextComponent.java:1523)

at org.jdesktop.swingx.autocomplete.AbstractAutoCompleteAdaptor.markText(AbstractAutoCompleteAdaptor.java:116)

at org.jdesktop.swingx.autocomplete.AutoCompleteDocument.insertString(AutoCompleteDocument.java:272)

at javax.swing.text.JTextComponent.setText(JTextComponent.java:1697)

at com.seaglasslookandfeel.ui.SeaGlassComboBoxUI$SynthComboBoxEditor.setItem(SeaGlassComboBoxUI.java:514)

at javax.swing.JComboBox.configureEditor(JComboBox.java:1383)

at javax.swing.plaf.basic.BasicComboBoxUI$Handler.contentsChanged(BasicComboBoxUI.java:1817)

at javax.swing.AbstractListModel.fireContentsChanged(AbstractListModel.java:100)

at javax.swing.DefaultComboBoxModel.setSelectedItem(DefaultComboBoxModel.java:88)

at javax.swing.JComboBox.setSelectedItem(JComboBox.java:557)

at org.jdesktop.swingx.autocomplete.ComboBoxAdaptor.setSelectedItem(ComboBoxAdaptor.java:101)

at org.jdesktop.swingx.autocomplete.AutoCompleteDocument.setSelectedItem(AutoCompleteDocument.java:297)

at org.jdesktop.swingx.autocomplete.AutoCompleteDocument.insertString(AutoCompleteDocument.java:252)

at org.jdesktop.swingx.autocomplete.AutoCompleteDocument.insertString(AutoCompleteDocument.java:248)

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

at javax.swing.text.DefaultEditorKit$DefaultKeyTypedAction.actionPerformed(DefaultEditorKit.java:859)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:644)

at java.awt.EventQueue.access$000(EventQueue.java:85)

at java.awt.EventQueue$1.run(EventQueue.java:603)

at java.awt.EventQueue$1.run(EventQueue.java:601)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)

at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)

at java.awt.EventQueue$2.run(EventQueue.java:617)

at java.awt.EventQueue$2.run(EventQueue.java:615)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)

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

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

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

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

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

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

at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Exception in thread AWT-EventQueue-0 java.lang.IllegalArgumentException: bad position: 2

at javax.swing.text.JTextComponent.moveCaretPosition(JTextComponent.java:1523)

at org.jdesktop.swingx.autocomplete.AbstractAutoCompleteAdaptor.markText(AbstractAutoCompleteAdaptor.java:116)

at org.jdesktop.swingx.autocomplete.AutoCompleteDocument.insertString(AutoCompleteDocument.java:272)

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

at javax.swing.text.DefaultEditorKit$DefaultKeyTypedAction.actionPerformed(DefaultEditorKit.java:859)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:644)

at java.awt.EventQueue.access$000(EventQueue.java:85)

at java.awt.EventQueue$1.run(EventQueue.java:603)

at java.awt.EventQueue$1.run(EventQueue.java:601)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)

at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)

at java.awt.EventQueue$2.run(EventQueue.java:617)

at java.awt.EventQueue$2.run(EventQueue.java:615)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)

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

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

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

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

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

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

at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Não sei onde ele tenta jogar o cursos nessas posições… o engraçado é q no stack nao tem nenhuma classe de código meu…

alguma luz?

6 Respostas

prog.tiago

Bom dia,

cara, posta seu código para tentarmos te ajudar.

zerokelvin
package exib;


   import java.awt.*;  
   import java.awt.Color;
   import java.awt.event.*;  
   import java.awt.event.FocusEvent;  
   import java.awt.event.FocusListener; 
   import java.math.BigInteger;
   

   import java.util.Collection;  
   import java.util.Vector;  
   import java.util.*;
   import javax.swing.*;
   import javax.swing.border.*;
   import javax.swing.ComboBoxModel;  
   import javax.swing.JComboBox;  
   import javax.swing.UIManager;  
   import javax.swing.text.JTextComponent;  
   import org.jdesktop.swingx.autocomplete.AutoCompleteDecorator; 
   
	 
   public class AutoCombo extends JComboBox  
   {  
   
   	
      public AutoCombo()  
      {  
         super();  
         initialize(false);  
      }  
   
      public AutoCombo(ComboBoxModel aModel)  
      {  
         super(aModel);  
         initialize(false);  
      }  
     
      public AutoCombo(Object... items)  
      {  
         super(items);  
         initialize(false);  
      }  
   
      public AutoCombo(Collection< ? > items)  
      {  
      
         super(new Vector<Object>(items));  
         initialize(false);  
      }  
   
      public AutoCombo(boolean editable)  
      {  
         super();  
         initialize(editable);  
      }  
   
      public AutoCombo(ComboBoxModel aModel, boolean editable)  
      {  
         super(aModel);  
         initialize(editable);  
      }  
   
      public AutoCombo(Collection< ? > items, boolean editable)  
      {  
     
        
         super(new Vector<Object>(items));
         initialize(editable);  	
      	
      }  
   
   
   
      public void initialize(boolean editable)  
      {  
         setEditable(true);  
      
         AutoCompleteDecorator.decorate(this);  
         final Color gray = getBackground();
          
         final Color green = UIManager.getColor("ComboBox.selectionBackground");  
         // final Color selection = ((JTextComponent)  
         // getEditor().getEditorComponent()).getSelectionColor();  
      
         //getEditor().getEditorComponent().setBackground(gray); 
         getEditor().getEditorComponent().setBackground(Color.WHITE); 
         ((JTextComponent) getEditor().getEditorComponent()).setSelectionColor(gray);  
         ((JTextComponent) getEditor().getEditorComponent()).setCaretColor(Color.BLACK);  
         ((JTextComponent) getEditor().getEditorComponent()).setForeground(((JTextComponent) getEditor().getEditorComponent()).getSelectedTextColor());  
      
         getEditor().getEditorComponent().addFocusListener(
               new FocusListener()  
               {  
                  public void focusGained(FocusEvent e)  
                  {  
                     getEditor().getEditorComponent().setBackground(green);  
                     ((JTextComponent) getEditor().getEditorComponent()).setSelectionColor(green);  
                  }  
               
                  public void focusLost(FocusEvent e)  
                  {  
                     getEditor().getEditorComponent().setBackground(gray);  
                     ((JTextComponent) getEditor().getEditorComponent()).setSelectionColor(gray);  
                  }  
               });  
      }  
   
      @Override  
       public void setEnabled(boolean b)  
      {  
         super.setEnabled(b);  
         getEditor().getEditorComponent().setBackground(getBackground());  
      } 
    
      public int getID(int index)  
      {  
         return 1;
      } 
   
   
   
   }
fabiofalci

Esse código você encontra dentro da pasta do JDK, o arquivo src.zip.

Mas veja que têm envolvido outras libs, como
com.seaglasslookandfeel.ui
org.jdesktop.swingx

Aposto que o problema é nesse look and feel.

zerokelvin

Então cara, se nao me engano é. Há mto tempo tive um promblema parecido, tive q reescrever um metodo do seaglass… mas não me lembro qual foi, e o jar editado do seaglass é o mesmo q estou usando… acho q é alguma atualização… sei lá… queria rever a sequencia dos metodos.

Valeu pela ajuda, nao sabia dessa da src.jar… vou fuçar aque, posto solução ou dúvida depois…

fabiofalci

E pq não contribui com o projeto?
Mostra essa modifcação para os cara, talvez você tenha corrigido um bug para eles.

zerokelvin

Resolvido…

  1. o problema não era no meu código, pq mesmo qdo eu instanciava um JComboBox simples, apenas autocompletável pela classe do swing, ele dava pau. O bug aparece na interface quando vc tenta digitar, vc só consegue digitar uma tecla, dae o jcombo trava e nao deixa mais vc digitar nada, em apagar… fica apenas uma letra.

  2. o problema nao era no seaglass, pq quando nao utilizado o problema era o mesmo, mas com uma stack um pouco menor;

  3. o problema é NA classe do decorator, dentro do swing. Pode ser corrigido da seguinte forma: copie a classe do ViniGodoy nesse link AutoCompleteDecorator,

  4. compile, mas vai faltar a classe AquaLnFPopupLocationFix$1. Realmente, não achei no swing atual, nem no link do vinigodoy, pq acho q está desatualizado. Mas esta classe tem no pacote antigo do swing, "swingx-2007_10_07 " q pode ser baixado do arquivo da sun.

  5. Jogue essa AquaLnFPopupLocationFix pra dentro da swingx.org.jdesktop.swingx.autocomplete.workarounds, depois compile a AutoCompleteDecorator;

5.jogue o arq compilado dentro do jar do swing, no mesmo lugar da antiga classe, que é swingx.org.jdesktop.swingx.autocomplete.AutoCompleteDecorator.

Pronto, tá resolvida a zica do auto complete… Escrevi esse manual pq tive esse mesmo problema ha cerca de um ano… com as atualiazções do java, acho q perdi alguma classe ou pacote… To escrevendo também pra mim, q so uma besta, e daqui a 6 meses vo estar atras dessa solução de novo!

valeu a ajuda

Criado 10 de março de 2011
Ultima resposta 10 de mar. de 2011
Respostas 6
Participantes 3