2015-12-14 3 views
0

Я пытаюсь закончить эту программу: первый: пользователь запроса ввести номер мобильного телефона в окне JOptionPane второго: Показать сообщение «нажмите кнопку OK, чтобы отслеживать координаты ГПС (вход) третьих: ПОСЛЕ того, как пользователь нажимает OK, должен появиться всплывающий экран. 4th: Заставка должна закончить полностью, и после этого в окне JOptionPane должно появиться сообщение «Адрес, расположенный в координатах GPS:« плюс любой поддельный адрес, в который я вхожу. »порядка Splash Screen неправильно

Прямо сейчас заставка запускается во время всего остального и все не в порядке. Я хочу, чтобы экран заставки запускался после нажатия «ОК», а затем заканчивается и продолжается с окончательным сообщением JOptionPane. очень приветствуется !! FYI. Эта программа предназначена как фальшивая шутка.

public class SplashScreen extends JWindow { 

    static boolean isRegistered; 
    private static JProgressBar progressBar = new JProgressBar(); 
    private static SplashScreen execute; 
    private static int count; 
    private static Timer timer1; 

    public SplashScreen() { 

     Container container = getContentPane(); 
     container.setLayout(null); 

     JPanel panel = new JPanel(); 
     panel.setBorder(new javax.swing.border.EtchedBorder()); 
     panel.setBackground(Color.green); 
     panel.setBounds(10, 10, 348, 150); 
     panel.setLayout(null); 
     container.add(panel); 

     JLabel label = new JLabel("Tracking target GPS coordinates..."); 
     label.setFont(new Font("Verdana", Font.BOLD, 14)); 
     label.setBounds(15, 25, 280, 30); 
     panel.add(label); 

     progressBar.setMaximum(50); 
     progressBar.setBounds(55, 180, 250, 15); 
     container.add(progressBar); 
     loadProgressBar(); 
     setSize(370, 215); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    private void loadProgressBar() { 
     ActionListener al = new ActionListener() { 

      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       count++; 

       progressBar.setValue(count); 

       System.out.println(count); 

       if (count == 300) { 

        createFrame(); 

        execute.setVisible(false); 

        timer1.stop(); 
       } 

      } 

      private void createFrame() throws HeadlessException { 
       JFrame frame = new JFrame(); 
       frame.setSize(500, 500); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setVisible(true); 
      } 
     }; 
     timer1 = new Timer(50, al); 
     timer1.start(); 
    } 

    public static void main(String[] args) { 
     execute = new SplashScreen(); 

     String targetCell = JOptionPane.showInputDialog(null, "Enter " 
       + "target cellphone number: "); 
     JOptionPane.showMessageDialog(null, "Click OK to " 
       + "track the GPS coordinates of " + targetCell + "..."); 
     JOptionPane.showMessageDialog(null, "The address located within " 
       + "GPS coordinates is: " /** + "random fake address") **/); 

    } 
}; 
+0

Итак, не создавайте экземпляр 'SplashScreen' пока вам это не понадобится.Также помните, что Swing не является потокобезопасным и однопоточным. Это означает, что 1- вы должны только обновлять пользовательский интерфейс из контекста потока диспетчеризации событий и 2- вы не должны блокировать EDT с помощью задачи с большим сроком – MadProgrammer

ответ

2

Порядок, в котором вы делаете вещи, это очень важно. Если вы посмотрите на свой код, то SplashScreen делает окно видимым, когда оно создается, что является плохой идеей и которую вы вдруг обнаружили.

Во-первых, вам необходимо изменить порядок, в котором вы делаете вещи, к примеру ...

String targetCell = JOptionPane.showInputDialog(null, "Enter " 
     + "target cellphone number: "); 
JOptionPane.showMessageDialog(null, "Click OK to " 
     + "track the GPS coordinates of " + targetCell + "..."); 
// Show and wait for splash screen to complete 
JOptionPane.showMessageDialog(null, "The address located within " 
     + "GPS coordinates is: " /** 
* + "random fake address") * 
*/ 
); 

Вам также нужно будет каким-то образом, чтобы ваш экран выплеска предоставить уведомление о событии, о том, когда он завершил это задание , как JWindow нет блокировки.

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

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

Это также не несет ответственность за заставку для запуска следующего окна, это только ответственность, чтобы показать прогресс в его деятельность (и, возможно, вернуть результаты это расчеты)

Например ...

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionListener; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JProgressBar; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.CompoundBorder; 
import javax.swing.border.EmptyBorder; 

public class Main { 

    public static void main(String[] args) { 
     new Main(); 
    } 

    public Main() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       String targetCell = JOptionPane.showInputDialog(null, "Enter " 
         + "target cellphone number: "); 
       JOptionPane.showMessageDialog(null, "Click OK to " 
         + "track the GPS coordinates of " + targetCell + "..."); 
       SplashPane.showSplashScreen(); 
       JOptionPane.showMessageDialog(null, "The address located within " 
         + "GPS coordinates is: " /** 
       * + "random fake address") * 
       */ 
       ); 
      } 
     }); 
    } 

    public static class SplashPane extends JPanel { 

     private JProgressBar progressBar = new JProgressBar(); 
     private Timer timer1; 

     public SplashPane() { 
      setLayout(new BorderLayout(0, 4)); 
      setBorder(new EmptyBorder(10, 10, 10, 10)); 

      JPanel panel = new JPanel(new GridBagLayout()); 
      panel.setBorder(new CompoundBorder(
        new javax.swing.border.EtchedBorder(), 
        new EmptyBorder(30, 20, 30, 20))); 
      panel.setBackground(Color.green); 
      JLabel label = new JLabel("Tracking target GPS coordinates..."); 
      label.setFont(new Font("Verdana", Font.BOLD, 14)); 
      panel.add(label); 
      add(panel); 

      add(progressBar, BorderLayout.SOUTH); 

      loadProgressBar(); 
     } 

     private void loadProgressBar() { 
      ActionListener al = new ActionListener() { 
       private int count; 

       @Override 
       public void actionPerformed(java.awt.event.ActionEvent evt) { 
        count = Math.min(100, ++count); 
        progressBar.setValue(count); 

        System.out.println(count); 
        if (count == 100) { 
         SwingUtilities.windowForComponent(SplashPane.this).dispose(); 
         timer1.stop(); 
        } 
       } 
      }; 
      timer1 = new Timer(150, al); 
      timer1.start(); 
     } 

     public static void showSplashScreen() { 
      JDialog frame = new JDialog(); 
      frame.setModal(true); 
      frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
      frame.setUndecorated(true); 
      frame.add(new SplashPane()); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     } 

    } 
} 

Избегайте использования null макетов, идеальные макеты пикселей - это иллюзия в современном дизайне ui. Слишком много факторов, которые влияют на индивидуальный размер компонентов, ни один из которых вы не можете контролировать. Swing был разработан для работы с менеджерами компоновки в ядре, отбросив их, не будет конца проблем и проблем, которые вы будете тратить все больше времени на исправление.

+0

Большое вам спасибо! Он отлично работает – Peanutcalota

0

Вы уже четко говорите, что хотите, так почему бы просто не сделать это? :)

Я думаю, вам нужно будет сначала показать 2 JOptionPanes, сохранить номер ячейки в глобальной переменной или передать ее экземпляру Splashscreen. И после того, как ваш заставку закончит показ третьей панели JOPtion с сохраненным номером cellNumber.

Таким образом, вы должны изменить свой actionPefromed метод, похожий на этот:

public void actionPerformed(java.awt.event.ActionEvent evt) { 
       count++; 

       progressBar.setValue(count); 

       System.out.println(count); 

       if (count == 300) { 
        execute.setVisible(false); 
        timer1.stop(); 
         //splash screen finished so show JoptionPane here 
        JOptionPane.showMessageDialog(null, "The address located within " 
      + "GPS coordinates is: " + targetCell) 


       } 

      }