2013-06-25 4 views
1

У меня есть всплывающее окно, которое появляется во время загрузки программы. Это окно всплеска использует метод setAlwaysOnTop(true), который я бы предпочел сохранить.Как установить местоположение JOptionPane?

Проблема возникает, когда отдельная часть программы выдает JOptionPane, чтобы уведомить пользователя о необходимости обновления программного обеспечения. В Linux это появляется перед окном Splash, но в Windows он появляется позади, едва видимый пользователю, который затем может сидеть за 30 минут до того, как выяснит, почему он еще не загружен.

Исправление Я хотел бы реализовать это либо

  • Принудительно JOptionPane выпадающее где-то на экране
    или
  • Изменить местоположение, которое появляется JOptionPane на, так позиционирован вверху или внизу экрана заставки.

Единственная функция, которую я могу видеть, это будет метод setLocationRelativeTo(Component myComponent). Но это нехорошо, потому что нет ничего лучше, чем быть относительно (и ничего настоящего!).

Возможно ли это? Если да, то как мне это заняться?

Вот мой SSCCE (основаны от кода SeniorJD в их ответ):

public class Main { 
    public static void main(String[] args) { 

     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       final Splash splash =new Splash(); 
       try { 
        Thread.sleep(100); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       final Frame frame = new Frame("Frame"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setVisible(true); 
       splash.dispose(); 
      } 
     }); 
    } 
} 

@SuppressWarnings("serial") 
public class Frame extends JFrame implements ActionListener{ 
    Frame(String title){ 
     super(title); 
     JButton button = new JButton("Button"); 
     add(button); 

     setAlwaysOnTop(true); 
     setSize(500, 500); 
     setLocationRelativeTo(getParent()); 
     setAlwaysOnTop(true); 
     button.addActionListener(this); 
     actionPerformed(null); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     JOptionPane optionPane = new JOptionPane("Option Pane"); 
     optionPane.showMessageDialog(this, "Message: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas tristique gravida congue."); 
    } 
} 
    @SuppressWarnings("serial") 
public class Splash extends JFrame { 
    public Splash() throws HeadlessException { 
     setAlwaysOnTop(true); 
     setUndecorated(true); 
     setVisible(true); 
     setSize(600, 450); 
     setLocationRelativeTo(getParent()); 
    } 
} 

Это более руда менее эмулирует поведение мои пользователи видят. Как переместить JOptionPane с экрана заставки?

+0

@AndrewThompson: нет такой вещи, как 'J2SE'. Это 'Java SE', начиная с нескольких лет. –

+0

@AndrewThompson Вы в порядке? Тяжелый день? Смысл тот же. Потерпи. – SeniorJD

+0

@AndrewThompson Я не на машине с кодом, и я редко когда-либо использовал этот класс. Несмотря на это, я исправил это. – Pureferret

ответ

2

Вы должны установить frame как родитель JOptionPane:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.SwingUtilities; 


public class Main { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       final JFrame frame = new JFrame("Frame"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       JButton button = new JButton("Button"); 
       frame.add(button); 

       frame.setAlwaysOnTop(true); 
       frame.setSize(500, 500); 
       frame.setLocation(500, 500); 

       button.addActionListener(new ActionListener() { 

        @Override 
        public void actionPerformed(ActionEvent e) { 
         JOptionPane optionPane = new JOptionPane("Option Pane"); 
         optionPane.showMessageDialog(frame, "Message!"); // if you put null instead of frame, the option pane will be behind the frame 
        } 
       }); 

       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

Интересно, что у меня есть набор кадров как «родительский», а не нулевой. Если я включаю 'frame.setAlwaysOnTop (true);' к вашему примеру сообщение появляется в сторону. Я пойду и посмотрю, что это заставило мою ситуацию по-другому. Благодаря! – Pureferret

+0

Я отредактировал мой вопрос, чтобы показать вам мой SSCCE, я надеюсь, что это поможет объяснить мою ситуацию! – Pureferret

+0

@Pureferret Действительно ли нужны два несвязанных 'JFrames'? – SeniorJD

0

если

setLocationRelativeTo(null); 

не показывает его по какой-то причине хорошо на Windows я бы либо установить размер этого, чтобы быть немного больше, чем экран заставки, поэтому он будет более заметным или сделает то, что предложил SeniorJD.