Search code examples
javaswingjdialogjcomponent

Pass 2 objects in ComponentListener and those objects


void NewJDialogcallone(JFrame frame) 
{
    location = frame.getLocationOnScreen();
    int x = location.x;
    int y = location.y;
    dialog.setLocation(x, y);
    dialog.setLocationRelativeTo(frame);
    dialog.setVisible(true);
    dialog.setAlwaysOnTop(true);
    dialog.addComponentListener(this);
}

public void componentMoved(ComponentEvent e,?????) 
{
    JOptionPane.showConfirmDialog (null,
                                "This is the \"Ok/Cancel\"message dialog box.",
                                "",
                                JOptionPane.OK_CANCEL_OPTION);
}

I want to use the frame object so that the dialog box moves relative to the parent frame a.k.a. I move the parent frame and the dialog box moves with it.I want to call dialog.setLocationRelativeTo(//parent frame object//), which is possible only if I have the parent frame object.

If there is any way to get this window behaviour, please help me.


Solution

  • You just need to add the keyword final in front of the method parameter JFrame frame.

     void NewJDialogcallone(final JFrame frame) 
     ...
    

    I would also recommend to avoid using this:

    dialog.setAlwaysOnTop(true);
    

    because it is really annoying for the user experience. Usually, this is the sign that you did not properly instantiated your dialog, ie, by passing the correct Frame/Dialog owner.

    Here is an example of window location synchronization and without using setAlwayOnTop():

    import java.awt.Point;
    import java.awt.event.ComponentAdapter;
    import java.awt.event.ComponentEvent;
    
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
    
    public class Test {
    
        protected void initUI() {
            final JFrame frame = new JFrame();
            frame.setTitle("Test dialog synch");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                // On the next line I pass "frame" to the dialog so that the dialog never
                // goes behind the frame, avoiding the need for setAlwaysOnTop
            final JDialog dialog = new JDialog(frame, false);
            dialog.setSize(200, 50);
            frame.addComponentListener(new ComponentAdapter() {
    
                private Point lastLocation;
    
                @Override
                public void componentMoved(ComponentEvent e) {
                    if (lastLocation == null && frame.isVisible()) {
                        lastLocation = frame.getLocation();
                    } else {
                        Point newLocation = frame.getLocation();
                        int dx = newLocation.x - lastLocation.x;
                        int dy = newLocation.y - lastLocation.y;
                        dialog.setLocation(dialog.getX() + dx, dialog.getY() + dy);
                        lastLocation = newLocation;
                    }
                }
    
            });
            frame.setSize(400, 200);
            frame.setVisible(true);
            dialog.setLocationRelativeTo(frame);
            dialog.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new Test().initUI();
                }
            });
        }
    
    }