Moin!
Vorweg: Ich bin mir bewusst, dass man dieses Problem eleganter lösen kann. Es geht mir auch nicht um das Ergebnis an sich, sondern darum möglichst viele verschiedene Wege mal auszuprobieren.
Ich möchte also folgendes tun (als Teil eines weitaus größeren Programms):
Ich habe zwei Container, im ersten eine "feste" JList. Durch drücken eines JButtons möchte ich einen Eintrag in der ersten Liste erzeugen, eine neue Liste im zweiten Container erzeugen und den Eintrag und die neue Liste verknüpfen. Im zweiten Container ist ein CardLayout und im ersten die benötigten Listener (auch für den Button) implementiert. Das erzeugen eines neuen Eintrages erfolgt über ein DefaultListModel und der Methode addElement(String), die den String von einem JDialog bekommt. Danach erzeuge ich eine neue JList und gebe sie mit add(JList,String) an den zweiten Container und sein CardLayout. Der Eintrag in der ersten Liste ist also über den in ihr enthaltenen String mit der neuen JList verknüpft. (Es ist gewährleistet, dass es immer nur einen Eintrag mit dem selben Inhalt gibt!)
Nun müsste ich doch mit einem entsprechend implementierten ListSelectionEvent "e" und einer show()-Methode angewandt auf das CardLayout per
show(zweiter_Container, ((String)((JList) e.getSource()).getSelectedValue()))
[ (JList) e.getSource() liefert hierbei die "feste" Liste ]
das CardLayout dazu bringen, die JList anzuzeigen. Doch jedesmal, wenn die show()-Methode aufgerufen wird, bekomme ich eine NullPointerException...
Ein "System.out.println( ((JList) e.getSource()).getSelectedValue() )" liefert aber den korrekten Eintrag in der Liste, und damit doch auch den Namen der Card?...oder muss hier _genau_ das Objekt übergeben werden, mit dem ich add() aufgerufen habe?
Ich wäre für jeden Hinweis dankbar! Ich sitze an diesem Problem nämlich schon mehrere Tage und Nächte und es bremst mich momentan erheblich....
Den Quelltext der benötigten 2 Klassen hänge ich unten mal an, sie werden in einer anderen Klasse instanziiert und verknüpft:
Ich nehme auch gerne Verbesserungsvorschläge für meinen Programmierstil entgegen....ich habe noch nie Feedback bekommen ;-)
Vorweg: Ich bin mir bewusst, dass man dieses Problem eleganter lösen kann. Es geht mir auch nicht um das Ergebnis an sich, sondern darum möglichst viele verschiedene Wege mal auszuprobieren.
Ich möchte also folgendes tun (als Teil eines weitaus größeren Programms):
Ich habe zwei Container, im ersten eine "feste" JList. Durch drücken eines JButtons möchte ich einen Eintrag in der ersten Liste erzeugen, eine neue Liste im zweiten Container erzeugen und den Eintrag und die neue Liste verknüpfen. Im zweiten Container ist ein CardLayout und im ersten die benötigten Listener (auch für den Button) implementiert. Das erzeugen eines neuen Eintrages erfolgt über ein DefaultListModel und der Methode addElement(String), die den String von einem JDialog bekommt. Danach erzeuge ich eine neue JList und gebe sie mit add(JList,String) an den zweiten Container und sein CardLayout. Der Eintrag in der ersten Liste ist also über den in ihr enthaltenen String mit der neuen JList verknüpft. (Es ist gewährleistet, dass es immer nur einen Eintrag mit dem selben Inhalt gibt!)
Nun müsste ich doch mit einem entsprechend implementierten ListSelectionEvent "e" und einer show()-Methode angewandt auf das CardLayout per
show(zweiter_Container, ((String)((JList) e.getSource()).getSelectedValue()))
[ (JList) e.getSource() liefert hierbei die "feste" Liste ]
das CardLayout dazu bringen, die JList anzuzeigen. Doch jedesmal, wenn die show()-Methode aufgerufen wird, bekomme ich eine NullPointerException...
Ein "System.out.println( ((JList) e.getSource()).getSelectedValue() )" liefert aber den korrekten Eintrag in der Liste, und damit doch auch den Namen der Card?...oder muss hier _genau_ das Objekt übergeben werden, mit dem ich add() aufgerufen habe?
Ich wäre für jeden Hinweis dankbar! Ich sitze an diesem Problem nämlich schon mehrere Tage und Nächte und es bremst mich momentan erheblich....
Den Quelltext der benötigten 2 Klassen hänge ich unten mal an, sie werden in einer anderen Klasse instanziiert und verknüpft:
Code:
class PopupOrdnerEingabe extends JDialog implements KeyListener, ActionListener {
/**
*Erstellt ein Popup zur Namensgebung eines neuen ListItems und setzt auch das auslesen des Textfeldes sowie das
*Benennen und Einfügen des neuen Items in die Liste um. Implementiert alle
*benötigten Listener. Bekommt dazu das DefaultListModel durchgereicht.
*Außerdem erstellt es die zum Item dazugehörige (externe) JList, und fügt sie sowohl in den (externen) Container als
*auch in das CardLayout des Containers ein [addLayoutComponent(comp,name)].
*/
DefaultListModel ListOrdnerDaten; //Das Modell (Daten), das hinter der OrdnerListe steht
JTextField Eingabefeld; //Ein neues Eingabefeld für jede neue Instanz der Klasse...es gibt eh nur eine
Container ContainerInternDateiListe; //Innerer Container für die (externe) DateiListe (also, ohne das Label über der Liste etc)
CardLayout ContainerInternDateiListeLayout; //Layout des (externen) DateiListe-Containers
public PopupOrdnerEingabe (DefaultListModel ListOrdnerDaten, DJMixerContainer Hauptfenster,Container ContainerInternDateiListe, CardLayout ContainerInternDateiListeLayout) {
super(Hauptfenster,"Neuer Ordner",true);
this.ContainerInternDateiListe = ContainerInternDateiListe;
this.ContainerInternDateiListeLayout = ContainerInternDateiListeLayout;
this.setLayout(new BorderLayout());
this.ListOrdnerDaten = ListOrdnerDaten;
this.Eingabefeld = new JTextField(100);
this.Eingabefeld.addKeyListener(this);
this.setResizable(false);
this.setSize(400,80);
this.add(new Label("Bitte einen Namen eingeben und mit ENTER bestätigen!"),BorderLayout.NORTH);
this.add(this.Eingabefeld,BorderLayout.CENTER);
}
public static JList erzeugeListe(){ //Hilfsmethode um eine unbenannte Instanz einer JList mehrmals benutzen zu können.
String[] data = {"one", "two", "three", "four"}; //nur zu testzwecken, die wird später anders gefüllt
return new JList(data);
}
public void keyPressed(KeyEvent e) //Methode des KeyListener für die Textzeile (Enter drücken)
{
if(e.getKeyCode()==10){
if(!this.Eingabefeld.getText().trim().isEmpty()){
String auslesen = this.Eingabefeld.getText().trim();
for(int i = 0; i< ListOrdnerDaten.getSize();i++){
if(auslesen.equals(ListOrdnerDaten.get(i))) {
this.Eingabefeld.setText(null);
return;
}
}
JList tempListe = PopupOrdnerEingabe.erzeugeListe();
this.ListOrdnerDaten.addElement(auslesen); //Erzeugt die Benutzereingabe als Item in dem Modell der OrdnerListe
this.ContainerInternDateiListe.add(tempListe,auslesen);//Fügt eine neue JList dem Container der DateiListe hinzu
this.Eingabefeld.setText(null);
this.setVisible(false);
this.ContainerInternDateiListe.validate();
//this.ContainerInternDateiListeLayout.show(this.ContainerInternDateiListe, auslesen);
//System.out.println( auslesen );
//auslesen = null;
}
else{
this.Eingabefeld.setText(null);
}
}
}
public void keyTyped(KeyEvent e){}
public void keyReleased(KeyEvent e){}
public void actionPerformed(ActionEvent ae) { //Methode des ActionListener (Button drücken)
this.setVisible(true);
}
}
class DJMixerOrdnerListListener implements ListSelectionListener {
/**
*Implementiert einen ListSelectionListener, von dem eine Instanz mit der OrdnerListe verknüpft wurde
*und den Wert der Selection an die show()-Methode des CardLayouts des (externen) DateiListe-Containers übergibt.
*Damit wird jedem String-Item in der OrdnerListe eine JList im DateiListe-Container zugeordnet.
*/
Container ContainerInternDateiListe;
CardLayout ContainerInternDateiListeLayout;
public DJMixerOrdnerListListener(Container ContainerInternDateiListe, CardLayout ContainerInternDateiListeLayout){
this.ContainerInternDateiListe = ContainerInternDateiListe;
this.ContainerInternDateiListe = ContainerInternDateiListe;
}
public void valueChanged(ListSelectionEvent e) {
if(!e.getValueIsAdjusting()) {
this.ContainerInternDateiListeLayout.show(this.ContainerInternDateiListe, ((String)((JList) e.getSource()).getSelectedValue()));
//System.out.println( ((JList) e.getSource()).getSelectedValue() );
//System.out.println(this.ContainerInternDateiListe.getComponentCount());
}
}
}
Ich nehme auch gerne Verbesserungsvorschläge für meinen Programmierstil entgegen....ich habe noch nie Feedback bekommen ;-)