2012-04-23 9 views

Odpowiedz

12

Czy istnieje sposób, aby ustawić położenie w stosunku do innego JFrame

Można:

EDIT

cały kod Swing musi być zrobione na EventDispatchThread, co oznacza, że ​​setVisible(true) powinny być opakowane w invokeLater

EDIT2

podczas korzystania z JFrame jako składnik C Dostaję A nie może znajdź błąd symbolu

niemożliwe, więc mi mała pomyłka

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

Chciałbym również wspomnieć, że rozmiar (albo setSize() lub pack()) musi zostać wywołany przed ustawieniem względnej lokalizacji. –

+0

podczas korzystania z JFrame jako komponentu c Otrzymuję komunikat, że nie można znaleźć błędu symbolu. –

+0

@ Shane Kelsey na przykład – mKorbel

3

Powinieneś podać this jako argument dla parametru parent podczas konstruowania okna dialogowego (podczas wywoływania go z klasy JFrame, która zwykle jest twoją formą główną). Chyba że dać kod w swoim pytaniu, nie mogę dać bardziej szczegółową pomoc ...

Edycja: Aby wyśrodkować go w rodzica, to zrobić:

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

Spowoduje to lewy górny róg okna w centrum kadru, a wydaje się w prawym dolnym rogu rodzica. Zobacz inne odpowiedzi dla 'setLocationRelativeTo()'. –

+2

Dziwne, jeśli używam szerokości i wysokości mojego ekranu, okno dialogowe jest idealnie wyśrodkowane na moim ekranie. O tak, ale zapomniałem odjąć połowę wysokości i szerokości okna dialogowego ... – MarioDS

5

Sposób chcesz to: setLocationRelativeTo()

Dodanie wartości zerowej do ramki JFrame wyśrodkuje ją na ekranie. Dodanie JFrame do okna wyśrodkuje je na jframe.

Pozdrawiam.

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