MouseListener im Renderer einer JComboBox

beastofchaos

Bekanntes Mitglied
Hallo Leute,
ich hab hab grad einen Text-Editor gebastelt. Das heißt, es gibt eine JTextArea mit dem Text, 4 Buttons für Fett, Kursiv, Unter- und Durchgestrichen und zwei JComboBoxen, eine ist Editable und für die Größe des Text verantwortlich, die andere enthält alle verfügbaren Font-Namen. Nun versuche ich mich (zuerst nur an der JComboBox mit den Font-Namen) daran, dass, wenn man die JComboBox anklickt und über die Font-Namen fährt, der Text sich automatisch dementsprechend verändert. Also so eine Art Vorschau.

Hier mal der Code, wie ich die ComboBox initialisiere:
Java:
                boxName = new JComboBox();
                boxName.setModel(new DefaultComboBoxModel(getAvailableFontNames()));
                boxName.setRenderer(new StringRenderer(boxName));
                boxName.setPreferredSize(new Dimension(150, 30));
                boxName.addActionListener(adopt);
                boxName.setSelectedItem("SansSerif");

Und hier der Renderer:
Java:
        private class StringRenderer extends JLabel implements ListCellRenderer{
            private String oldName;

	        private StringRenderer(JComboBox target){
	            super();
	            setOpaque(true);
	            setBorder(new LineBorder(Color.white));
	        }
	
	        private void temporaryAdoptToActual(){
	            Design actual = Saves.properties.process.getActual();
	            if (actual != null && actual.getMode() == Design.TEXT){
	                TextDesign td = (TextDesign) actual;
	                td.setFontName(getText());
	            }
	        }
	
	        private void resetAdopt(){
	            Design actual = Saves.properties.process.getActual();
	            if (actual != null && actual.getMode() == Design.TEXT){
	                TextDesign td = (TextDesign) actual;
	                td.setFontName(oldName);
	                td.setFontName(getText());
	            }
	        }
	
	        @Override
	        public Component getListCellRendererComponent(
	                                           JList list,
	                                           Object value,
	                                           int index,
	                                           boolean isSelected,
	                                           boolean cellHasFocus) {
	            String s = (String) value;
	            setText(s);
	
	            if (isSelected){
	                setBackground(new Color(235, 235, 255));
	                temporaryAdoptToActual();
	            }
	            else
	                setBackground(new Color(215, 215, 255));
	            return this;
	        }

Also das mit dem Rüberfahren geht sogar schon. Er fragt in
Code:
getListCellRendererComponent()
ab, ob diese Komponente selektiert ist. Wenn ja, übernimmt er mit der Methode
Code:
temporaryAdoptToActual()
den Font-Namen auf den Font in der JTextArea, Wenn ich nun aber nach so einem Rüberfahren außerhalb der JComboBox klicke, schließt sich die JComboBox-Liste und der vorher ausgewählte Name wird angezeigt. Problem: In der JTextArea ist nun aber noch das vorher selektierte als Font aktiv. Ich muss es also iwo schaffen, dass meine Methode
Code:
resetAdopt()
ausgerufen wird. Dachte dabei zuerst daran, dass ich in getListCellRenderComponent() einfach folgenden Code einbaue:
Java:
if (!boxName.isPopupVisible()){
    resetAdopt();
}

Leider wird das erst aufgerufen, wenn ich zweimal auf außerhalb der JComboBox klicke, das eine Mal schließt das Popup, das zweite mal gibt es einer anderen Komponente den Fokus.

Am idealsten fände ich es aber, wenn, sobald man das JLabel mit dem Fontnamen verlässt, der vorherige Fontname wieder benutzt. Nicht erst, wenn man öfters "um sich geklickt" hat.

Meine Idee war darauf, dass ich einfach mit der Mouse-Methode
Code:
mouseExited(MouseEvent e)
das einleiten kann. Hab also jeder ListCellRenderer-Komponente den MouseListener angehängt, der "resetAdopt()" aufruft, aber der wird nie aufgerufen. Iwie verhidnert die JComboBox den Aufruf von Listenern... Weiß jemand dafür eine Lösung?

Habs jetzt mit "mouseExited()" auf die JComboBox selbst versucht, aber da arbeitet die Zeile 37-40 im geposteten Code entgegen. Schließlich bleibt die eine Komponente selektiert, solange das Popup offen ist. Also kann ich das auch nciht so lassen. Perfekt wäre am Ende, nur "mouseEntered()" und "mouseExited()" dafür zu benutzen. Bleibt also nur die Frage, wie schaffe ich es, den MouseListener erfolgreich den Komponenten in der JComboBox zu übergeben?

Gruß, Thomas
 

Michael...

Top Contributor
wenn ich das richtig verstehe reicht es einfach einen PopupMenuListener an der JComboBox zu registrieren und auf popupMenuCanceled zu reagieren.
Die Methode zum "Zwischenspeichern" der tatsächlichen Selektion und die Methode zum zurücksetzen im Renderer sind nicht notwendig. Erstens speichter ja die ComboBox bzw. deren Model die aktuelle Selektion (sonst würde der Wert nach Abbruch des Popups nicht in der Box angezeigt werden) und zweitens ist der Render für eine Rücksetzen Methode definitiv die falsche Stelle.
 

thE_29

Top Contributor
Falls ich dich richtig verstehe, wärst du am Besten mit einem PopupMenuListener dran...

Da gibt es die Methode
Java:
public void popupMenuCanceled(PopupMenuEvent e) {

Glaube die würde am Besten für dich zutreffen.. Dort drinnen halt abfangen, dass er den Wert wieder auf das alte setzt...

Edit: tjo, hätte ich F5 gedrückt, hätte ich nichtmal antworten müssen.. :D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Viele ActionListener (MouseListener) - Performance AWT, Swing, JavaFX & SWT 24
ExceptionOfExpectation MouseListener-Objekte zu den Graphics-Objekten einfügen AWT, Swing, JavaFX & SWT 3
R Punkt von MouseListener hat falsche Koordinate AWT, Swing, JavaFX & SWT 2
J MouseListener wird nicht ausgeführt. AWT, Swing, JavaFX & SWT 4
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
G vorgefertigte Buttons oder neue Komponente mit MouseListener? AWT, Swing, JavaFX & SWT 0
F ListCellRenderer mit JLabel und MouseListener AWT, Swing, JavaFX & SWT 4
D Event Handling MouseListener funktioniert seit Java 8 nicht mehr AWT, Swing, JavaFX & SWT 13
M MouseListener auf table oder scrollPane AWT, Swing, JavaFX & SWT 11
B Event Handling MouseListener Behält seine Variablen, auch wenn ich ein neus Objekt erstelle AWT, Swing, JavaFX & SWT 2
D Swing &MouseListener in einem JFrame, sinnig? AWT, Swing, JavaFX & SWT 11
U MouselIstener zu JFrame AWT, Swing, JavaFX & SWT 6
F Swing MouseListener im JPanel AWT, Swing, JavaFX & SWT 3
J Swing Button mit JTable und MouseListener AWT, Swing, JavaFX & SWT 8
F JPanel + MouseListener AWT, Swing, JavaFX & SWT 5
JavaInBrain Swing Rückgabe aus MouseListener-Klasse AWT, Swing, JavaFX & SWT 3
A SWT SWT Scale und MouseListener AWT, Swing, JavaFX & SWT 7
J MouseListener und rechte Maustaste AWT, Swing, JavaFX & SWT 3
R MouseListener auf JPanel AWT, Swing, JavaFX & SWT 3
Q Swing MouseListener auf JTable geht nicht AWT, Swing, JavaFX & SWT 2
J Swing Einbau MouseListener in JPanel AWT, Swing, JavaFX & SWT 3
N Mit MouseListener X-Y Angaben vom Bild erfahren AWT, Swing, JavaFX & SWT 3
T MouseListener an Ecken von Polygonen hinzufügen AWT, Swing, JavaFX & SWT 5
H Swing JPanel in JTable mit MouseListener AWT, Swing, JavaFX & SWT 3
A Individueller MouseListener ? AWT, Swing, JavaFX & SWT 7
P AWT MouseListener unklare abhandlung von Events AWT, Swing, JavaFX & SWT 3
M MouseListener/MouseMotionListener AWT, Swing, JavaFX & SWT 2
njans SWT MouseListener exited AWT, Swing, JavaFX & SWT 4
danx066 MouseListener macht was er will AWT, Swing, JavaFX & SWT 14
K MouseListener für Objekte auf einem Frame AWT, Swing, JavaFX & SWT 4
P JLabel Farbe/Bild ändern aus MouseListener heraus AWT, Swing, JavaFX & SWT 3
U Swing Generierung mehrerer Kreise per MouseListener AWT, Swing, JavaFX & SWT 16
Semox Swing JApplet: Problem MouseListener Anmeldung AWT, Swing, JavaFX & SWT 3
C JTappedPane Mouselistener auf Überschrift Registerkarte AWT, Swing, JavaFX & SWT 2
M MouseListener AWT, Swing, JavaFX & SWT 3
K AWT MouseListener linke und rechte Maustaste AWT, Swing, JavaFX & SWT 5
C Swing MouseListener Doppelklick-Geschwindigkeit AWT, Swing, JavaFX & SWT 4
N Swing MouseListener in JTable AWT, Swing, JavaFX & SWT 4
1 Eigene JComponent mit MouseListener versehen AWT, Swing, JavaFX & SWT 10
Developer_X AWT Component added keinen MouseListener AWT, Swing, JavaFX & SWT 7
R MouseListener wird nicht aufgerufen AWT, Swing, JavaFX & SWT 3
P JComboBox und MouseListener AWT, Swing, JavaFX & SWT 2
W MouseListener im editable ComboBox AWT, Swing, JavaFX & SWT 14
raptorrs Swing MouseListener reagiert nicht auf Instanz einer JTable AWT, Swing, JavaFX & SWT 6
multiholle Swing Mouselistener auf Parentpanel immer aktiv AWT, Swing, JavaFX & SWT 7
C MouseListener und ActionListener kombinieren AWT, Swing, JavaFX & SWT 17
M Komponenten einer unbestimmten Anzahl und MouseListener AWT, Swing, JavaFX & SWT 4
A MouseListener funktionert nie AWT, Swing, JavaFX & SWT 12
C Probleme mit Größe und mit MouseListener AWT, Swing, JavaFX & SWT 2
W MouseListener für jede Zelle einer JTable AWT, Swing, JavaFX & SWT 4
E MouseListener Problem AWT, Swing, JavaFX & SWT 4
D jButton mit ImageIcon & MouseListener AWT, Swing, JavaFX & SWT 5
S MouseListener zurückverfolgung auf element. AWT, Swing, JavaFX & SWT 7
B MouseListener / doppelklick geht net AWT, Swing, JavaFX & SWT 16
M JCheckBox Standard MouseListener entfernen AWT, Swing, JavaFX & SWT 13
hdi Wie mach ich diesen MouseListener AWT, Swing, JavaFX & SWT 4
G MouseListener & KeyListener AWT, Swing, JavaFX & SWT 4
H JComboBox reagiert nicht auf MouseListener AWT, Swing, JavaFX & SWT 5
2 Mouselistener AWT, Swing, JavaFX & SWT 2
W MouseListener, getClickCount und Doppelklick AWT, Swing, JavaFX & SWT 6
S swing komponenten mit mouselistener rotieren AWT, Swing, JavaFX & SWT 15
G JFrame,JLabel,MouseListener AWT, Swing, JavaFX & SWT 6
F Wie MouseListener bei TableModel anmelden? AWT, Swing, JavaFX & SWT 3
V Frage zu MouseListener --> mousePressed() AWT, Swing, JavaFX & SWT 5
C MouseListener für Spalte eines JTables AWT, Swing, JavaFX & SWT 4
K Problem mit 2 MouseListener. AWT, Swing, JavaFX & SWT 3
M MouseMotionListener oder mouseListener AWT, Swing, JavaFX & SWT 6
T JComboBox und MouseListener AWT, Swing, JavaFX & SWT 11
F MouseListener - Unhandled IOException AWT, Swing, JavaFX & SWT 5
padde479 Statusleiste mit MouseListener aktualisieren AWT, Swing, JavaFX & SWT 3
L Problem mit MouseListener, AdjustmentListener AWT, Swing, JavaFX & SWT 6
T MouseListener Problem AWT, Swing, JavaFX & SWT 3
F Mouselistener wird wiederholt aufgerufen AWT, Swing, JavaFX & SWT 3
G Frage zu MouseListener und speichern des Wertes (reflektion? AWT, Swing, JavaFX & SWT 6
B frage zu MouseListener AWT, Swing, JavaFX & SWT 5
O MouseListener - Wert-Übergabe AWT, Swing, JavaFX & SWT 3
W JPanel, JLabel und MouseListener -> auf clicks reagieren AWT, Swing, JavaFX & SWT 5
S MouseListener auf einem einzelnen Tab setzen AWT, Swing, JavaFX & SWT 3
B MouseListener & Fenster schliessen AWT, Swing, JavaFX & SWT 3
G MouseListener AWT, Swing, JavaFX & SWT 4
G Tooltip sperrt MouseListener? AWT, Swing, JavaFX & SWT 6
S JComboBox und MouseListener AWT, Swing, JavaFX & SWT 5
D Koordinaten der Bildschirmposition auslesen (MouseListener?) AWT, Swing, JavaFX & SWT 7
A Klassenübergreifend MouseListener verwenden AWT, Swing, JavaFX & SWT 14
N "globaler" MouseListener (+MouseMotionListener) AWT, Swing, JavaFX & SWT 4
M ToolTipText für JTable mit MouseListener ohne anklicken? AWT, Swing, JavaFX & SWT 7
A MouseListener auf Bild legen ? AWT, Swing, JavaFX & SWT 16
S Mouselistener erzeugt kein Event in einem Menuitem AWT, Swing, JavaFX & SWT 2
J MouseListener AWT, Swing, JavaFX & SWT 3
A JPanels in JPanel und MouseListener AWT, Swing, JavaFX & SWT 3
C Mehrere MouseListener? AWT, Swing, JavaFX & SWT 7
U Keylistener und Mouselistener AWT, Swing, JavaFX & SWT 2
L Event-handling, MouseListener AWT, Swing, JavaFX & SWT 5
T Problem mit MouseListener bei JButton AWT, Swing, JavaFX & SWT 5
K mein keyListener scheint Konflict haben mit mouseListener AWT, Swing, JavaFX & SWT 6
G Problem mit MouseListener AWT, Swing, JavaFX & SWT 9
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
L JavaFX Renderer für JavaFX AWT, Swing, JavaFX & SWT 2
T Table Renderer AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben