# Element zu Listenfeld hinzufügen



## vega_ffm (7. Mai 2008)

Hallo Allerseits.

Ich versuche über einen Button ein Element in eine JList einzufügen. Ich habe erst vor ein paar Stunden mit Java angefangen, insofern sind meine Kenntnisse katastrophal. :-( Inzwischen habe ich jedoch schon herausgefunden, dass so etwas wohl nicht direkt geht, sondern nur über ein "DefaultListModel".

Ich kann als Visual Studio Programmierer zwar nicht nachvollziehen wieso dieser Umweg technisch nötig ist (würde mich stark interessieren), aber mein Problem besteht in der Umsetzung:

```
import java.swing.*;
        ...
        ...
        ...
        DefaultListModel listModel = (DefaultListModel)jList1.getModel(); //jList1 ist ein Listenfeld
        listModel.addElement("test");
```

Die Fehlermeldungen:

Exception in thread "AWT-EventQueue-0" java.lang.Error: java.lang.reflect.InvocationTargetException
        at org.jdesktop.application.ApplicationAction.actionFailed(ApplicationAction.java:859)
        at org.jdesktop.application.ApplicationAction.noProxyActionPerformed(ApplicationAction.java:665)
        at org.jdesktop.application.ApplicationAction.actionPerformed(ApplicationAction.java:698)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272)
        at java.awt.Component.processMouseEvent(Component.java:6041)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5806)
        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.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
        at java.awt.Container.dispatchEventImpl(Container.java:2102)
        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)
Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.jdesktop.application.ApplicationAction.noProxyActionPerformed(ApplicationAction.java:662)
        ... 27 more
Caused by: java.lang.ClassCastException: desktopapplication1.DesktopApplication1View$4 cannot be cast to javax.swing.DefaultListModel
        at desktopapplication1.DesktopApplication1View.test(DesktopApplication1View.java:249)
        ... 32 more

PS: Ich arbeite unter NetBeans 6.0.1 (Windows)



Ich hoffe ihr könnt mir helfen,
vega_ffm


----------



## SlaterB (7. Mai 2008)

die JList selber zeigt nur an, hat keine Daten, das macht das Model,
die JList kennt das Model nur unter dem Interface ListModel,
und dieses Interface hat keine add-Operation (siehe API),
daher ist es der JList nicht möglich, etwas einzufügen

nachfolgend natürlich die Frage, warum es diese add-Operation nicht gibt,
das ist dann eine Design-Entscheidung, vielleicht soll alles mögliche ein ListModel sein können,
auch unveränderliche Daten aufbauend auf Arrays, Dateien oder sonstwas,
aber da rate ich nun nur

----------

die entscheidene Exception ist
> Caused by: java.lang.ClassCastException: desktopapplication1.DesktopApplication1View$4 cannot be cast to javax.swing.DefaultListModel 

deine JList hat auf jeden Fall kein DefaultListModel,
sondern anscheinend eine anonyme innere Klasse von DesktopApplication1View,
zeige bitte den Code zur Erstellung der JList, da wird das Model sicherlich gesetzt,

wenn das automatisch generierter Code ist, dann wirds schwierig,
kannst du den modifizieren?


----------



## vega_ffm (10. Mai 2008)

Hi, hatte ein paar Tage kein Inet, deshalb die späte Antwort.

Ich habe den alten Code inzwischen versaut, aber ich habe einen neuen, möglichst kompakten vorbereitet. 
Eigentlich nur ein Textfeld, ein Button und ein Listenfeld (alles Swing). Beim Klicken soll der Inhalt des Textfeldes in die ListBox übernommen werden und genau das bekomme ich nicht hin. :-(



Hier der Code:


```
package examples;
import javax.swing.*;
import java.lang.*;
import java.awt.*;
//javax.swing.ListModel;

public class ContactEditor extends javax.swing.JFrame {
    
    /**
     * Creates new form ContactEditor
     */
    public ContactEditor() {
        initComponents();
    }
    
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        buttonGroup1 = new javax.swing.ButtonGroup();
        jButton1 = new javax.swing.JButton();
        jTextField1 = new javax.swing.JTextField();
        jScrollPane1 = new javax.swing.JScrollPane();
        jList1 = new javax.swing.JList();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("E-mail Contacts");

        jButton1.setText("Add");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jTextField1.setText("");

        jList1.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        jScrollPane1.setViewportView(jList1);

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false)
                    .add(org.jdesktop.layout.GroupLayout.LEADING, jButton1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .add(org.jdesktop.layout.GroupLayout.LEADING, jScrollPane1)
                    .add(org.jdesktop.layout.GroupLayout.LEADING, jTextField1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 477, Short.MAX_VALUE))
                .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(jTextField1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 67, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jButton1)
                .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

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

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
       
        
    }                                        
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ContactEditor().setVisible(true);
            }
        });
    }
    
    // Variables declaration - do not modify
    private javax.swing.ButtonGroup buttonGroup1;
    private javax.swing.JButton jButton1;
    private javax.swing.JList jList1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextField jTextField1;
    // End of variables declaration
    
}
```

Ich hoffe ihr könnt mir helfen. 



PS: Hatte das Listenfeld mal in der AWT Version getestet, da funktioniert das einfügen ganz einfach

```
list1.add("Test");
```
Was sind die Nachteile dieser Lösung?


----------



## SlaterB (10. Mai 2008)

GroupLayout gehört nicht zur Java-Klassenbibliothek, 
solange du sowas nutzt, kann ich zumindest dir nicht helfen,


----------



## vega_ffm (10. Mai 2008)

Hallo Robert.

Ich habe es gerade geschafft das Listenfeld zum laufen zu bekommen.   :toll: 

Trotzdem habe ich an dieser Stelle noch eine Frage zu deinem letzten Posting



> GroupLayout gehört nicht zur Java-Klassenbibliothek,
> solange du sowas nutzt, kann ich zumindest dir nicht helfen,




Ich bin sehr froh über diesen Satz, da ich nicht wusste, dass NetBeans Codeelemente einbindet, die bei anderen Probleme verursachen. Dieser Teil liegt leider in einem schreibgeschützten Bereich (und kann sicherlich soweiso nicht ersatzlos entfernt werden).

Ich werde versuchen das anders einzustellen. Hast du vielleicht einen Tipp wie das funktioniert?

MfG vega_ffm


----------



## vega_ffm (10. Mai 2008)

Habs, danke dir für deine Mühen!


----------



## André Uhres (11. Mai 2008)

SlaterB hat gesagt.:
			
		

> GroupLayout gehört nicht zur Java-Klassenbibliothek


Ist mittlerweile übernommen worden: 
http://java.sun.com/javase/6/docs/api/javax/swing/GroupLayout.html
Das kann man in NetBeans einstellen: 
im Inspector Rechtsklick auf den "Form" node | Properties | Layout Generation Style:
"*Standard Java 6  code*" (statt "Swing Layout Extensions Library")
Oder:
 Tools | Options | Advanced Options | Editing | GUI Builder | Layout Generation Style


----------

