[RESOLVIDO] source code e swing

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?

Bom dia,

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

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


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.

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…

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

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