Combobox als "Textfield" benutzen

Davtorik

Mitglied
hi ! Kurze frage, konnte im board nichts ausfindig machen...wenn meine JCombox erzeugt wird ohne dass elemente drinn stehen sollte dieser kleine arrow button deaktiviert sein, bzw. bei mir erscheint im moment auch wenns leer ist eine leere auswahlliste. meine combobox ist editable und das erste element ein leerer string

hidePopup etc haben nicht geholfen :confused:



Wäre nett,wenn ihr mir helfen könntet
 
Hallo David,

das deaktivieren und aktivieren des Buttons klappt zwar, allerdings passt das Aussehen nicht mehr dem Look And Feel. Hab jetzt auf die schnelle nicht herausfinden können woran das liegt.

Aber solche Feinheiten solltest du erstmal weglassen, sonst wird die Anwendung nie fertig. Erst wenn du das Gröbste hast, kannst du ja noch bissel hier, bissel da spielen. Und das sich ein PopupMenu öffnet, ohne das Elemente drin sind, ist kein Weltuntergang. Das Problem hierbei ist, das es keine Standardmethode gibt die das regelt, so muss man sich intensiv mit dem Aufbau der Swingkomponenten beschäftigen um diese ordentlich modifizieren zu können.

Java:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.plaf.ComboBoxUI;
import javax.swing.plaf.basic.BasicComboBoxUI;

public class MyJComboBox extends JFrame implements ActionListener {

	private JComboBox c = new JComboBox();

	private JButton b = new JButton("Change");

	private MyUI m = new MyUI();

	public MyJComboBox() {
		super("Example");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setAlwaysOnTop(true);
		this.setLocationByPlatform(true);

		c.setEditable(true);
		c.setUI((ComboBoxUI) m);
		m.deactivatePopupMenu();
		b.addActionListener(this);

		this.add(c, BorderLayout.NORTH);
		this.add(b, BorderLayout.SOUTH);

		this.pack();
		this.setVisible(true);
	}

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

	public void actionPerformed(ActionEvent e) {
		if (m.isActive())
			m.deactivatePopupMenu();
		else
			m.activatePopupMenu();
	}

	class MyUI extends BasicComboBoxUI {

		private boolean isArrowButtonActive = false;

		public MyUI() {
			super();
		}

		public void activatePopupMenu() {
			arrowButton.setEnabled(true);
			arrowButton.addMouseListener(popup.getMouseListener());
			isArrowButtonActive = true;
		}

		public void deactivatePopupMenu() {
			arrowButton.removeMouseListener(popup.getMouseListener());
			arrowButton.setEnabled(false);
			isArrowButtonActive = false;
		}

		public boolean isActive() {
			return isArrowButtonActive;
		}
	}
}


Vg Erdal
 
hab jetzt eine Lösung gefunden, allerdings ein wenig unortodox....

die deprecated Methoden .disable() und .enable()

tun genau das, was ich will.....die Methoden setEnable() etc nicht

sonst gibts wahrscheinlich keine bessere lösung.


Kann man die Methoden benutzen, wenns anders nich geht? Oder wie sieht das mit deprecated aus?
 
Zurück