JButton-Click in JList mit Panels (auf dem der Button ist)

Dalanie

Mitglied
Hallo!
Ich habe folgendes Problem (oder besser gesagt zwei 😉 ):

Ich habe eine JList mit Panels. Auf jedem Panel ist ein Button drauf.

Nun versuche ich, die ActionListener der Button zu verwenden, aber dies schlägt fehl. Wenn ich auf den Button klicke, so wird der Eintrag selektiert, aber der Listener reagiert nicht.

Gibt es da irgendwelche anderen Möglichkeiten?

Des Weiteren würde mich interessieren, ob man die Größe eines Eintrags in der JList dynamisch gestalten kann. Soviel Platz, wie mein JPanel brauch, soll es auch in der JList einnehmen

Grüße und Danke im vorraus

d.
 
Hallo Dalanie,

meine Idee ohne den Code zu kennen und zu wissen was du damit bezweckst wäre:
Statt der JList benutzt du einen JPanel der ein VerticalFlowLayout hat.
 
Ich habe eine JList mit Panels. Auf jedem Panel ist ein Button drauf.

Nun versuche ich, die ActionListener der Button zu verwenden, aber dies schlägt fehl. Wenn ich auf den Button klicke, so wird der Eintrag selektiert, aber der Listener reagiert nicht.

Gibt es da irgendwelche anderen Möglichkeiten?
Die JList benutzt zur Darstellung Ihrer Inhalte einen sogenannten Renderer (vgl. ListCellRenderer).

Das bedeuten, das was man in der JList sieht sind keine Buttons sondern nur Abbildungen von Buttons. Daher ist es eigentlich nutztlos Buttons direkt in eine JList zu stecken. Man kann beliebige Objekte (Strings, selbstdefinierte Objekte...) in die JList stecken und sie mittels eines eigen definierten Renderers als JButton darstellen.

Im Gegensatz zu anderen Komponenten (wie JTable, JTree) besitzt sie allerdings keinen Editor. D.h. während es bei letzteren relativ einfach ist einen echten Button als Editor zu verwenden, kann das bei einer JList recht kompliziert werden.
Einfacher wäre hier mittels eines SelektionListeners auf Selektionsänderungen der JList oder mittels MouseListener auf Mausklicks in der JList zur reagieren. (Man hat dann halt nicht den "Button eingedrückt Effekt")
Des Weiteren würde mich interessieren, ob man die Größe eines Eintrags in der JList dynamisch gestalten kann. Soviel Platz, wie mein JPanel brauch, soll es auch in der JList einnehmen
Das geht dann definitiv nur über den ListCellRenderer - kann allerdings je nach Komplexität der Komponente (Objekt mit definierter Höhe vs. JTextArea mit automatischen Zeilenumbruch) etwas kompliziert werden.
 
Hier gehts wohl erstmal um die Entscheidungsfrage, wie ein Problem gelöst werden kann.

Vielleicht erzählst du uns mal genauer, was du bezwecken willst un warum du diesen Knopf in den Listeinträgen beötigst, dann kann man dir eher den richtigen Tip geben.

Gruß Vanny
 
Hey, danke für die Antworten 😉

Also grundlegendes Problem: Wir entwickeln eine Kommentarliste, wo oben links der Name des Verfassers steht und daneben ein E-Mail Button ist, welcher bei klick ein weiteres Fenster öffnet. Dadrunter steht Text. Dies ist zur Zeit in einer JList organisiert und wie oben beschrieben, funktioniert der Button-Click nicht. Die Begründung oben ergibt Sinn, sodass wir eventuell den Button entfernen oder eine andere Variante probieren?

Name Datum Button

Text......................


so wie hier dargestellt sieht in etwa ein Kommentar aus

grüße 😉
 
Ok,

wenn der Button immer die Gleiche Funktion hat, bietet es sich vielleicht an, den Button ausserhalb der JList zu platzieren und beim klick zu schauen, welcher JListeintrag selektiert ist.

PlanB wäre, die JList in die Tonne kloppen und mit JTable zu arbeiten.
Dort könnte man wie auch schon mal hier erwähnt den Button funktionsfähig einbinden.

Gruß Vanny
 
Hatte unlängst das gleiche Problem und hab das ganze mit einem Panel gelöst, auf dem ein GroupLayout liegt, das dynamisch verändert wird. Diese Panel ersetzt quasi die list:
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.GroupLayout.ParallelGroup;
import javax.swing.GroupLayout.SequentialGroup;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class EntryListPanel extends JPanel
{
	class EntryPanel extends JPanel
	{
		String entry;
		
		public EntryPanel(String e)
		{
			entry=e;
		}
		public String getEntry()
		{
			return entry;
		}
	}
	
	
	private static final long serialVersionUID = 1L;
	private SequentialGroup vGroup; // defines the vertical layout
	private ParallelGroup hGroup; // defines the horizontal layout
	private ActionListener actionListener;
	

	public EntryListPanel()
	{
		GroupLayout layout = new GroupLayout(this);
		vGroup = layout.createSequentialGroup();
		hGroup = layout.createParallelGroup(Alignment.CENTER);
		
		layout.setVerticalGroup(vGroup);
		layout.setHorizontalGroup(hGroup);
		this.setLayout(layout);
		
		actionListener = new ActionListener()
		{ 
			@Override
			public void actionPerformed(ActionEvent e)
			{
				EntryPanel panel = (EntryPanel) ((JComponent) e.getSource()).getParent();
				System.out.println(panel.getEntry());
			}
		};
		
	}
	

	public void addEntry(String entry)
	{
		EntryPanel entryPanel=new EntryPanel(entry);
		JLabel entryLabel=new JLabel(entry);
		entryPanel.add(entryLabel);
		
		JButton btnPrint=new JButton("Entry ausgeben");
		btnPrint.addActionListener(actionListener);
		entryPanel.add(btnPrint);
		
		vGroup.addComponent(entryPanel);
		hGroup.addComponent(entryPanel);
		revalidate();
	}
	
	public static void main(String[] args)
	{
		EntryListPanel panel=new EntryListPanel();
		panel.addEntry("Hallo");
		panel.addEntry("Welt");
		panel.addEntry("Was");
		panel.addEntry("los?");
		JFrame frame=new JFrame();
		frame.add(panel);
		frame.pack();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
	
}
 

Zurück
Oben