Soy bastante nuevo en el desarrollo de Swing, espero que mi pregunta no sea estúpida.Cambios temporales del propietario de foco a cero
Tengo un problema siguiente. Estoy siguiendo el enfoque usando KeyboardFocusManager
, escuchando los cambios de la propiedad permanentFocusOwner
. Sin embargo, cuando el foco cambia de un control a otro, obtengo el cambio intermedio de la propiedad permanentFocusOwner
a null
.
Mi lógica de IU actual está realizando algunos cambios en los controles cuando el foco está dentro de uno de los paneles o sus paneles secundarios. Sin embargo, obtener el intermedio null
rompe esta lógica.
He buscado en Google para obtener información sobre este problema, no he encontrado nada relevante.
La pregunta es si este comportamiento es por diseño y si hay alguna manera de solucionar nulos intermedios.
Aquí está la aplicación mínima reproducir dicho comportamiento:
import java.awt.*;
import java.beans.*;
import javax.swing.*;
public class FocusNullTest extends JFrame {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
FocusNullTest self = new FocusNullTest();
self.setVisible(true);
}
});
}
public FocusNullTest() {
setSize(150, 100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = getContentPane();
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.X_AXIS));
contentPane.add(new JButton("1"));
contentPane.add(new JButton("2"));
KeyboardFocusManager focusManager =
KeyboardFocusManager.getCurrentKeyboardFocusManager();
focusManager.addPropertyChangeListener(
"permanentFocusOwner",
new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent e) {
System.out.println("permanentFocusOwner changed from: "
+ e.getOldValue());
System.out.println("permanentFocusOwner changed to : "
+ e.getNewValue());
}
});
}
}
La salida del registro es:
(inicio del programa, se centran conjuntos de botón 1 de forma automática)
permanentFocusOwner cambió de : null
permanentFocusOwner cambiado a: javax.swing.JButton [, 0,18,41x26, (omitido)]
(hace clic en el botón 2)
permanentFocusOwner cambiado de: javax.swing.JButton [, 0,18,41x26, (omitidos)]
permanentFocusOwner cambió a: null
permanentFocusOwner cambió de: null
permanentFocusOwner cambiado a: javax.swing.JButton [, 41,18,41x26, (omitido)]
(parte opcional, en la intención de código)
Mi objetivo es hacer que algo parezca una vista de lista, donde las entradas se expanden y muestran más información cuando obtienen el foco (y colapsan cuando lo pierden). La vista expandida contiene algunos botones adicionales.
JList
no parece ser el control apropiado, porque (1) no permite clics en los botones, y (2) sus entradas tienen altura constante, mientras que quiero que las entradas se expandan dinámicamente en el enfoque. JTable
con su modo de edición tampoco parece ser una solución adecuada, al menos debido al tamaño constante de las entradas.
Así que estoy usando plain JPanel
con un diseño de caja vertical como contenedor, y suscribo a los cambios del modelo y actualizo las imágenes manualmente. El problema es que cuando hago clic en un botón, el elemento de la lista que lo contiene pierde foco. Pude detectar que el foco aún permanece dentro del elemento de la lista si el foco no cambia a null
temporalmente.
+ 1 para [sscce] (http://sscce.org/), pero más detalles sobre el objetivo pueden informar una mejor solución. – trashgod
@trashgod: agregué algunos detalles sobre la intención del código – Vlad