Einen JButton in eine JComboBox einfügen

Ryu20

Mitglied
Hallo,

Ich versuche schon seit Stunden einen JButton in eine JComboBox einzufügen. Der JButton soll aber auch auf Klicks reagieren.

Ich habe es auch schon soweit geschafft, einen JButton einzufügen, aber der reagiert leider nicht auf klick events, obwohl ich einen ActionListener hinzugefügt habe.

Vielleicht kann ja hier jemand helfen.

Vielen Dank schon mal.

PS: Falls ihr wollt kann ich auch mein bisheriges Beispiel posten.
 
1. Ja bitte poste mal deinen Code
2. hähh? Was willst du machen?
3. Wieso willst du einen JButton in einer JCombobox darstellen?
4. Wieso legst du keinen Listener auf die Combobox?
 
Hallo,

ich nehme an du hast den jButton über einen eigenen ListCellRenderer in der JComboBox
zur Anzeige gebracht.

Betonung liegt auf "zur Anzeige gebracht" ! Sieht aus wie ein Button ist aber keiner und löst daher auch keine Events aus !

Die Sache über den ComboBoxEditor zu lösen (was bei JTables mit CellEditoren z.B. ne Lösung ist) hilft dir bei der Combo Box auch nicht weiter !

Aber die Frage die sich eigentlich stellt, " WOZU ?"

Erzähl mal was du damit vor hast ?

Gruß JAdix
 
Hi,

Danke schon mal für die Antwort.
Code kann ich leider erst posten wenn der angekommen ist (scheint in der Firewall meines Geschäftes hängen geblieben zu sein) wenn nicht mach ich das später noch mal schnell neu. Außerdem habe ich mir schon andere Lösungen zu meinem Problem überlegt.

Also jetzt meine Grundidee (Problem)

ich wollte erst den ColorChooser verwenden um in einer Tabelle Zellen einzufärben, aber ich habe es nicht hinbekommen beim colorchooser ein mouseclick event zu erzeugen (sobald auf eine Farbe geklickt wird, soll die Zelle eingefärbt werden, auch wenn auf die selbe Farbe noch mal geklickt wird soll z.B. eine andere Zelle auch gefärbt werden.)
Problem das StateChanged Event wurde natürlich nur ausgelöst sobald die Farbe geändert wurde.

Deshalb wollte ich einfach gefärbte JButtons in eine Dropdown setzten und ein einfaches ActionEvent ausführen beim draufklicken.

(Da ich nicht so viele Farben benötige, wie der JColorChoose bietet, wäre dies genug gewesen.)


Jetzt habe ich mir aber überlegt, dass ich einfach zwei Buttons erstelle, einer der die Zelle einfärbt und einer der den JColorChooser öffnet.
Dies wird einfacher sein und schneller (warum ich daran nicht gleich gedacht habe...)


aber falls jemand eine bessere Lösung hat, bin offen für alles ;-)


Und danke schon mal
 
Hallo,

wenn du eine auswahl Farben aus einem DropdownMenü auswählen willst,
dann würde Ich der JComboBox einen ListCellRenderer verpassen der ganz
normal JLabels rendert nur halt farbig oder mit farbigen Icons und Text.

Das mit dem Event nach auswahl der selben Farbe ist sicher problematisch
aber nicht unlösbar.

Nur mit der Button-Technik wird das nix !

Gruß JAdix
 
hi

mein Ziel ist es noch andere Events auszuführen (nicht nur die Farbe holen).

ich habe mal schnell einen Beispiel Code geschrieben (ich weiß nicht sauber aber als beispiel reicht es ;-)

Code:
package de.ms.swing.tests;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ComboBoxEditor;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.event.EventListenerList;

public class teststart {

    public teststart() {
        //Color[] c = { Color.BLACK, Color.BLUE, Color.RED, Color.GREEN};
        JComboBox jcb = new dddd();
        ComboBoxRenderer cbr = new ComboBoxRenderer();
        jcb.setRenderer(cbr);
        jcb.setEditor(new ColorComboBoxEditor(Color.WHITE));
        jcb.setEditable(true);
        jcb.addItem("whatever");
        jcb.addItem("whatever2");
        JFrame fr = new JFrame();
        fr.setLayout(new BorderLayout());
        fr.add(jcb, BorderLayout.PAGE_START);
        fr.setSize(800, 600);
        fr.setVisible(true);

    }

    public static void main(String[] args) {
        new teststart();
    }

    class ColorComboBoxEditor implements ComboBoxEditor {
        final protected JButton editor;

        transient protected EventListenerList listenerList = new EventListenerList();

        public ColorComboBoxEditor(Color initialColor) {
            editor = new JButton("");
            editor.setBackground(initialColor);
            ActionListener actionListener = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println("test");
                }
            };
            editor.addActionListener(actionListener);
        }

        @Override
        public void addActionListener(ActionListener l) {
            // TODO Auto-generated method stub

        }

        @Override
        public Component getEditorComponent() {
            // TODO Auto-generated method stub
            return editor;
        }

        @Override
        public Object getItem() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public void removeActionListener(ActionListener l) {
            // TODO Auto-generated method stub

        }

        @Override
        public void selectAll() {
            // TODO Auto-generated method stub

        }

        @Override
        public void setItem(Object anObject) {
            // TODO Auto-generated method stub

        }
    }

    class ComboBoxRenderer extends DefaultListCellRenderer implements ActionListener{

        @Override
        public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean cellHasFocus) {
            JButton bt = new JButton("testButton");
            bt.setEnabled(true);
            bt.addActionListener(this);
            return bt;
        }

        public void actionPerformed(ActionEvent aev) {
            // TODO Auto-generated method stub
            //Dieses Event soll passieren, wenn auf ein Button in der Combobox geklickt wird. 
            System.out.println("hello");
        }

    }

}
 
Zuletzt bearbeitet:
Hi,

nun habe ich verstanden was du erreichen willst :

Hab deinen Code mal etwas verändert, hier meine Lösung :

Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ComboBoxEditor;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;

public class teststart {

    public teststart() {
        Color[] c = { Color.BLACK, Color.BLUE, Color.RED, Color.GREEN};
        JComboBox jcb = new JComboBox(c);
        ComboBoxRenderer cbr = new ComboBoxRenderer();
        jcb.setRenderer(cbr);
        jcb.setEditor(new ColorComboBoxEditor());
        jcb.setEditable(true);
        jcb.addActionListener(new Listener(jcb));
        JFrame fr = new JFrame();
        fr.getContentPane().add(jcb, BorderLayout.PAGE_START);
        fr.setSize(800, 600);
        fr.setVisible(true);

    }

    public static void main(String[] args) {
        new teststart();
    }

    class ColorComboBoxEditor implements ComboBoxEditor {
        
    	protected JButton editor = null;
    	protected Object item = null;
    	
        public ColorComboBoxEditor() {
 
        	editor = new JButton();
        }
        
        public void addActionListener(ActionListener l) {
        	
        	editor.addActionListener(l);
        }
        
        public Component getEditorComponent() {
        
        	return editor;
        }
        
        public Object getItem() {
            return item;
        }
        
        public void removeActionListener(ActionListener l) {

        	editor.removeActionListener(l);
        }
        
        public void selectAll() {
  
        }
        
        public void setItem(Object anObject) {
                    	
        	item = anObject;
        	
        	if (item instanceof Color ) {
                editor.setBackground((Color)item);
         	}
        }
    }

    class ComboBoxRenderer extends DefaultListCellRenderer {
        
        public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean cellHasFocus) {
        	
            JLabel l= new JLabel(" ");
            if ( value instanceof Color ) {
            	l.setOpaque(true);
            	l.setBackground((Color)value);
            }
            return l;
        }
    }
    
    class Listener implements ActionListener{

    	JComboBox myfunkybox = null;
    	
    	public Listener(JComboBox box) {
    		
    		myfunkybox = box;
    	}
    	
        public void actionPerformed(ActionEvent aev) {
        	
        	System.out.print("Farbe "+myfunkybox.getSelectedItem()+" ausgewählt durch");
            
            if (aev.getActionCommand()=="comboBoxChanged") {
            	System.out.println("selektion");
            } else {
               	System.out.println("buttonklick");
            }
            
        }
    }
}

Hoffe es hilft dir weiter !

Gruß JAdix
 
Abend User

Wie soll den der Code aussehen wenn man anstatt der Labels, Buttons einfügt. Das ist keine Schwierigkeiten allerdings frage ich mich wie ich in der Auswahl einen Rollover -Effekt hin bekomme? Wenn die Auswahl ausgeklappt ist und ich drüberfahre möchte ich gerne das der Button auf dem gerade gezeigt wird den Rollover Effekt anzeigt.

Danke im Voraus.
 
Hallo,

und nocheinmal ... :)

Fügt man durch den ListCellRenderer JButtons ein "SEHEN DIE NUR SO AUS" wie Buttons.
Die Komponenten der Liste haben keine Funktion, d.h. keine Events etc. !

Es wäre sicher möglich selbst noch Mausbewegungen zu analysieren und entsprechend darauf zu reagieren,
dann könnte dann auch erreichen das beim Klicken auf die Komponente diese sich in einen Hasen verwandelt
und aus dem Bild hoppelt ! :)

Wenn man sich nicht mit dem zufrieden geben will was Swing einem ermöglicht,
gibts nur eine Lösung, eine neue Komponente von Grund auf neu implementieren.

In diesem Sinne

Gruß The JAdix

PS an Ryu20 : War eine interessante Aufgabe, hab ich gern gemacht !
 
Zurück