Swing JPanel einer JList übergeben

Existenzhass

Mitglied
Hallo,
ich habe ein folgendes Problem. Ich schreibe gerade ein Programm, das eine Todo List darstellen soll. Es sollte so aussehen, das ich einen kompletten Inhalt von JPanel an einen JListModel weiterleite und das an der grafischen Oberfläche anzeigen lasse. Allerdings ist mein Problem dies weiter zu leiten. Ebenso wird der JPanel von einer anderne Klasse gefüllt <- das bekomme ich noch hin. Was ich nicht hinbekomme ist, den Panel an die JList weiter zu leiten und dies anzeigen lassen. Hier sind meine Lösungsversuche:

EntryPanel (der JPanel)
Java:
package TODO;
import java.awt.*;
import java.util.*;
import javax.swing.*;

public class EntryPanel extends JPanel{

	private JCheckBox	checkBox;
	private JLabel		datum;
	private JLabel		termination;
	private boolean		checked;
	private String 		date;
	private String 		term;
	
	EntryPanel(boolean checked, String date, String term){

		GridBagLayout gridbagL = new GridBagLayout();
		GridBagConstraints gridbagC = new GridBagConstraints();

		termination = new JLabel(getTerm());
		datum		= new JLabel(getDate());
		checkBox	= new JCheckBox();
		
		this.setLayout(gridbagL);

		gridbagC.anchor = GridBagConstraints.LINE_START;

		gridbagC.gridx		= 1;
		gridbagC.gridy		= 1;
		gridbagC.weightx	= 0;
		this.add(checkBox);

		gridbagC.fill	 = GridBagConstraints.HORIZONTAL;

		gridbagC.gridx 		= 2;
		gridbagC.gridy 		= 1;
		gridbagC.weightx	= 2;
		this.add(datum);

		gridbagC.gridx 		= 3;
		gridbagC.gridy 		= 1;
		gridbagC.weightx	= 2;
		this.add(termination);
	}

	public String getDate() {
		return date;
	}

	public void setDate(String taskTime) {
		this.date = taskTime;
	}

	public String getTerm() {
		return term;
	}

	public void setTerm(String term) {
		this.term = term;
	}
}

Und hier ist die GUI mit der JList
Java:
	private JMenuItem		menuItem		= new JMenuItem("...mit SQL Datenbanken");
	private JMenuItem		menuItemAdd		= new JMenuItem("Eintrag hinzufügen");
	private JMenuItem		menuItemDel		= new JMenuItem("Eintrag löschen");
	private JMenuItem		menuItemClose	= new JMenuItem("Schliessen");
	private JMenuItem		menuItemAbout	= new JMenuItem("Info");
	private DefaultListModel<JPanel> model 	= new DefaultListModel<JPanel>();
	private JList<JPanel>	myList			= new JList<JPanel>();
	private JFrame			myFrame;
	private String date = null;
	private String term = null;	
	EntryPanel ep = new EntryPanel(true, date, term);

	
	GUI(){
		
		date = ep.getDate();
		term = ep.getTerm();
		
		JMenuBar 	myMenu			= new JMenuBar();
		JMenu		menuConnection	= new JMenu("Verbindung");
		JMenu		menuSettings	= new JMenu("Bearbeiten");
		JMenu		menuDisplay		= new JMenu("Anzeige");
		JMenu		menuInfo		= new JMenu("Info");

		myFrame			= new JFrame("TODO List");
		menuItem		= new JMenuItem("...mit SQL Datenbanken");
		menuItemAdd		= new JMenuItem("Eintrag hinzufügen");
		menuItemDel		= new JMenuItem("Eintrag löschen");
		menuItemClose	= new JMenuItem("Schliessen");
		menuItemAbout	= new JMenuItem("Info");

		menuItemAdd.addActionListener(this);
		menuItemAdd.setActionCommand("add");
		menuItemClose.addActionListener(this);
		menuItemClose.setActionCommand("close");
		menuItemAbout.addActionListener(this);
		menuItemAbout.setActionCommand("info");

		myFrame.setLayout(new BorderLayout());
		
		//Implementierung MenuBar in die Frame
		myFrame.add(myMenu);
		myFrame.setJMenuBar(myMenu);

		//Implementierung MenuItems in die Menus
		myMenu.add(menuConnection);
		myMenu.add(menuSettings);
		myMenu.add(menuDisplay);
		myMenu.add(menuInfo);

		menuConnection.add(menuItem);
		menuSettings.add(menuItemAdd);
		menuSettings.add(menuItemDel);
		menuDisplay.add(menuItemClose);
		menuInfo.add(menuItemAbout);

		myFrame.setSize(400,200);
		myFrame.setResizable(false);
		myFrame.setLocationRelativeTo(null);
		myFrame.setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		
		myFrame.add(myList, BorderLayout.CENTER);
		model.addElement(new EntryPanel(true, ep.getDate(), ep.getTerm()));
		model.addElement(ep);
		
		myFrame.setVisible(true);
		
	}//GUI()

public void actionPerformed(ActionEvent ae) {
		if(ae.getActionCommand().equals("add")){
			AddDialog aD = new AddDialog();
			EntryPanel EntryPanel = new EntryPanel(false, date, term);
			
			}
Ich zeige allerdings die meist relevanten Elemente meinen Code. Weitere Fragen werde ich schnell beantworten. Vielen Dank im Voraus für eure Hilfe. Die weiß ich wirklich zu schätzen.
 

turtle

Top Contributor
Dieses Konstrukt finde ich merkwürdig! WAS soll denn die Jlist anzeigen, wenn ich "beliebige" JPanels hinzufüge? Beispielsweise könnte ein JPanel zwei Textfelder, das zweite drei JButtons haben und die JList soll es wie anzeigen?

Lies dafür doch mal das Tutorial durch. Insbesondere der Abschnitt zu Cell Renderer solltest du beachten.
 

Existenzhass

Mitglied
Dieser Eintrag: JList<JPanel> war eine Empfehlung von meinen Lehrer. Der Panel hat insgesamt drei Werte. Einmal ist es eine JCheckbox, ein String mit der Beschreibung und ein String mit dem Datum.
Danke für die Schnelle antwort. Ich werde den Tutorial jetzt durchlesen.
Danke noch mals!
 

strußi

Top Contributor
mach dir eine Modell "Aufgabe"

daraus erstellst du für jede Aufgabe ein Object und dieses Object kannst du dann deiner JList hinzufügen, und wenn du diese wieder auslesen willst kannst du mittels getter auf die Objectdaten zugreifen und auf das Panel hinzufügen
 
Zuletzt bearbeitet:

Existenzhass

Mitglied
Danke für die Hinweise. Der EntryPanel war ja schon ein Objekt von vorne. Jetzt bin ich mit dem Programm weiter gekommen, jedoch das einzige was ich zu sehen bekomme ist:

2ypawk7.jpg


Die Checkbox ist auch nur so da. Man kann sie auf jeden Fall nicht aktivieren. Kann mir jemand ein Tipp geben, woran es liegen kann? Vielen Dank im Voraus!
 

Existenzhass

Mitglied
Oh, sorry. Bin heute schon zu lange dabei. :D
Hier ist der Code, wo die Daten eingegeben werden:

Java:
import java.awt.*;
import java.awt.event.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import javax.swing.*;

public class AddDialog implements ActionListener{

	private SimpleDateFormat	df 				= new SimpleDateFormat("dd.MM.yyyy HH:mm");
	private	Date 				date			= null;
	private JLabel		      	term 			= new JLabel();
	private JLabel            	info 			= new JLabel();
	private JTextField[]		fields 			= new JTextField[2];
	private JButton    	   		okButton 		= new JButton("OK");
	private JButton   			cancelButton	= new JButton("Cancel");
	private	String				taskType;
	private	String				taskTime;
	private JDialog 	  		myDialog;
	private ActionListener 		okListener;
	private JPanel 				myPane;
	private GridBagConstraints 	c;

	AddDialog(){


		GridBagLayout gbl 	 = new GridBagLayout();
		GridBagConstraints c = new GridBagConstraints();

		myDialog 			 = new JDialog(myDialog,"TODO");
		myDialog.setTitle("TODO");

		term			= new JLabel("Bezeichnung: ");
		info			= new JLabel("Datum und Uhrzeit: ");
		fields			= new JTextField[2];
		JPanel myPane	= new JPanel(gbl);
		okButton.addActionListener(this);
		okButton.setActionCommand("OK");
		cancelButton.addActionListener(this);
		cancelButton.setActionCommand("cancel");


		myDialog.setContentPane(myPane);
		c.insets = new Insets(2,5,2,5);
				
		c.anchor = GridBagConstraints.LINE_START;

		c.gridx = 1;
		c.weightx = 0;
		c.gridy = 1;
		myPane.add(term, c);

		c.gridx = 1;
		c.gridy = 2;
		myPane.add(info, c);

		c.gridx = 1;
		c.gridy = 3;
		myPane.add(okButton, c);

		c.anchor = GridBagConstraints.LINE_END;

		c.gridx = 3;
		c.gridy = 3;
		myPane.add(cancelButton, c);

		c.fill	 = GridBagConstraints.HORIZONTAL;

		c.gridx = 3;
		c.weightx = 1;
		c.gridy = 1;
		//An dieser Stelle werden die Textfelder im GUI festgelegt
		for (int i = 0; i < fields.length; i++) {
			fields[i] = new JTextField();
			myPane.add(fields[i], c);
			c.gridy++;
		}//for
		
		fields[1].setToolTipText("dd.MM.yyyy HH:mm");//ToolTip für Datum setzen

		myDialog.setSize(400,120);
		myDialog.setModal(true);
		myDialog.setResizable(false);
		myDialog.setLocationRelativeTo(null);
		myDialog.setVisible(true);
		
		
	}

	@Override
	public void actionPerformed(ActionEvent ae) {
		//Wenn gedruckt, wird das Fenster geschlossen
		if (ae.getActionCommand().equals("cancel")){
			myDialog.setVisible(false);
			myDialog.dispose();
		}
		else if (ae.getActionCommand().equals("OK")){
			//Falls einer Der Felder Lehr, eine Meldung anzeigen!
			if(fields[0].getText().isEmpty()||fields[1].getText().isEmpty()){
				int eingabe = JOptionPane.showConfirmDialog(myDialog, 
						"Einer der Eingabefelder ist leer," +
								" tortzdem fortfahren?", "Warnung",
										JOptionPane.YES_NO_CANCEL_OPTION);
		
			}
			//Einträge aus den Textfeldern als String speichern
			taskType = fields[0].getText();
			taskTime = fields[1].getText();

			try {//An dieser Stelle wird die Gültigkeit des Datums überprufft
				date = df.parse(taskTime);
			} catch (ParseException e) {
				JOptionPane.showMessageDialog(myDialog,
						"Kein gültiges Datum.",
						"Error",
						JOptionPane.ERROR_MESSAGE);
			}
			
			//An dieser Stelle wird die Beschreibung und das Datum an EntryPanel weiter geleitet
			EntryPanel eP = new EntryPanel(true, taskTime, taskType);													
			try {df.parse(taskTime);} catch (ParseException e) {e.printStackTrace();}
			eP.setTerm(taskType);//setter für Beschreibung vom EntryPanel holt sich die Beschreibung (String)
			eP.setDate(taskTime);//setter für Datum vom EntryPanel holt sich die Datum(String)
			//fertig mit übergabe an EntryPanel
			
			dispose();//Fenster schliessen
		}//else if (ae.getActionCommand().equals("OK")){
	}//actionPerformed
	
	public void dispose() {
		myDialog.dispose();
	}


	public void setOkListener(ActionListener ae){
		this.okListener = ae;
	}

	public String getTaskType() {
		return taskType;
	}

	public void setTaskType(String taskType) {
		this.taskType = taskType;
	}

	public Date getDate() {
		return date;
	}

	public void setDate(Date date) {
		this.date = date;
	}

}

Hier ist die Klasse EntryPanel, dies sind die Panels die generiert und zu der Liste hinzugefügt werden
Java:
public class EntryPanel extends JPanel{

	private JCheckBox	checkBox;
	private JLabel		datum;
	private JLabel		termination;
	private boolean		checked;
	private String 		date;
	private String 		term;
	
	EntryPanel(boolean checked, String date, String term){

		GridBagLayout gridbagL = new GridBagLayout();
		GridBagConstraints gridbagC = new GridBagConstraints();

		termination = new JLabel(getTerm());
		datum		= new JLabel(getDate());
		checkBox	= new JCheckBox();
		
		this.setLayout(gridbagL);
		
		gridbagC.anchor = GridBagConstraints.LINE_START;

		gridbagC.gridx		= 1;
		gridbagC.gridy		= 1;
		gridbagC.weightx	= 0;
		this.add(checkBox);

		gridbagC.fill	 = GridBagConstraints.HORIZONTAL;

		gridbagC.gridx 		= 2;
		gridbagC.gridy 		= 1;
		gridbagC.weightx	= 2;
		this.add(datum);

		gridbagC.anchor = GridBagConstraints.LINE_END;
		
		gridbagC.gridx 		= 3;
		gridbagC.gridy 		= 1;
		gridbagC.weightx	= 2;
		this.add(termination);
	}

	public String getDate() {
		return date;
	}

	public void setDate(String taskTime) {
		this.date = taskTime;
	}

	public String getTerm() {
		return term;
	}

	public void setTerm(String term) {
		this.term = term;
	}
}

Und hier noch mal die GUI mit der Liste:
Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.*;

import javax.swing.*;

@SuppressWarnings("serial")
public class GUI extends JFrame implements ActionListener{

	private JMenuItem		menuItem		= new JMenuItem("...mit SQL Datenbanken");
	private JMenuItem		menuItemAdd		= new JMenuItem("Eintrag hinzufügen");
	private JMenuItem		menuItemDel		= new JMenuItem("Eintrag löschen");
	private JMenuItem		menuItemClose	= new JMenuItem("Schliessen");
	private JMenuItem		menuItemAbout	= new JMenuItem("Info");
	private DefaultListModel<JPanel> model 	= new DefaultListModel<JPanel>();
	private JList<JPanel>	myList			= new JList<JPanel>();
	private JFrame			myFrame;
	private String date = null;
	private String term = null;	
	EntryPanel ep = new EntryPanel(true, date, term);

	
	GUI(){
		myList 	= new JList<JPanel>(model);
		
		date = ep.getDate();
		term = ep.getTerm();
		
		JMenuBar 	myMenu			= new JMenuBar();
		JMenu		menuConnection	= new JMenu("Verbindung");
		JMenu		menuSettings	= new JMenu("Bearbeiten");
		JMenu		menuDisplay		= new JMenu("Anzeige");
		JMenu		menuInfo		= new JMenu("Info");

		myFrame			= new JFrame("TODO List");
		menuItem		= new JMenuItem("...mit SQL Datenbanken");
		menuItemAdd		= new JMenuItem("Eintrag hinzufügen");
		menuItemDel		= new JMenuItem("Eintrag löschen");
		menuItemClose	= new JMenuItem("Schliessen");
		menuItemAbout	= new JMenuItem("Info");

		menuItemAdd.addActionListener(this);
		menuItemAdd.setActionCommand("add");
		menuItemClose.addActionListener(this);
		menuItemClose.setActionCommand("close");
		menuItemAbout.addActionListener(this);
		menuItemAbout.setActionCommand("info");

		myFrame.setLayout(new BorderLayout());
		
		//MenuBar in die Frame setzen
		myFrame.add(myMenu);
		myFrame.setJMenuBar(myMenu);

		//MenuItems zu der Menubar hinzufügen
		myMenu.add(menuConnection);
		myMenu.add(menuSettings);
		myMenu.add(menuDisplay);
		myMenu.add(menuInfo);

		menuConnection.add(menuItem);
		menuSettings.add(menuItemAdd);
		menuSettings.add(menuItemDel);
		menuDisplay.add(menuItemClose);
		menuInfo.add(menuItemAbout);

		myFrame.setSize(400,200);
		myFrame.setResizable(false);
		myFrame.setLocationRelativeTo(null);
		myFrame.setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		//JList und JModel
		myFrame.add(myList, BorderLayout.CENTER);
		myList.setModel(model);
		myList.setCellRenderer(new PanelRenderer());
		myList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
		myList.setLayoutOrientation(JList.VERTICAL);
		JScrollPane listScroller = new JScrollPane(myList);
		listScroller.setPreferredSize(new Dimension(250, 80));
		
		
		
		myFrame.setVisible(true);
		
	}//GUI()

	public void actionPerformed(ActionEvent ae) {
		//AddDialog wird aufgerufen um die Panels an die Liste zu übergeben
		if(ae.getActionCommand().equals("add")){
			AddDialog aD = new AddDialog();
			//An dieser Stelle werden die fertigen JPanels zu der Liste hinzugefügt
			EntryPanel EntryPanel = new EntryPanel(false, ep.getDate(), ep.getTerm());
			int index = 0;
			model.add(index, ep);
			index++;
			System.out.println(myList);
			
			}
		//Wenn gedruckt, wird der Eintrag gelöscht
		else if (ae.getActionCommand().equals("Eintrag löschen")){
			int index = myList.getSelectedIndex();
			model.remove(index);
		}

		if(ae.getActionCommand().equals("close")){
			int eingabe = JOptionPane.showConfirmDialog(myFrame, "Wirklich schließen?",
					"bla" , JOptionPane.YES_NO_CANCEL_OPTION);
			if(eingabe == 0){myFrame.dispose();}
		}

		if(ae.getActionCommand().equals("info")){
			JOptionPane.showMessageDialog(myFrame, "TODO´s 2014 ©\nvon \nKamil Kosinski");
		}
	}//actionPerformed(ActionEvent ae)
}//GUI

Und noch der PanelRenderer
Java:
import javax.swing.*;


public class PanelRenderer implements ListCellRenderer<JPanel> {

	@Override
	public JPanel getListCellRendererComponent(JList<? extends JPanel> list,
			JPanel value, int index, boolean isSelected, boolean cellHasFocus) {
						
		
		return value;
		
	}
}
 

strußi

Top Contributor
du hast zwar in
EntryPanel
parameter aber die benutzt du nicht. probier mal
termination = new JLabel( term);
datum = new JLabel( date);
checkBox = new JCheckBox();
checkBox.setSelected( checked);

das sollte das problem beheben
 

Neue Themen


Oben