WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 10.06.2006, 09:36   #1
Schuxl
Veteran
 
Registriert seit: 18.07.2000
Beiträge: 451


Standard Java DefaultListModel Problem

Ich hab ein kleines Problem mit dem DefaultListModel.

Ich würde gerne eine Liste (JList) in einer ScrollPane anzeigen lassen.
Die Liste soll Ihre Daten aus einem ListModel erhalten (DefaultListModel).

Ich möchte das DefaultListModel in einer eigenene Klasse haben.
Daher dachte ich mir ich schreibe eine Klasse namens "MyListModel extends DefaultListModel".
Ich erweitere sozusagen das DefaultListModel.

Aber leider bekomme ich keine Daten in der Liste angezeigt. Die ScrollPane ist also leer.
Es folgt der Code der 2 Klassen.

Hier der Code des "ListBsp"

Code:
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.event.*;


public class ListBsp {
	private JFrame frame;
	private JPanel pane;
	private JPanel listPane;
	private JScrollPane scrolli;
	private JList list;
	private MyListModel listModel;
	private Datenverwaltung dv;


	public ListBsp() {
		frame = new JFrame();
		pane = new JPanel();
		listPane = new JPanel();
		dv = new Datenverwaltung();
	}
	
	
	public void createGUI() {
		//Liste erstellen			
		listModel = new MyListModel(dv);
		list = new JList(listModel);
		list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		list.setLayoutOrientation(JList.VERTICAL);
		list.setVisibleRowCount(-1);
		list.addListSelectionListener( new ListSelectionListener() {
	        public void valueChanged( ListSelectionEvent e ) {
        	
	        }
	      } );

				

		
		
		scrolli = new JScrollPane(list);
		scrolli.setPreferredSize(new Dimension(350,150));
		pane.add(scrolli);
		frame.add(pane);
		frame.setTitle("Telefonbuch Verwaltung");
		frame.setPreferredSize(new Dimension(360,265));
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.pack();
		frame.setVisible(true);
	}
	
	
	
	public static void main(String[] args) {
		ListBsp tg = new ListBsp();
		tg.createGUI();
	}
}
Hier der Code des "MyListModels"

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;



public class MyListModel extends DefaultListModel{
	
	//Datenfelder
	private DefaultListModel listModel;
	private Datenverwaltung dv;
	
	//Konstruktoren
	public MyListModel(Datenverwaltung dv) {
		super();
		listModel = new DefaultListModel();
		listModel.addElement("Bubu");
		listModel.addElement("Bubu2");
		listModel.addElement("Bubu3");
 
	}
	
	
}

Habt Ihr eine Ahnung wieso das nicht funktioniert?
Ich lerne grade erst Java, also bitte nicht lachen falls es Dödl-Code ist
Schuxl ist offline   Mit Zitat antworten
Alt 10.06.2006, 22:35   #2
jak
Inventar
 
Registriert seit: 13.06.2001
Beiträge: 1.830


Standard

Nebenbemerkung:
Du kannst dem JList Konstruktor einen Vector<String> übergeben, der angezeigt wird. Funktioniert stattdessen auch mit einem String[].

Probier mal einen minimalen Testcode:
Code:
...
public void createGUI() {
		//Liste erstellen
		String[] textArr = {"Test"};
		list = new JList(textArr);
		list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		scrolli = new JScrollPane(list);
		scrolli.setPreferredSize(new Dimension(350,150));
		pane.add(scrolli);
		frame.add(pane);
		frame.setTitle("Telefonbuch Verwaltung");
		frame.setPreferredSize(new Dimension(360,265));
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.pack();
		frame.setVisible(true);
	}
____________________________________
Join the DNRC | Godwin\'s Law (thx@stona)
Documentation is like sex: If it\'s good, it\'s very, very good. If it\'s bad, it\'s better than nothing.
\"In theory, theory and practice are the same. In practice, they are not\" (Lawrence Berra)
jak ist offline   Mit Zitat antworten
Alt 13.06.2006, 23:21   #3
Schuxl
Veteran
 
Registriert seit: 18.07.2000
Beiträge: 451


Standard

thx jak

Ich weiß dass das geht. Hab ich beides schon versucht. Aber die TableModels haben einfach zu viele Vorteile um darauf zu verzichten.
Schuxl ist offline   Mit Zitat antworten
Alt 14.06.2006, 09:01   #4
jak
Inventar
 
Registriert seit: 13.06.2001
Beiträge: 1.830


Standard

Trotzdem würd ich fürs debuggen vorschlagen vom Einfachen zum Komplizierten zu gehen:
Zuerst mit Vector ausprobieren, ob der Fehler nicht vielleicht irgendwo in dem ganzen restlichen GUI Zeugs ist.
Dann mit DefaultListModel
Dann mit deinem eigenen ListModel.

jak
____________________________________
Join the DNRC | Godwin\'s Law (thx@stona)
Documentation is like sex: If it\'s good, it\'s very, very good. If it\'s bad, it\'s better than nothing.
\"In theory, theory and practice are the same. In practice, they are not\" (Lawrence Berra)
jak ist offline   Mit Zitat antworten
Alt 14.06.2006, 12:38   #5
Schuxl
Veteran
 
Registriert seit: 18.07.2000
Beiträge: 451


Standard

Es funktioniert wenn ich die Daten des "MyListModel" in der "ListBsp" Klasse unterbringe.

Nur eben nicht wenn ich eine eigene Klasse damit erstelle.

Also Alles funktioniert, inklusive der ListModel Sachen. Es liegt rein am Trennen der Klassen.

OK?
Schuxl ist offline   Mit Zitat antworten
Alt 15.06.2006, 19:04   #6
jak
Inventar
 
Registriert seit: 13.06.2001
Beiträge: 1.830


Standard

Nachdem ich heute ein bischen Zeit hatte hab' ich mir das ganze mal angeschaut.
Es ist relativ klar wieso das nicht funktioniert. Um mir das Beschreiben zu vereinfachen benenne ich die Variable listModel in der Klasse ListBsp in myListModel um, und die Variable listModel in der Klasse MyListModel in defaultListModel. Sonst weiß man nicht was mit listModel gemeint ist.

In der Klasse MyListModel speicherst du die Daten in defaultListModel
Code:
		defaultListModel = new DefaultListModel();
		defaultListModel.addElement("Bubu");
		defaultListModel.addElement("Bubu2");
		defaultListModel.addElement("Bubu3");
d.h. sie liegen von der Klasse ListBsp aus gesehen in: myListModel.defaultListModel.
Der JList übergibst du im Konstruktor myListModel:
list = new JList(myListModel);
Die JList versucht mit myListModel.getSize() die Größe (Zahl der Elemente) zu ermitteln und anschließend mit myListModel.getElementAt() die Elemente zu ermitteln.
Die Funktionen size() und getElementAt() die du aus der Klasse DefaultListModel geerbt hast, arbeiten aber mit der internen Variable in der DefaultListModel die Daten speichert.
Kurz gesagt: size() und getElementAt() haben keine Ahnung davon, daß es die Variablen dv und defaultListModel gibt und ignorieren sie daher.
Wenn du daher die Daten anzeigen willst gibt es zwei Möglichkeiten:
1.)
Code:
//Konstruktoren
	public MyListModel(Datenverwaltung dv) {
		super();
		defaultListModel = new DefaultListModel();
		addElement("Bubu");
		addElement("Bubu2");
		addElement("Bubu3");
 
	}
Damit verwendest du die addElement Methode die du von DefaultListModel geerbt hast. Das ist aber vermutlich nicht das was du willst, besser ist es daher
2.) die Methoden "public int getSize(){}" und "public Object getElementAt(int index){}" so zu überschreiben das sie die gewünschten Daten zurückgeben.

Ich weiß nicht ob du nur Daten im DefaultListModel speichern willst, oder auch in der Datenverwaltung Daten gespeichert werden sollen. Je nachdem musst du halt die Methoden getSize() und getElementAt(1) überschreiben. Außerdem wäre es vermutlich noch klug auch
public void addListDataListener(ListDataListener l);
public void removeListDataListener(ListDataListener l);
und
public void addElement(Object o);
zu überschreiben.

jak
____________________________________
Join the DNRC | Godwin\'s Law (thx@stona)
Documentation is like sex: If it\'s good, it\'s very, very good. If it\'s bad, it\'s better than nothing.
\"In theory, theory and practice are the same. In practice, they are not\" (Lawrence Berra)
jak ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:17 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag