Swing JComboBox Einträge nach Tastendruck auswerten und aktualisieren

Thomas Lorenz

Bekanntes Mitglied
Servus Gemeinde,

meine ComboBox enthält viele Stichworte. Nun möchte ich, dass nach einem Tastendruck (Buchstabe) alle Stichworte,
die diesen Buchstaben enthalten im Model halten und die restlichen rausschmeißen.
Beim nächsten Tastendruck sollen beide Buchstaben in dem Stichwort vorkommen, ansonsten raus damit.

Und so weiter.
Das funktioniert soweit auch.

Ich habe das mit einem DefaultComboBoxModel gelöst. Die Einträge, die nicht mehr dem eingegebenen Wort entsprechen
fliegen raus.
ABER !!

Beim Löschen des letzten Buchstaben (wenn noch einer im Wort vorhanden ist) müsste ich ja auf das vorhergehende
Model zugreifen können.

Das habe ich mit einer ArrayList <DefaultComboBoxModel> probiert.
Aber es funzt nicht.

Java:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Vector;

import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class HelperClassFrame implements ActionListener ,ListSelectionListener, MouseListener, KeyListener{
    ArrayList <DefaultComboBoxModel> modelArray = new ArrayList<DefaultComboBoxModel>();
    int arrayCounter = 1;
    String input = "";
    JFrame 		frame 		= new JFrame("Hilfemenu");
    DefaultListModel 	stringModel		;
    Vector <Integer> index = new Vector<Integer>();		;
    JList 		list 		;
    JFrame 		main		;
    JScrollPane 	scr_list	;
    JButton 		bt_close 	= new JButton("zur Hauptansicht");
    DefaultComboBoxModel model		= new DefaultComboBoxModel();
    DefaultComboBoxModel modelTwo	= new DefaultComboBoxModel();
    String [] combo = new String [5];
    JComboBox		cb_test		= new JComboBox();
    JButton 		bt_help		= new JButton("Auswahl öffnen");
    JPanel 		panel 		= new JPanel();
    JPanel		panelSouth	= new JPanel();
    BorderLayout	box 		= new BorderLayout();
    SystemData _Sys 		= (SystemData)CollectionController.getObject("SystemData");
	PropertyData _Data		= (PropertyData)CollectionController.getObject("PropertyData");
	ErrorHelper _Error 		= (ErrorHelper)CollectionController.getObject("ErrorHelper");
	MainFrame _Main 		= (MainFrame)CollectionController.getObject("MainFrame");
	    
    
    public Container addComponentsToPane(){
	model.addElement( " ");

	model.addElement( "Motorrad");
	model.addElement( "Auto");
	model.addElement( "Schiff");
	model.addElement( "Lkw");
	model.addElement( "Mofa");
	model.addElement( "Spider");
	model.addElement( "Coupe");
	model.addElement( "Cabriolet");
	model.addElement( "VW");
	model.addElement( "Opel");
	model.addElement( "Skoda");
	model.addElement( "Fiat");
	model.addElement( "Lada");
	model.addElement( "Trabant");
	model.addElement( "Ford");
	model.addElement( "Kia");
	model.addElement( "Lexus");
	model.addElement( "Hummer");
	
	

	model.addElement(combo);
	cb_test.setModel(model);
	cb_test.addKeyListener(this);
	
        stringModel = new DefaultListModel();
        for (int i =0 ; i < _Data.getProgramHelp().size() ; i++){
  	      stringModel.addElement(_Data.getProgramHelp().get(i));
  	      index.addElement(_Data.getProgramHelpIndex().get(i));
  	      
  	}
       
        
        list = new JList(stringModel);
        list.addListSelectionListener(this);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        list.addMouseListener(this);
        scr_list = new JScrollPane(list);
        Container pane = frame.getContentPane();
        
        panel.setLayout(box);
        panel.setBorder(new EmptyBorder(20,20,20,20));
        panel.setBackground(_Sys.getBackground());
        
        panel.add(cb_test, BorderLayout.NORTH);
        
        panel.add(scr_list, BorderLayout.CENTER);
        
        panelSouth.setLayout(new FlowLayout());
        bt_close.setMnemonic('Z');
        bt_close.addActionListener(this);
        bt_help.addActionListener(this);
        panelSouth.add(bt_close);
        panelSouth.add(bt_help);
        panel.add(panelSouth, BorderLayout.SOUTH);
        pane.add(panel);
        return pane;
        
    }
    
    
   

    public void createAndShowGUI(JFrame Main) {
	      this.main = Main;     frame.setContentPane(addComponentsToPane());
      frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
      frame.setSize(400, 600);
      frame.setBackground(_Sys.getBackground());
      frame.setResizable(false);
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
     
    }
....




    @Override
    public void keyPressed(KeyEvent e) {
	modelArray.add(model);
	if(e.getKeyCode() > 64 &&
		e.getKeyCode() < 91 ){
	    input = input + e.getKeyChar();
	    
	    
	    checkModelData(input, modelArray.get(arrayCounter));
	    arrayCounter++;
		}
	if(e.getKeyCode() > 96 &&
		e.getKeyCode() < 123 ){
	    input = input + e.getKeyChar();
	    checkModelData(input, modelArray.get(arrayCounter));
	    arrayCounter++;
		}
	if(e.getKeyCode() == 8){
	    if(input.length()>0){
		input = input.substring(0, input.length()-1);
	    }
	    else {return;}
	    
	    
	    if(modelArray.size()>0){
		arrayCounter --;
		for(int z = arrayCounter; z < modelArray.size(); z++){
		    modelArray.remove(z);
		}
		
		
		checkModelData(input, modelArray.get(arrayCounter ));
		
	    }
	    else{
		checkModelData(input, modelArray.get(0));
	    }
	    
	}
	else { return;}
	
	
    }
    
    public void checkModelData(String input, DefaultComboBoxModel model){
	
	
	for(int i = 0; i < model.getSize(); i++){
	    if(model.getElementAt(i).toString().contains(input) ||
		    model.getElementAt(i).toString().startsWith(input) ||
		    model.getElementAt(i).toString().endsWith(input)){
		modelTwo.addElement(model.getElementAt(i));
	    }
	}
	model.removeAllElements();
	for(int p = 0; p < modelTwo.getSize(); p++){
	    model.addElement(modelTwo.getElementAt(p));
	}
	for(int o = 0; o< model.getSize(); o++){
		System.out.println("---"+model.getElementAt(o) + " ---ArrayIndex :" + modelArray.size());
		System.out.println("*********************************");
	}
	cb_test.setModel(model);
	modelTwo.removeAllElements();
    }




    @Override
    public void keyReleased(KeyEvent e) {
	// TODO Auto-generated method stub
	
    }




    @Override
    public void keyTyped(KeyEvent e) {
	// TODO Auto-generated method stub
	
    }
  }
 

Ebenius

Top Contributor
Mit mehreren Modellen würde ich da auf keinen Fall arbeiten. Ein Ansatz könnte so aussehen:
Java:
/* $Id$ */

/* Copyright 2010 Sebastian Haufe

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       [url]http://www.apache.org/licenses/LICENSE-2.0[/url]

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

package com.ebenius;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.*;

import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.JTextComponent;

public class AutoFilteringComboBoxTest {

  private static class AutoFilteringComboBoxModel extends AbstractListModel
    implements ComboBoxModel {

    private final String[] allValues;
    private List<String> matches = new ArrayList<String>();
    private String selected;

    AutoFilteringComboBoxModel(String[] values) {
      allValues = values.clone();
      matches.addAll(Arrays.asList(values));
    }

    public Object getSelectedItem() {
      return selected;
    }

    public void setSelectedItem(Object selected) {
      final String oldValue = this.selected;
      final String newValue = (String) selected;
      if (oldValue == null || newValue.startsWith(oldValue)) {
        // filter narrowed
        for (ListIterator<String> it = matches.listIterator(); it.hasNext();) {
          final String test = it.next();
          if (!test.startsWith(newValue)) {
            final int index = it.previousIndex();
            it.remove();
            fireIntervalRemoved(this, index, index);
          }
        }
      } else if (oldValue.startsWith(newValue)) {
        // filter widened
        for (int i = 0, j = 0; i < allValues.length; i++) {
          final String test = allValues[i];
          if (test.startsWith(newValue)) {
            if (matches.size() <= j || matches.get(j) != test) {
              matches.add(j, test);
              fireIntervalAdded(this, j, j);
            }
            j++;
          }
        }
      } else {
        // another change; complete rebuild
        final int oldSize = matches.size();
        if (oldSize != 0) {
          matches.clear();
          fireIntervalRemoved(this, 0, oldSize - 1);
        }
        for (final String test : allValues) {
          if (test.startsWith(newValue)) {
            matches.add(test);
          }
        }
        final int newSize = matches.size() - 1;
        if (newSize != 0) {
          fireIntervalAdded(this, newSize, newSize);
        }
      }
      this.selected = newValue;
      fireContentsChanged(this, -1, -1);
    }

    public Object getElementAt(int index) {
      return matches.get(index);
    }

    public int getSize() {
      return matches.size();
    }
  }

  /**
   * Test main method.
   * 
   * @param args ignored
   */
  public static void main(String[] args) {
    // create a cool combo box
    final String[] values =
          new String[] { "ABC", "ABD", "BBC", "BBD", "BBE" };
    final AutoFilteringComboBoxModel model =
          new AutoFilteringComboBoxModel(values);
    final JComboBox comboBox = new JComboBox(model);
    comboBox.setEditable(true);

    // change selected item on each model change in the text editor
    final ComboBoxEditor edi = comboBox.getEditor();
    final JTextComponent ediComp = (JTextComponent) edi.getEditorComponent();
    ediComp.getDocument().addDocumentListener(new DocumentListener() {

      private void setSelectedItem() {
        SwingUtilities.invokeLater(new Runnable() {

          public void run() {
            final int oldItemCount = comboBox.getItemCount();
            comboBox.setSelectedItem(edi.getItem());
            final int newItemCount = comboBox.getItemCount();
            final int maxRowCount = comboBox.getMaximumRowCount();
            if (comboBox.isPopupVisible()
                  && oldItemCount != newItemCount
                  && Math.min(oldItemCount, newItemCount) < maxRowCount) {
              comboBox.setMaximumRowCount(1);
              comboBox.setMaximumRowCount(maxRowCount);
            }
          }
        });
      }

      public void changedUpdate(DocumentEvent e) {
        setSelectedItem();
      }

      public void insertUpdate(DocumentEvent e) {
        setSelectedItem();
      }

      public void removeUpdate(DocumentEvent e) {
        setSelectedItem();
      }
    });

    final JFrame f = new JFrame("Test Frame: AutoFilteringComboBoxTest"); //$NON-NLS-1$
    final JPanel contentPane = new JPanel(new BorderLayout(6, 6));
    contentPane.add(comboBox);
    f.setContentPane(contentPane);
    f.setSize(new Dimension(200, 50));
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setVisible(true);
  }
}
Vielleicht nützt's Dir ja was. :)

Ebenius
 

Thomas Lorenz

Bekanntes Mitglied
Zunächst ein Danke an Ebenius.

Aber ich brauche das ganze für eine nicht editierbare ComboBox.
Ich habe das mit Deinem Vorschlag propiert, aber wenn ich die ComboBox auf nicht editierbar setzte,
funktioniert nichts mehr.
 

Ebenius

Top Contributor
Ich finde das Verhalten zwar seltsam, aber so solltest Du es gewünscht haben:
Java:
/* $Id$ */

/* Copyright 2010 Sebastian Haufe

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       [url]http://www.apache.org/licenses/LICENSE-2.0[/url]

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

package com.ebenius;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.*;

import javax.swing.*;
import javax.swing.JComboBox.KeySelectionManager;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;

public class AutoFilteringComboBoxTest {

  private static class AutoFilteringComboBoxModel extends AbstractListModel
    implements ComboBoxModel {

    private final String[] allValues;
    private List<String> matches = new ArrayList<String>();
    private String selected = null;
    private String filter = null;

    AutoFilteringComboBoxModel(String[] values) {
      allValues = values.clone();
      matches.addAll(Arrays.asList(values));
    }

    public String getFilter() {
      return filter;
    }

    public void setFilter(String newFilter) {
      final Object oldSelection = getSelectedItem();
      final String oldValue = this.filter;
      this.filter = newFilter;
      if (oldValue == null || newFilter.startsWith(oldValue)) {
        // filter narrowed
        for (ListIterator<String> it = matches.listIterator(); it.hasNext();) {
          final String test = it.next();
          if (!test.startsWith(newFilter)) {
            if (oldSelection != null && oldSelection.equals(test)) {
              setSelectedItem(null);
            }
            final int index = it.previousIndex();
            it.remove();
            fireIntervalRemoved(this, index, index);
          }
        }
      } else if (oldValue.startsWith(newFilter)) {
        // filter widened
        for (int i = 0, j = 0; i < allValues.length; i++) {
          final String test = allValues[i];
          if (test.startsWith(newFilter)) {
            if (matches.size() <= j || matches.get(j) != test) {
              matches.add(j, test);
              fireIntervalAdded(this, j, j);
            }
            j++;
          }
        }
      } else {
        // another change; complete rebuild
        final int oldSize = matches.size();
        if (oldSelection != null) {
          setSelectedItem(null);
        }
        if (oldSize != 0) {
          matches.clear();
          fireIntervalRemoved(this, 0, oldSize - 1);
        }
        for (final String test : allValues) {
          if (test.startsWith(newFilter)) {
            matches.add(test);
          }
        }
        final int newSize = matches.size() - 1;
        if (newSize != 0) {
          fireIntervalAdded(this, newSize, newSize);
        }
      }
    }

    public Object getSelectedItem() {
      return selected;
    }

    public void setSelectedItem(Object selected) {
      this.selected = (String) selected;
      fireContentsChanged(this, -1, -1);
    }

    public Object getElementAt(int index) {
      return matches.get(index);
    }

    public int getSize() {
      return matches.size();
    }
  }

  /**
   * Test main method.
   * 
   * @param args ignored
   */
  public static void main(String[] args) {
    // create a cool combo box
    final String[] values =
          new String[] { "ABC", "ABD", "BBC", "BBD", "BBE" };
    final AutoFilteringComboBoxModel model =
          new AutoFilteringComboBoxModel(values);
    final JComboBox comboBox = new JComboBox(model);
    comboBox.setEditable(false);

    // No key selection
    comboBox.setKeySelectionManager(new KeySelectionManager() {

      public int selectionForKey(char aKey, ComboBoxModel aModel) {
        return -1;
      }
    });

    // Key listener adapter for filtering
    comboBox.addKeyListener(new KeyAdapter() {

      @Override
      public void keyTyped(KeyEvent e) {
        final char c = e.getKeyChar();
        final String s = model.getFilter();
        if (Character.isLetterOrDigit(c)) {
          model.setFilter((s == null ? "" : s) + c);
        } else if (s != null && s.length() > 0) {
          switch (c) {
          case 8: // BACK_SPACE
            model.setFilter(s.substring(0, s.length() - 1));
            break;
          case 27: // ESCAPE
            model.setFilter(null);
            break;
          }
        }
      }
    });

    // Refresh the max row count value to fix a bug in BasicComboBoxUI which
    // does not trim the menu length while the popup is open
    model.addListDataListener(new ListDataListener() {

      public void intervalRemoved(ListDataEvent e) {
        final int maxRowCount = comboBox.getMaximumRowCount();
        if (comboBox.isPopupVisible()
              && ((ListModel) e.getSource()).getSize() < maxRowCount) {
          comboBox.setMaximumRowCount(1);
          comboBox.setMaximumRowCount(maxRowCount);
        }
      }

      public void intervalAdded(ListDataEvent e) {
        final int maxRowCount = comboBox.getMaximumRowCount();
        if (comboBox.isPopupVisible()
              && ((ListModel) e.getSource()).getSize()
                    - e.getIndex1()
                    + e.getIndex0()
                    - 1 < maxRowCount) {
          comboBox.setMaximumRowCount(1);
          comboBox.setMaximumRowCount(maxRowCount);
        }
      }

      public void contentsChanged(ListDataEvent e) {}
    });

    final JFrame f = new JFrame("Test Frame: AutoFilteringComboBoxTest"); //$NON-NLS-1$
    final JPanel contentPane = new JPanel(new BorderLayout(6, 6));
    contentPane.add(comboBox);
    f.setContentPane(contentPane);
    f.setSize(new Dimension(200, 50));
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setVisible(true);
  }
}
Ebenius
 

Thomas Lorenz

Bekanntes Mitglied
Ja, so läuft es schon so wie es mir gewünscht habe.
Aber, sobald ich einen Buchstaben ausgewählt habe - einen der auch gefunden wird - dann
sieht es so aus, als wenn die Box erst noch überlegen muss, ob sie denn das Ergebnis anzeigt , oder nicht.

Damit meine ich, dass die geöffnete Box anscheinend für jeden einzelnen Eintrag zu blinken anfängt und
dann das Ergebnis anzeigt.

Wenn die Box geschlossen ist, dann ist alles perfekt.

Und dann noch eine Frage. Ich bin ja noch Anfänger ;)

Wenn ich z.B. Deinen Code in Eclipse kopiere, dann werden nicht gültige Leerzeichen am Anfang der Zeile
eingefügt. Das ist mühselig diese Leerzeichen zu entfernen.

Bis später..
 

Ebenius

Top Contributor
Damit meine ich, dass die geöffnete Box anscheinend für jeden einzelnen Eintrag zu blinken anfängt und dann das Ergebnis anzeigt.
Jupp, das hat mit einem JComboBox-Bug zu tun und liegt an dem Workaround in Zeile 162ff (also der ganze Block ab da). Wenn Du das ganze auskommentierst, dann blinkts nicht mehr, dafür wird das Popup nicht vergrößert/verkleinert. Ein anderer Workaround fällt mir nicht ein, damit müsste man leben. Passiert aber nur, wenn die Auswahl wirklich klein ist (also kleiner als maxRowCount war oder wird).

Wenn ich z.B. Deinen Code in Eclipse kopiere, dann werden nicht gültige Leerzeichen am Anfang der Zeile eingefügt. Das ist mühselig diese Leerzeichen zu entfernen.
Das liegt an Deinem Browser. Klick doch mal auf den kleinen Knopf neben "Java Code:"! Dann öffnet sich der Quelltext im Browser. Hat mich einige Zeit gekostet den Button ins Forum einzubauen; ich glaub den verwendet leider kaum einer...
Java:
// ^ Klick hier!
So long, Ebenius
 

Thomas Lorenz

Bekanntes Mitglied
Das mit dem auskommentieren werd ich mir noch mal überlegen.

Für Dich erstmal ein Dankeschön!

Das mit dem Browser haut bei mir nicht hin, denn ich habe bereits Deinen Hinweis befolgt und
den Pfeil-Button verwendet.
Ergebnis : identisch.

Ich verwende 'Safari' auf Mac OS X 10.5

Vielleicht hilft Dir das weiter.
 

Ebenius

Top Contributor
Das mit dem Browser haut bei mir nicht hin, denn ich habe bereits Deinen Hinweis befolgt und den Pfeil-Button verwendet.
Testest Du das mal noch gegen einen Firefox, oder hat Dein Mac keinen? Kann der Safari den Code vielleicht als Text abspeichern (Firefox kann das, Opera nicht, weil das Dokument nicht existiert sondern per JavaScript künstlich erzeugt wird)? Vielleicht kann Safari den Code auch als HTML abspeichern (Firefox kann das, wenn man den Code selektiert und dann auf "View Selection Source" geht und den Source dann als HTML abspeichert)? Das HTML kann man dann durch [c]html2text[/c] oder dergleichen jagen.

Das in durch Firefox in HTML ausgedrückte DOM sieht so aus:
HTML:
<html><head>


<title>Quelltext - java-forum.org</title>
<base href="file:///home/haufe/tmp/601240-post4.html#_"></head><body id="insertion_point">
<pre><span>/* $Id$ */</span>
&nbsp;
<span>/* Copyright 2010 Sebastian Haufe</span>
&nbsp;
<span>&nbsp; &nbsp;Licensed under the Apache License, Version 2.0 (the "License");</span>
<span>&nbsp; &nbsp;you may not use this file except in compliance with the License.</span>

<span>&nbsp; &nbsp;You may obtain a copy of the License at</span>
&nbsp;
<span>&nbsp; &nbsp; &nbsp; &nbsp;http://www.apache.org/licenses/LICENSE-2.0</span>
&nbsp;
<span>&nbsp; &nbsp;Unless required by applicable law or agreed <acronym>to</acronym> in writing, software</span>
<span>&nbsp; &nbsp;distributed under the License is distributed on an "AS IS" BASIS,</span>

<span>&nbsp; &nbsp;WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span>
<span>&nbsp; &nbsp;See the License for the specific language governing permissions and</span>
<span>&nbsp; &nbsp;limitations under the License. */</span>
&nbsp;
<span>package</span> <span>com.ebenius</span><span>;</span>
&nbsp;
<span>import</span> <span>java.<acronym>awt</acronym>.BorderLayout</span><span>;</span>

<span>import</span> <span>java.<acronym>awt</acronym>.Dimension</span><span>;</span>
<span>import</span> <span>java.<acronym>awt</acronym>.event.KeyAdapter</span><span>;</span>
<span>import</span> <span>java.<acronym>awt</acronym>.event.KeyEvent</span><span>;</span>

<span>import</span> <span>java.util.*</span><span>;</span>
&nbsp;
<span>import</span> <span>javax.<acronym>swing</acronym>.*</span><span>;</span>
<span>import</span> <span>javax.<acronym>swing</acronym>.JComboBox.KeySelectionManager</span><span>;</span>

<span>import</span> <span>javax.<acronym>swing</acronym>.event.ListDataEvent</span><span>;</span>
<span>import</span> <span>javax.<acronym>swing</acronym>.event.ListDataListener</span><span>;</span>
&nbsp;
<span>public</span> <span>class</span> AutoFilteringComboBoxTest <span>{</span>

&nbsp;
&nbsp; <span>private</span> <span>static</span> <span>class</span> AutoFilteringComboBoxModel <span>extends</span> <a><span>AbstractListModel</span></a>
&nbsp; &nbsp; <span>implements</span> <a><span>ComboBoxModel</span></a> <span>{</span>

&nbsp;
&nbsp; &nbsp; <span>private</span> <span>final</span> <a><span>String</span></a><span>[</span><span>]</span> allValues<span>;</span>
&nbsp; &nbsp; <span>private</span> List<span>&lt;</span>String<span>&gt;</span> matches <span>=</span> <span>new</span> ArrayList<span>&lt;</span>String<span>&gt;</span><span>(</span><span>)</span><span>;</span>

&nbsp; &nbsp; <span>private</span> <a><span>String</span></a> selected <span>=</span> <span>null</span><span>;</span>
&nbsp; &nbsp; <span>private</span> <a><span>String</span></a> filter <span>=</span> <span>null</span><span>;</span>

&nbsp;
&nbsp; &nbsp; AutoFilteringComboBoxModel<span>(</span><a><span>String</span></a><span>[</span><span>]</span> values<span>)</span> <span>{</span>
&nbsp; &nbsp; &nbsp; allValues <span>=</span> values.<span>clone</span><span>(</span><span>)</span><span>;</span>

&nbsp; &nbsp; &nbsp; matches.<span>addAll</span><span>(</span><a><span>Arrays</span></a>.<span>asList</span><span>(</span>values<span>)</span><span>)</span><span>;</span>
&nbsp; &nbsp; <span>}</span>

&nbsp;
&nbsp; &nbsp; <span>public</span> <a><span>String</span></a> getFilter<span>(</span><span>)</span> <span>{</span>
&nbsp; &nbsp; &nbsp; <span>return</span> filter<span>;</span>

&nbsp; &nbsp; <span>}</span>
&nbsp;
&nbsp; &nbsp; <span>public</span> <span>void</span> setFilter<span>(</span><a><span>String</span></a> newFilter<span>)</span> <span>{</span>

&nbsp; &nbsp; &nbsp; <span>final</span> <a><span>Object</span></a> oldSelection <span>=</span> getSelectedItem<span>(</span><span>)</span><span>;</span>
&nbsp; &nbsp; &nbsp; <span>final</span> <a><span>String</span></a> oldValue <span>=</span> <span>this</span>.<span>filter</span><span>;</span>

&nbsp; &nbsp; &nbsp; <span>this</span>.<span>filter</span> <span>=</span> newFilter<span>;</span>
&nbsp; &nbsp; &nbsp; <span>if</span> <span>(</span>oldValue <span>==</span> <span>null</span> <span>||</span> newFilter.<span>startsWith</span><span>(</span>oldValue<span>)</span><span>)</span> <span>{</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span>// filter narrowed</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span>for</span> <span>(</span>ListIterator<span>&lt;</span>String<span>&gt;</span> it <span>=</span> matches.<span>listIterator</span><span>(</span><span>)</span><span>;</span> it.<span>hasNext</span><span>(</span><span>)</span><span>;</span><span>)</span> <span>{</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>final</span> <a><span>String</span></a> test <span>=</span> it.<span>next</span><span>(</span><span>)</span><span>;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>if</span> <span>(</span><span>!</span>test.<span>startsWith</span><span>(</span>newFilter<span>)</span><span>)</span> <span>{</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>if</span> <span>(</span>oldSelection <span>!=</span> <span>null</span> <span>&amp;&amp;</span> oldSelection.<span>equals</span><span>(</span>test<span>)</span><span>)</span> <span>{</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setSelectedItem<span>(</span><span>null</span><span>)</span><span>;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>}</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>final</span> <span>int</span> index <span>=</span> it.<span>previousIndex</span><span>(</span><span>)</span><span>;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; it.<span>remove</span><span>(</span><span>)</span><span>;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fireIntervalRemoved<span>(</span><span>this</span>, index, index<span>)</span><span>;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>}</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span>}</span>
&nbsp; &nbsp; &nbsp; <span>}</span> <span>else</span> <span>if</span> <span>(</span>oldValue.<span>startsWith</span><span>(</span>newFilter<span>)</span><span>)</span> <span>{</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span>// filter widened</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span>for</span> <span>(</span><span>int</span> i <span>=</span> <span>0</span>, j <span>=</span> <span>0</span><span>;</span> i <span>&lt;</span> allValues.<span>length</span><span>;</span> i<span>++</span><span>)</span> <span>{</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>final</span> <a><span>String</span></a> test <span>=</span> allValues<span>[</span>i<span>]</span><span>;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>if</span> <span>(</span>test.<span>startsWith</span><span>(</span>newFilter<span>)</span><span>)</span> <span>{</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>if</span> <span>(</span>matches.<span>size</span><span>(</span><span>)</span> <span>&lt;=</span> j <span>||</span> matches.<span>get</span><span>(</span>j<span>)</span> <span>!=</span> test<span>)</span> <span>{</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; matches.<span>add</span><span>(</span>j, test<span>)</span><span>;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fireIntervalAdded<span>(</span><span>this</span>, j, j<span>)</span><span>;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>}</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; j<span>++;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>}</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span>}</span>
&nbsp; &nbsp; &nbsp; <span>}</span> <span>else</span> <span>{</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span>// another change; complete rebuild</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span>final</span> <span>int</span> oldSize <span>=</span> matches.<span>size</span><span>(</span><span>)</span><span>;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span>if</span> <span>(</span>oldSelection <span>!=</span> <span>null</span><span>)</span> <span>{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setSelectedItem<span>(</span><span>null</span><span>)</span><span>;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span>}</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span>if</span> <span>(</span>oldSize <span>!=</span> <span>0</span><span>)</span> <span>{</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; matches.<span>clear</span><span>(</span><span>)</span><span>;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fireIntervalRemoved<span>(</span><span>this</span>, <span>0</span>, oldSize <span>-</span> <span>1</span><span>)</span><span>;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span>}</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span>for</span> <span>(</span><span>final</span> <a><span>String</span></a> test <span>:</span> allValues<span>)</span> <span>{</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>if</span> <span>(</span>test.<span>startsWith</span><span>(</span>newFilter<span>)</span><span>)</span> <span>{</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; matches.<span>add</span><span>(</span>test<span>)</span><span>;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>}</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span>}</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span>final</span> <span>int</span> newSize <span>=</span> matches.<span>size</span><span>(</span><span>)</span> <span>-</span> <span>1</span><span>;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span>if</span> <span>(</span>newSize <span>!=</span> <span>0</span><span>)</span> <span>{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fireIntervalAdded<span>(</span><span>this</span>, newSize, newSize<span>)</span><span>;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span>}</span>
&nbsp; &nbsp; &nbsp; <span>}</span>
&nbsp; &nbsp; <span>}</span>
&nbsp;
&nbsp; &nbsp; <span>public</span> <a><span>Object</span></a> getSelectedItem<span>(</span><span>)</span> <span>{</span>

&nbsp; &nbsp; &nbsp; <span>return</span> selected<span>;</span>
&nbsp; &nbsp; <span>}</span>
&nbsp;
&nbsp; &nbsp; <span>public</span> <span>void</span> setSelectedItem<span>(</span><a><span>Object</span></a> selected<span>)</span> <span>{</span>

&nbsp; &nbsp; &nbsp; <span>this</span>.<span>selected</span> <span>=</span> <span>(</span><a><span>String</span></a><span>)</span> selected<span>;</span>
&nbsp; &nbsp; &nbsp; fireContentsChanged<span>(</span><span>this</span>, <span>-</span><span>1</span>, <span>-</span><span>1</span><span>)</span><span>;</span>

&nbsp; &nbsp; <span>}</span>
&nbsp;
&nbsp; &nbsp; <span>public</span> <a><span>Object</span></a> getElementAt<span>(</span><span>int</span> index<span>)</span> <span>{</span>

&nbsp; &nbsp; &nbsp; <span>return</span> matches.<span>get</span><span>(</span>index<span>)</span><span>;</span>
&nbsp; &nbsp; <span>}</span>
&nbsp;

&nbsp; &nbsp; <span>public</span> <span>int</span> getSize<span>(</span><span>)</span> <span>{</span>
&nbsp; &nbsp; &nbsp; <span>return</span> matches.<span>size</span><span>(</span><span>)</span><span>;</span>

&nbsp; &nbsp; <span>}</span>
&nbsp; <span>}</span>
&nbsp;
&nbsp; <span>/**</span>
<span>&nbsp; &nbsp;* Test main method.</span>
<span>&nbsp; &nbsp;* </span>

<span>&nbsp; &nbsp;* @param args ignored</span>
<span>&nbsp; &nbsp;*/</span>
&nbsp; <span>public</span> <span>static</span> <span>void</span> main<span>(</span><a><span>String</span></a><span>[</span><span>]</span> args<span>)</span> <span>{</span>

&nbsp; &nbsp; <span>// create a cool combo box</span>
&nbsp; &nbsp; <span>final</span> <a><span>String</span></a><span>[</span><span>]</span> values <span>=</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>new</span> <a><span>String</span></a><span>[</span><span>]</span> <span>{</span> <span>"ABC"</span>, <span>"ABD"</span>, <span>"BBC"</span>, <span>"BBD"</span>, <span>"BBE"</span> <span>}</span><span>;</span>

&nbsp; &nbsp; <span>final</span> AutoFilteringComboBoxModel model <span>=</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>new</span> AutoFilteringComboBoxModel<span>(</span>values<span>)</span><span>;</span>

&nbsp; &nbsp; <span>final</span> <a><span>JComboBox</span></a> comboBox <span>=</span> <span>new</span> <a><span>JComboBox</span></a><span>(</span>model<span>)</span><span>;</span>

&nbsp; &nbsp; comboBox.<span>setEditable</span><span>(</span><span>false</span><span>)</span><span>;</span>
&nbsp;
&nbsp; &nbsp; <span>// No key selection</span>
&nbsp; &nbsp; comboBox.<span>setKeySelectionManager</span><span>(</span><span>new</span> KeySelectionManager<span>(</span><span>)</span> <span>{</span>

&nbsp;
&nbsp; &nbsp; &nbsp; <span>public</span> <span>int</span> selectionForKey<span>(</span><span>char</span> aKey, <a><span>ComboBoxModel</span></a> aModel<span>)</span> <span>{</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span>return</span> <span>-</span><span>1</span><span>;</span>
&nbsp; &nbsp; &nbsp; <span>}</span>
&nbsp; &nbsp; <span>}</span><span>)</span><span>;</span>

&nbsp;
&nbsp; &nbsp; <span>// Key listener adapter for filtering</span>
&nbsp; &nbsp; comboBox.<span>addKeyListener</span><span>(</span><span>new</span> <a><span>KeyAdapter</span></a><span>(</span><span>)</span> <span>{</span>

&nbsp;
&nbsp; &nbsp; &nbsp; @Override
&nbsp; &nbsp; &nbsp; <span>public</span> <span>void</span> keyTyped<span>(</span><a><span>KeyEvent</span></a> e<span>)</span> <span>{</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span>final</span> <span>char</span> c <span>=</span> e.<span>getKeyChar</span><span>(</span><span>)</span><span>;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span>final</span> <a><span>String</span></a> s <span>=</span> model.<span>getFilter</span><span>(</span><span>)</span><span>;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span>if</span> <span>(</span><a><span>Character</span></a>.<span>isLetterOrDigit</span><span>(</span>c<span>)</span><span>)</span> <span>{</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; model.<span>setFilter</span><span>(</span><span>(</span>s <span>==</span> <span>null</span> <span>?</span> <span>""</span> <span>:</span> s<span>)</span> <span>+</span> c<span>)</span><span>;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span>}</span> <span>else</span> <span>if</span> <span>(</span>s <span>!=</span> <span>null</span> <span>&amp;&amp;</span> s.<span>length</span><span>(</span><span>)</span> <span>&gt;</span> <span>0</span><span>)</span> <span>{</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>switch</span> <span>(</span>c<span>)</span> <span>{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>case</span> <span>8</span><span>:</span> <span>// BACK_SPACE</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; model.<span>setFilter</span><span>(</span>s.<span>substring</span><span>(</span><span>0</span>, s.<span>length</span><span>(</span><span>)</span> <span>-</span> <span>1</span><span>)</span><span>)</span><span>;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>break</span><span>;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>case</span> <span>27</span><span>:</span> <span>// ESCAPE</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; model.<span>setFilter</span><span>(</span><span>null</span><span>)</span><span>;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>break</span><span>;</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>}</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span>}</span>
&nbsp; &nbsp; &nbsp; <span>}</span>

&nbsp; &nbsp; <span>}</span><span>)</span><span>;</span>
&nbsp;
&nbsp; &nbsp; <span>// Refresh the max row count value <acronym>to</acronym> fix a bug in BasicComboBoxUI which</span>
&nbsp; &nbsp; <span>// does not trim the menu length while the popup is open</span>

&nbsp; &nbsp; model.<span>addListDataListener</span><span>(</span><span>new</span> <a><span>ListDataListener</span></a><span>(</span><span>)</span> <span>{</span>
&nbsp;
&nbsp; &nbsp; &nbsp; <span>public</span> <span>void</span> intervalRemoved<span>(</span><a><span>ListDataEvent</span></a> e<span>)</span> <span>{</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span>final</span> <span>int</span> maxRowCount <span>=</span> comboBox.<span>getMaximumRowCount</span><span>(</span><span>)</span><span>;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span>if</span> <span>(</span>comboBox.<span>isPopupVisible</span><span>(</span><span>)</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>&amp;&amp;</span> <span>(</span><span>(</span><a><span>ListModel</span></a><span>)</span> e.<span>getSource</span><span>(</span><span>)</span><span>)</span>.<span>getSize</span><span>(</span><span>)</span> <span>&lt;</span> maxRowCount<span>)</span> <span>{</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; comboBox.<span>setMaximumRowCount</span><span>(</span><span>1</span><span>)</span><span>;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; comboBox.<span>setMaximumRowCount</span><span>(</span>maxRowCount<span>)</span><span>;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span>}</span>
&nbsp; &nbsp; &nbsp; <span>}</span>
&nbsp;
&nbsp; &nbsp; &nbsp; <span>public</span> <span>void</span> intervalAdded<span>(</span><a><span>ListDataEvent</span></a> e<span>)</span> <span>{</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span>final</span> <span>int</span> maxRowCount <span>=</span> comboBox.<span>getMaximumRowCount</span><span>(</span><span>)</span><span>;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span>if</span> <span>(</span>comboBox.<span>isPopupVisible</span><span>(</span><span>)</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>&amp;&amp;</span> <span>(</span><span>(</span><a><span>ListModel</span></a><span>)</span> e.<span>getSource</span><span>(</span><span>)</span><span>)</span>.<span>getSize</span><span>(</span><span>)</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>-</span> e.<span>getIndex1</span><span>(</span><span>)</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>+</span> e.<span>getIndex0</span><span>(</span><span>)</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span>-</span> <span>1</span> <span>&lt;</span> maxRowCount<span>)</span> <span>{</span>

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; comboBox.<span>setMaximumRowCount</span><span>(</span><span>1</span><span>)</span><span>;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; comboBox.<span>setMaximumRowCount</span><span>(</span>maxRowCount<span>)</span><span>;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span>}</span>
&nbsp; &nbsp; &nbsp; <span>}</span>
&nbsp;
&nbsp; &nbsp; &nbsp; <span>public</span> <span>void</span> contentsChanged<span>(</span><a><span>ListDataEvent</span></a> e<span>)</span> <span>{</span><span>}</span>

&nbsp; &nbsp; <span>}</span><span>)</span><span>;</span>
&nbsp;
&nbsp; &nbsp; <span>final</span> <a><span>JFrame</span></a> f <span>=</span> <span>new</span> <a><span>JFrame</span></a><span>(</span><span>"Test Frame: AutoFilteringComboBoxTest"</span><span>)</span><span>;</span> <span>//$NON-NLS-1$</span>

&nbsp; &nbsp; <span>final</span> <a><span>JPanel</span></a> contentPane <span>=</span> <span>new</span> <a><span>JPanel</span></a><span>(</span><span>new</span> <a><span>BorderLayout</span></a><span>(</span><span>6</span>, <span>6</span><span>)</span><span>)</span><span>;</span>

&nbsp; &nbsp; contentPane.<span>add</span><span>(</span>comboBox<span>)</span><span>;</span>
&nbsp; &nbsp; f.<span>setContentPane</span><span>(</span>contentPane<span>)</span><span>;</span>

&nbsp; &nbsp; f.<span>setSize</span><span>(</span><span>new</span> <a><span>Dimension</span></a><span>(</span><span>200</span>, <span>50</span><span>)</span><span>)</span><span>;</span>
&nbsp; &nbsp; f.<span>setLocationRelativeTo</span><span>(</span><span>null</span><span>)</span><span>;</span>

&nbsp; &nbsp; f.<span>setDefaultCloseOperation</span><span>(</span><a><span>WindowConstants</span></a>.<span>EXIT_ON_CLOSE</span><span>)</span><span>;</span>
&nbsp; &nbsp; f.<span>setVisible</span><span>(</span><span>true</span><span>)</span><span>;</span>

&nbsp; <span>}</span>
<span>}</span></pre></body></html>
Die Zeilenumbrüche sind hier dann auch [c]0x0A[/c]. Das scheint mir richtig; wenn da Safari zickt, kann ich auch nix dafür. :-D

Die ganzen <spans> könnte man noch raussammeln, aber das war mir bisher zu aufwändig. Wer mag darf sich gern daran austoben. :-D [highlight=javascript]/* $Id: plaincodepopup.js,v 1.1 2009/06/15 16:40:49 ebenius Exp $ */

/* Copyright 2009 Sebastian Haufe

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. */

function popupSourceCode(id) {
var win = window.open("about:blank", "_blank",
"menubar=no,toolbar=no,location=no");
var doc = win.document;
doc.open();
doc.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 ");
doc.write("Transitional//EN\" \"http://");
doc.writeln("www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
doc.writeln("<html>");
doc.writeln("<head>");
doc.writeln("<title>Quelltext - java-forum.org</title>");
doc.writeln("</head><body id='insertion_point'>");
doc.writeln("</body></html>");
doc.close();
var copyFrom = document.getElementById(id);
var insertHere = doc.getElementById("insertion_point");
copyDOM(doc, insertHere, copyFrom);
}

/* Deep clone a node to another node in another document. */
function copyDOM(doc, appendTo, copyFrom) {
switch (copyFrom.nodeType) {
case 1: // element
var child = doc.createElement(copyFrom.nodeName);
appendTo.appendChild(child);
var children = copyFrom.childNodes;
for ( var i = 0; i < children.length; i++) {
copyDOM(doc, child, children);
}
break;
case 2: // attribute
var attrib = doc.createAttribute(copyFrom.nodeName);
attrib.nodeValue = copyFrom.nodeValue;
appendTo.appendChild(attrib);
break;
case 3: // text node
case 4: // CDATA
case 5: // entity reference
case 6: // entity
appendTo.appendChild(doc.createTextNode(copyFrom.nodeValue));
break;
}
}[/highlight]

Ebenius
 

Thomas Lorenz

Bekanntes Mitglied
Also,

mit dem FireFox habe ich es mit dem Kontextmenü 'Seitenquelltext anzeigen' propiert.
Er stellt den Code einwandfrei in einem neuen Frame dar.
Siehe Bild3.
Wenn ich den Code per Copy/Paste in Eclipse einfüge sind die Leerzeichen wieder da.



Bei Safari ist das genauso.
Die Funktion 'Quelltext anzeigen' gibt den gesamten Quelltext der
Seite aus. ( s. Bild 4).
Und auch dann wenn ich den Code per Maus markiere und
dann in Eclipse ziehe.
Lauter rote Punkte am Zeilenanfang ;).

Dann gibt es im Safari noch die Funktion 'Aktivität'. Hier habe ich Dir das sich dann öffnende Fenster mal rangehangen.
Aber im ersten Moment habe nichts Hilfreiches dabei erkannt.


Eine Funktion wie 'als Text speichern' habe ich nicht gefunden.


Wenn Du mich für weitere Tests hierfür benötigst, stehe ich
gerne zur Verfügung.

Thomas
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F JComboBox und Einträge AWT, Swing, JavaFX & SWT 3
E JCombobox- Einträge aktualisieren AWT, Swing, JavaFX & SWT 2
B Probleme bei der dynamischen JCombobox-Einträge und Listener AWT, Swing, JavaFX & SWT 2
G Doppelte Einträge aus JComboBox rausschmeisen AWT, Swing, JavaFX & SWT 2
E Einträge der JComboBox werden durch Grafik verdeckt AWT, Swing, JavaFX & SWT 11
hannibalstgt Fehler bei JCOMBOBOX GUI Anzeige AWT, Swing, JavaFX & SWT 4
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
N Keylistener & JComboBox AWT, Swing, JavaFX & SWT 5
R JComboBox abfragen AWT, Swing, JavaFX & SWT 1
Esquid If Befehl bei JComboBox AWT, Swing, JavaFX & SWT 3
kodela Swing Element einer JComboBox ausgrauen AWT, Swing, JavaFX & SWT 3
D JComboBox Strings aus JTextFields zuordnen AWT, Swing, JavaFX & SWT 2
F JComboBox und Model AWT, Swing, JavaFX & SWT 10
I Editierbare JComboBox, die nur Ganzzahlen als Eingabewerte zulässt AWT, Swing, JavaFX & SWT 3
Drachenbauer Swing Wie ändere ich die Farbe der Konturen von jButton und jCombobox? AWT, Swing, JavaFX & SWT 18
Drachenbauer Swing Wie ändere ich den Hintergrund vom Anzeigefeld einer JComboBox, die nicht zum Hineinschreiben offen steht? AWT, Swing, JavaFX & SWT 32
Hatsi09 JCombobox default wert AWT, Swing, JavaFX & SWT 6
D Swing JCombobox Aktion löscht Grafik AWT, Swing, JavaFX & SWT 1
cezary Choice, JComboBox oder JList AWT, Swing, JavaFX & SWT 5
R Swing Java9 NullPointerException bei JComboBox AWT, Swing, JavaFX & SWT 13
ralfb1105 Swing JComboBox update der Daten AWT, Swing, JavaFX & SWT 8
D Swing JCombobox Weiße Leerzeilen AWT, Swing, JavaFX & SWT 10
G JComboBox: Arrow-Button permanent anzeigen AWT, Swing, JavaFX & SWT 4
D Swing Java JComboBox Example AWT, Swing, JavaFX & SWT 16
K Swing JComboBox mit ArrayList füllen AWT, Swing, JavaFX & SWT 4
D Swing "blaues" Element aus JComboBox erhalten AWT, Swing, JavaFX & SWT 6
gamillton Swing JComboBox mit extra Inhalt + breiteres Popupmenü AWT, Swing, JavaFX & SWT 0
T JPanelsteuerung mit JComboBox AWT, Swing, JavaFX & SWT 5
N Swing Duplikate im Jcombobox vermeiden AWT, Swing, JavaFX & SWT 15
L Swing JComboBox kann nicht erstellt werden! AWT, Swing, JavaFX & SWT 2
C JComboBox Objecte übergeben und Eintrag auswählen AWT, Swing, JavaFX & SWT 3
M Swing JComboBox mit Laufwerksbuchstaben (Windows) AWT, Swing, JavaFX & SWT 6
D Swing Größe einer JComboBox im GridBagLayout aufgrund der maximalen Länge der enthaltenen Daten AWT, Swing, JavaFX & SWT 7
D Swing JComboBox (DefaultComboBoxModel) überschreibt Eintrag beim erstellen AWT, Swing, JavaFX & SWT 0
R Swing Durch JComboBox-Item eine TextArea aktualisieren AWT, Swing, JavaFX & SWT 2
3 JComboBox - Action - Auslesen & Umwandeln AWT, Swing, JavaFX & SWT 9
M Alle Schriftarten in JComboBox AWT, Swing, JavaFX & SWT 5
M Swing JComboBox eigenes Design AWT, Swing, JavaFX & SWT 3
Sin137 JComboBox mit Generics AWT, Swing, JavaFX & SWT 14
R JComboBox erweitern AWT, Swing, JavaFX & SWT 5
S Swing Eigene JComboBox Problem! AWT, Swing, JavaFX & SWT 1
V Editierbare JComboBox AWT, Swing, JavaFX & SWT 2
D Swing JCombobox in einem JTable vorbelegen AWT, Swing, JavaFX & SWT 4
F neuen Menüpunkt in jcombobox einfügen AWT, Swing, JavaFX & SWT 1
F Swing Jcombobox mit manueller Rückgabe AWT, Swing, JavaFX & SWT 4
W JComboBox auffristen nach Listenänderung AWT, Swing, JavaFX & SWT 20
S JComboBox mit mehreren Spalten? AWT, Swing, JavaFX & SWT 6
J JComboBox + ItemListener AWT, Swing, JavaFX & SWT 12
T Swing jComboBox auslesen mit Datenbankanbindung AWT, Swing, JavaFX & SWT 3
S JComboBox aus anderer Klasse füllen (Java-Swing) AWT, Swing, JavaFX & SWT 0
D Swing Erstes Item einer JCombobox in JTable anzeigen AWT, Swing, JavaFX & SWT 2
N JComboBox in JTable [Swing] -> totaler UI-Einsteiger AWT, Swing, JavaFX & SWT 3
H Swing jComboBox Ausgabe -1/null AWT, Swing, JavaFX & SWT 4
C Arrow Farbe bei JComboBox AWT, Swing, JavaFX & SWT 2
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
O JTextfield und JComboBox Wert in SQL Database speichern AWT, Swing, JavaFX & SWT 4
S JComboBox UTF-8 Codierung zuweisen AWT, Swing, JavaFX & SWT 5
A JComboBox mit Array aktualisieren AWT, Swing, JavaFX & SWT 7
S JComboBox nach auswahl erneuern AWT, Swing, JavaFX & SWT 4
S Swing JComboBox mit Listener aktualisieren AWT, Swing, JavaFX & SWT 13
A Swing per JComboBox gewünschtes Attribut auswählen und Komponenten passen sich an AWT, Swing, JavaFX & SWT 7
I JComboBox gibt bei ausgewählten ITem NullPointer an... AWT, Swing, JavaFX & SWT 3
D Swing JCombobox - Tooltip Location ändern AWT, Swing, JavaFX & SWT 4
J JComboBox Dropdown Icon AWT, Swing, JavaFX & SWT 2
M Swing Mix JComboBox - JButton? AWT, Swing, JavaFX & SWT 6
A Swing bei Auswahl und klick eines JComboBox buttons die Klasse eines anderen Projekts aufrufen AWT, Swing, JavaFX & SWT 3
F Swing jComboBox auslesen AWT, Swing, JavaFX & SWT 6
O Swing TableCellRenderer und JComboBox AWT, Swing, JavaFX & SWT 4
F Swing JComboBox - Frage zur Größe AWT, Swing, JavaFX & SWT 11
C Swing JComboBox, ItemListener gibt 2x aus AWT, Swing, JavaFX & SWT 2
O JComboBox - autom. Selektieren AWT, Swing, JavaFX & SWT 6
J JComboBox - wie getSelectedItem() überschreiben? AWT, Swing, JavaFX & SWT 8
S Swing Jcombobox und array AWT, Swing, JavaFX & SWT 6
D Swing JComboBox aktualisieren AWT, Swing, JavaFX & SWT 4
E JComboBox AWT, Swing, JavaFX & SWT 8
N Swing JComboBox Frage AWT, Swing, JavaFX & SWT 5
S Swing Bild auf jPanel nach Änderung von JComboBox zeichnen AWT, Swing, JavaFX & SWT 4
H Swing Element aus JComboBox auswählen AWT, Swing, JavaFX & SWT 2
H JCombobox inhalt löschen AWT, Swing, JavaFX & SWT 17
N Swing JCombobox - PopupMenu-Inhalt mit KSKB AWT, Swing, JavaFX & SWT 2
O JComboBox mit ArrayList füllen AWT, Swing, JavaFX & SWT 3
S Swing JComboBox mit Datenbank füllen AWT, Swing, JavaFX & SWT 16
S Inhalt einer JComboBox aktualisieren AWT, Swing, JavaFX & SWT 6
F Swing JComboBox in JTable AutoComplete + Tab AWT, Swing, JavaFX & SWT 4
O JComboBox getSelectedItem AWT, Swing, JavaFX & SWT 4
M JComboBox Hintergrundfarbe des gewählten Items AWT, Swing, JavaFX & SWT 3
B Swing Problem: Horizontaler Scrollbalken in JComboBox hinzufügen AWT, Swing, JavaFX & SWT 4
M JCombobox mit ID und Text AWT, Swing, JavaFX & SWT 4
A JComboBox-Inhalt durch neues Array ersetzen AWT, Swing, JavaFX & SWT 2
C Swing Dynamische JComboBox (Filter) AWT, Swing, JavaFX & SWT 28
M JComboBox Item-Auswahl in JTable AWT, Swing, JavaFX & SWT 2
L Jbutton + jcombobox mit vorhandenen frame verknüfen AWT, Swing, JavaFX & SWT 8
D JCombobox mit Linien Styles AWT, Swing, JavaFX & SWT 4
H Unterschiedliche JComboBox je JTable Zeile AWT, Swing, JavaFX & SWT 4
B jCombobox addItem funktioniert nicht AWT, Swing, JavaFX & SWT 9
G JComboBox mit CellRenderer (Auswahl) AWT, Swing, JavaFX & SWT 11
G Swing JComboBox anpassen AWT, Swing, JavaFX & SWT 6
M Item in JComboBox umbenennen AWT, Swing, JavaFX & SWT 5
M Swing Busy Waiting Problem (JComboBox) AWT, Swing, JavaFX & SWT 11
C JComboBox Renderer Problem AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben