2012-04-23 3 views

Antwort

12

Gibt es eine Möglichkeit, eine Position in Bezug auf einen anderen JFrame zu setzen

Sie können:

EDIT

alle Swing-Code muss auf EventDispatchThread erfolgen, was bedeutet, dass setVisible(true) sollte in invokeLater

EDIT2

gewickelt werden, wenn die JFrame als Komponente c mit erhalte ich eine Dose nicht finden Symbolfehler

nicht möglich, so ich kleiner Fehler

enter image description here

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 

public class ClosingFrameDialog extends JFrame { 

    private JFrame frame = new JFrame(); 
    private static final long serialVersionUID = 1L; 
    private JMenuBar MenuBar; 
    private JMenu File; 
    private JMenuItem Exit; 
    private JMenuItem ShowDialog; 
    private JDialog dialog; 
    private Point location; 

    public ClosingFrameDialog() { 
     Exit = new JMenuItem(" Exit "); 
     Exit.addActionListener(new ExitListener()); 
     ShowDialog = new JMenuItem(" Show Dialog "); 
     ShowDialog.addActionListener(showingDialog()); 
     File = new JMenu(" File "); 
     File.add(Exit); 
     File.add(ShowDialog); 
     MenuBar = new JMenuBar(); 
     MenuBar.add(File); 
     frame.addWindowListener(exitListener); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.setJMenuBar(MenuBar); 
     frame.setPreferredSize(new Dimension(400, 300)); 
     frame.setLocation(100, 100); 
     frame.pack(); 
     frame.setVisible(true); 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       createDialog(); 
      } 
     }); 
    } 

    private void createDialog() { 
     JButton btn = new JButton(" Save changes "); 
     btn.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       //some stuff for saving whatewer programatically 
       dialog.setVisible(false); 
      } 
     }); 
     JButton btn1 = new JButton(" Ignore changes "); 
     btn1.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       dialog.setLocationRelativeTo(frame); 
       dialog.setVisible(false); 
      } 
     }); 
     dialog = new JDialog(); 
     dialog.add(btn); 
     dialog.add(btn1); 
     dialog.setVisible(false); 
     dialog.setAlwaysOnTop(true); 
     dialog.setModal(true); 
     dialog.setLayout(new GridLayout(2, 0, 10, 10)); 
     JPanel pane = (JPanel) dialog.getContentPane(); 
     pane.setBorder(new EmptyBorder(10, 10, 10, 10)); 
     dialog.addWindowListener(closeListener); 
     dialog.pack(); 
    } 
// 
    private WindowListener exitListener = new WindowAdapter() { 

     @Override 
     public void windowClosing(WindowEvent e) { 
      int confirm = JOptionPane.showOptionDialog(frame, 
        "Are You Sure to Close this Application?", 
        "Exit Confirmation", JOptionPane.YES_NO_OPTION, 
        JOptionPane.QUESTION_MESSAGE, null, null, null); 
      if (confirm == 0) { 
       System.exit(1); 
      } 
     } 

     @Override 
     public void windowIconified(WindowEvent e) { 
      int confirm = JOptionPane.showOptionDialog(frame, 
        "Are You Sure to Close this Application?", 
        "Exit Confirmation", JOptionPane.YES_NO_OPTION, 
        JOptionPane.QUESTION_MESSAGE, null, null, null); 
      if (confirm == 0) { 
       //System.exit(1); 
      } 
     } 
    }; 
// 
    private WindowListener closeListener = new WindowAdapter() { 

     @Override 
     public void windowClosing(WindowEvent e) { 
      int confirm = JOptionPane.showOptionDialog(dialog, 
        "Are you want to save changes", 
        "Exit Confirmation", JOptionPane.YES_NO_OPTION, 
        JOptionPane.QUESTION_MESSAGE, null, null, null); 
      if (confirm == 0) { 
       //some stuff for saving whatewer programatically 
       dialog.setVisible(true); 
      } else if (confirm == 1) {// nothing only hide JDialog 
       dialog.setVisible(true); 
      } 
     } 
    }; 

    private Action showingDialog() { 
     return new AbstractAction("Show Dialog") { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       Runnable doRun = new Runnable() { 

        @Override 
        public void run() { 
         dialog.setVisible(false); 
         location = frame.getLocationOnScreen(); 
         int x = location.x; 
         int y = location.y; 
         //dialog.setLocation(x, y); 
         dialog.setLocationRelativeTo(frame); 
         dialog.setVisible(true); 
        } 
       }; 
       SwingUtilities.invokeLater(doRun); 
      } 
     }; 
    } 

    private class ExitListener implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      int confirm = JOptionPane.showOptionDialog(frame, 
        "Are You Sure to Close this Application?", 
        "Exit Confirmation", JOptionPane.YES_NO_OPTION, 
        JOptionPane.QUESTION_MESSAGE, null, null, null); 
      if (confirm == 0) { 
       System.exit(1); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       ClosingFrameDialog cf = new ClosingFrameDialog(); 
      } 
     }); 
    } 
} 
+3

Ich würde auch erwähnen, dass die Größe (entweder setSize() oder pack()) aufgerufen werden muss, bevor die relative Position festgelegt wird. –

+0

Wenn ich den JFrame als Komponente c verwende, bekomme ich einen Symbolfehler. –

+0

@Shane Kelsey zum Beispiel – mKorbel

3

Sie sollten this als Argument für den Parameter parent angeben, wenn Sie das Dialogfeld erstellen (wenn Sie es aus einer JFrame-Klasse aufrufen, die normalerweise Ihr Hauptformular ist). Es sei denn, Sie Code in Ihrer Frage geben, kann ich nicht geben detailliertere Hilfe ...

Edit: es zu zentrieren innerhalb des übergeordneten, dies zu tun:

MyDialog dialog = new MyDialog(this, true); //or false for non-modal 
dialog.setLocation(this.getWidth/2 - dialog.getWidth/2, this.getHeight/2 - dialog.getHeight/2); 
dialog.setVisible(true); 
+1

Dies wird die linke obere Ecke des Dialogs in der Mitte des Rahmens platzieren, und es wäre in der unteren rechten Ecke des Eltern erscheinen. Siehe die anderen Antworten für 'setLocationRelativeTo()'. –

+2

Seltsam, wenn ich die Breite und Höhe meines Bildschirms verwende, erscheint der Dialog perfekt auf meinem Bildschirm zentriert. Ach ja, aber ich habe vergessen, die Hälfte der Dialoghöhe und Breite zu subtrahieren ... – MarioDS

5

Die Methode, die Sie wollen, ist: setLocationRelativeTo()

Wenn Sie ihn mit null zum JFrame hinzufügen, wird er auf dem Bildschirm zentriert. Wenn Sie den JFrame dem Dialogfeld hinzufügen, wird er auf dem Jframe zentriert.

Prost.

import javax.swing.JDialog; 
import javax.swing.JFrame; 

public class Centered 
{ 
    public static void main(String args[]) 
    { 
     JFrame jFrame = new JFrame(); 

     jFrame.setSize(250 , 250); 
     jFrame.setLocationRelativeTo(null); 
     jFrame.setVisible(true); 

     JDialog jDialog = new JDialog(); 
     jDialog.setLocationRelativeTo(jFrame); 
     jDialog.setVisible(true); 
    } 
}