UPDATE: [[ If you're curious, refreshing the window on focus did not work well for me. They would double-click on a table in an out-of-focus window, the table would refresh on focus, and the double click event would fire against a different record than the one upon which the original click was made. ]]
Here's an example focus listener for a JInternalFrame:
package com.apexroot.sandbox; import java.awt.Dimension; import java.awt.EventQueue; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.JDesktopPane; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JLabel; /** * author grants unlimited license to modify, reuse and redistribute. based on * the suggestion by @mKorbel on stackoverflow at * http://stackoverflow.com/questions/7219860/jinternalframe-selection * please keep a URL to the original version in the source code. * http://javajon.blogspot.com/2015/08/windowfocuslistener-for-jinternalframe.html * * @author Apexroot */ public class InternalFrameFocusListenerExample { public static final String INTERNAL_FRAME_FOCUS_EVENT_PROPERTY = "selected"; public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { final JFrame jFrame = new JFrame(); final JDesktopPane jDesktopPane = new JDesktopPane(); final JInternalFrame[] jInternalFrames = new FocusInternalFrame[3]; for (int i = 0; i < jInternalFrames.length; i++) { jInternalFrames[i] = new FocusInternalFrame(); } jFrame.dispose(); jFrame.setContentPane(jDesktopPane); jDesktopPane.setPreferredSize(new Dimension(400, 200)); jFrame.pack(); jFrame.setVisible(true); for (int i = 0; i < jInternalFrames.length; i++) { jDesktopPane.add(jInternalFrames[i]); jInternalFrames[i].setLocation(10 + 60 * i, 10 + 40 * i); jInternalFrames[i].setVisible(true); } } }); } public static class FocusInternalFrame extends JInternalFrame { public FocusInternalFrame() { final JLabel jLabel = new JLabel("placeholder for pack();"); setContentPane(jLabel); pack(); this.addPropertyChangeListener( INTERNAL_FRAME_FOCUS_EVENT_PROPERTY, new LabelFocusListener(jLabel)); } } private static class LabelFocusListener implements PropertyChangeListener { private final JLabel jLabel; public LabelFocusListener(JLabel jLabel) { this.jLabel = jLabel; } @Override public void propertyChange(PropertyChangeEvent evt) { // please keep a URL to the original version in the source code. // http://javajon.blogspot.com/2015/08/windowfocuslistener-for-jinternalframe.html if (INTERNAL_FRAME_FOCUS_EVENT_PROPERTY.equals( evt.getPropertyName())) { final Object oldValue = evt.getOldValue(); final Object newValue = evt.getNewValue(); if (oldValue instanceof Boolean && newValue instanceof Boolean) { boolean wasInFocus = (Boolean) oldValue; boolean isInFocus = (Boolean) newValue; if (isInFocus && !wasInFocus) { EventQueue.invokeLater(new Runnable() { @Override public void run() { // focus gained jLabel.setText("focus gained"); } }); } else if (wasInFocus && !isInFocus) { EventQueue.invokeLater(new Runnable() { @Override public void run() { // focus lost jLabel.setText("focus lost"); } }); } } } } } }
No comments:
Post a Comment