2012-04-23 2 views
8

Есть ли способ установить местоположение диалога относительно JFrame?Установить местоположение JDialog относительно JFrame

Я хотел бы сфокусировать диалог на кадре, в котором находится мой графический интерфейс, вместо этого диалог часто появляется в центре экрана, а не в графическом интерфейсе.

ответ

12

Есть ли способ, чтобы установить местоположение по отношению к другой JFrame

Вы можете:

EDIT

весь код свинг должен быть сделан на EventDispatchThread, а это означает, что setVisible(true) должны быть обернуты в invokeLater

EDIT2

при использовании JFrame в качестве компонента с я получаю не могу найти ошибку символа

невозможно, поэтому меня маленькая ошибка

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

Я бы также сказал, что перед установкой относительного местоположения необходимо вызвать размер (либо setSize(), либо pack()). –

+0

при использовании JFrame как компонента c Я получаю a не могу найти ошибку символа. –

+0

@Shane Kelsey, например – mKorbel

3

Вы должны указать this как аргумент для параметра parent при построении диалога (когда вы вызываете его из класса JFrame, который обычно является вашей основной формой). Если вы не дать код в ваш вопрос, я не могу дать более подробную помощь ...

Edit: Для того, чтобы центрировать его в пределах родителя, сделайте следующее:

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

Это поместит верхний левый угол диалога в центре кадра, и она появится в правом нижнем углу родителя. См. Другие ответы для 'setLocationRelativeTo()'. –

+2

Странно, если я использую ширину и высоту своего экрана, диалоговое окно выглядит идеально по моему экрану. О да, но я забыл выровнять половину высоты и ширины диалога ... – MarioDS

5

Метод вы хотите: setLocationRelativeTo()

Добавление его с нулевым значением в JFrame, будет центрировать его на экране. Добавление JFrame в диалог будет центрировать его на jframe.

Cheers.

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