2012-05-31 6 views
0
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); 
} 

Je souhaite utiliser l'objet cadre pour que la boîte de dialogue se déplace par rapport au cadre parent, je déplace le cadre parent et la boîte de dialogue se déplace avec lui.J'appelle dialog.setLocationRelativeTo(//parent frame object//), ce qui n'est possible que si j'ai l'objet cadre parent.Transmettre 2 objets dans ComponentListener et ces objets

S'il y a un moyen d'obtenir ce comportement de la fenêtre, s'il vous plaît aidez-moi.

Répondre

2

Vous avez juste besoin d'ajouter le mot-clé final en face du paramètre de la méthode JFrame frame.

void NewJDialogcallone(final JFrame frame) 
... 

Je recommande également d'éviter d'utiliser ceci:

dialog.setAlwaysOnTop(true); 

parce qu'il est vraiment gênant pour l'expérience utilisateur. Habituellement, c'est le signe que vous n'avez pas correctement instancié votre boîte de dialogue, c'est-à-dire en passant le bon propriétaire Frame/Dialog.

Voici un exemple de synchronisation de l'emplacement de fenêtre et sans utiliser 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(); 
      } 
     }); 
    } 

} 
+0

dialog.setAlwaysOnTop (true); conserve la boîte de dialogue au-dessus du cadre. Je veux qu'il inhibe un comportement dans lequel, quand je déplace le cadre {cadre parent}, la boîte de Jdialog devant le cadre parent devrait également se déplacer et être positionnée par rapport au cadre. Pouvez-vous me suggérer quelque chose? –

+0

@ user1428216 Mettez à jour ma réponse avec un exemple complet –

+0

Merci beaucoup, c'était ce que je cherchais. Une réponse brillante qui a résolu mon problème. Je promets de vous donner du crédit quand je poste ce n'importe où pour le payer en avant. –

0

Vous pouvez facilement créer un écouteur composant des références que vous objets ont besoin pour

final Object one = new Object(); 
    final Object two = new Object(); 

    ComponentListener listener = new ComponentListener() { 
     public void componentHidden(ComponentEvent e) { 
      one.toString(); 
     } 
     public void componentMoved(ComponentEvent e) { 
      two.toString(); 
     } 
     public void componentResized(ComponentEvent e) { 
      one.toString(); 
     } 
     public void componentShown(ComponentEvent e) { 
      two.toString(); 
     } 
    };