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.
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();
}
});
}
}