Swing Nicht möglich für ein JPanel den Fokus zu bekommen?

DStrohma

Bekanntes Mitglied
Hallo,

ich habe zu dem Thema hier im Forum schon gesucht aber keine Lösung gefunden die funktioniert hat. Mein Problem: Ich habe einen JFrame mit zwei Pannels und ich würde gerne mit einem Mausklick dem jeweils angeklickten JPanel den Fokus geben und dem anderen nehmen.

Ich könnte das Ganze auch mit einem MouseListener erledigen aber dachte mir das wäre besser mit einem FocusListener - nur dass es eben nicht geht. Hier etwas Beispiel-Code:

Java:
package de.dstrohma.jintanotes.test;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Label;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class PanelFocusTest extends JFrame implements FocusListener {
	JPanel panelRED, panelGREEN;

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

	public PanelFocusTest() {
		setSize(300, 200);
		setLayout(new BorderLayout());
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setLocationRelativeTo(null);

		panelRED = new JPanel();
		panelRED.setLayout(new BorderLayout());
		panelRED.setBorder(BorderFactory.createLineBorder(Color.RED));
		panelRED.setFocusable(true);
		panelRED.addFocusListener(this);
		panelRED.add(new Label("Dies ist ein Fokus Test. Sieht nicht gut aus..."));

		add(panelRED, BorderLayout.NORTH);

		panelGREEN = new JPanel();
		panelGREEN.setLayout(new BorderLayout());
		panelGREEN.setBorder(BorderFactory.createLineBorder(Color.GREEN));
		panelGREEN.setFocusable(true);
		panelGREEN.addFocusListener(this);
		panelGREEN.add(new Label("Dies ist ein Fokus Test. Sieht nicht gut aus..."));

		add(panelGREEN, BorderLayout.SOUTH);

		setVisible(true);
	}

	@Override
	public void focusGained(FocusEvent e) {
		if (e.getSource() == panelRED) {
			System.out.println("RED: focus da");
		}
		if (e.getSource() == panelGREEN) {
			System.out.println("GREEN: focus da");
		}
	}

	@Override
	public void focusLost(FocusEvent e) {
		if (e.getSource() == panelRED) {
			System.out.println("RED: focus weg");
		}
		if (e.getSource() == panelGREEN) {
			System.out.println("GREEN: focus weg");
		}
	}
}

Das müsste doch eigentlich gehen oder?
 
Java:
import java.awt.Label;
//...
import javax.swing.*;

AWT und Swing sollte man NIE mischen !
nutze bitte google oder sufu für ne erklärung *grad kein link parat*
 
Wenn der Fokus per Maus gesetzt werden soll, musst Du noch einen MouseListener implementieren, der dann jeweils ein requestFocus() auf der Komponete ausführt.
Dass die Panels fokusierbar sind, kann man ja mit TAB Taste feststellen.
 
Sorry, eigentlich wollte ich auch JLabel nehmen und nicht Label 🙂 Aber das macht letztlich keinen Unterschied. Die anderen AWT-Sachen wie z.B. die Events gibt es nur in AWT, also ich muss das letztlich mischen... geht nicht anders.

Das ist aber nicht das Problem. Auch wenn das nur SWING Komponenten wären würde das nicht gehen 🙂
 
Statt "requestFocus" wird "requestFocusInWindow" empfohlen:
Java:
private void installMouseFocusable(final Component c){
    c.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(final MouseEvent e) {
            c.requestFocusInWindow();
        }
    });
}
Gruß,
André
 
das mit nicht mischen war auch gar nicht in richtung events gemeint ... sondern in richtung alles was von component erbt ... also alles was du darstellen kannst ...

es gibt auch in swing extra events ... aber da sowas wie mouse-events oder key-events nun mal auf awt ebene abgefangen werden liegt es dort drin ...

im endeffekt verwendet swing auch nur eine methode um die elemente zu zeichnen *awt stellt diese mit hilfe des system-toolkits dar *oder so ähnlich** ...
 
Hab' den code nicht nachvollzogen, aber schau mal nach sowas wie
panel.setFocusable(true);

In der Tat kann man sich nicht darauf verlassen, dass JPanel standardmäßig fokussierbar ist (d.h. isFocusable gibt true zurück), weil der Peer nicht fokussierbar ist und die DefaultFocusTraversalPolicy in dem Fall die Komponente abweist. Man sollte also ausdrücklich die Fokussierbarkeit einer Komponente durch setFocusable setzen (oder durch Überschreiben von isFocusTraversable/isFocusable).

Gruß,
André
 
Bei Swing-Fragen sollten 'Danke's von dir doppelt zählen 😀 Ich hatte das nicht wegen der Innereien von TraversalPolicies im Kopf, sondern wegen des Klassikers: "Hilfe, das JPanel von meinem Spiel bekommt keine KeyEvents"...
 

Neue Themen


Zurück
Oben