2017-06-15 16 views
1

我有這樣的代碼打開了一個自定義的Java瀏覽器:簡單JavaFX的瀏覽器不僅工程首時它的打開

private void openNavigator(){ 

    Navigator browser = new Navigator(); 
    SwingUtilities.invokeLater(() -> { 

     browser.initComponents(); 

     browser.setVisible(true); 

     browser.loadURL("http://XXXXXXXX:8888/YYYYYY/ZZZZ"); 
    }); 
} 

在另一方面,我有導航的代碼:

public class Navigator extends JFrame { 

    private static final Logger LOG = Logger.getLogger(Navegador.class.getName()); 
    private static final long serialVersionUID = -1951385676682823399L; 

    private WebView view; 
    private JFXPanel javaFxPanel; 
    private WebEngine engine; 

    private JLabel labelStatus; 
    private JTextField direction; 
    private JProgressBar progressBar; 

    private java.net.CookieManager cookiesManager; 


    public void initComponents() { 

     if (cookiesManager != null) { 
      cookiesManager = new java.net.CookieManager(); 
      java.net.CookieHandler.setDefault(cookiesManager); 
     } 

     javaFxPanel = new JFXPanel(); 
     labelStatus = new JLabel(); 

     JPanel panelTodo = new JPanel(new BorderLayout()); 
     JButton botonBuscar = new JButton("Search"); 
     direction = new JTextField(); 
     progressBar = new JProgressBar(); 

     createScene(); 

     ActionListener direcctionListener = new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       loadURL(direction.getText()); 
      } 
     }; 

     botonBuscar.addActionListener(direcctionListener); 
     direction.addActionListener(direcctionListener); 

     progressBar.setPreferredSize(new Dimension(150, 18)); 
     progressBar.setStringPainted(true); 

     JPanel topBar = new JPanel(new BorderLayout(5, 0)); 
     topBar.setBorder(BorderFactory.createEmptyBorder(3, 5, 3, 5)); 
     topBar.add(direction, BorderLayout.CENTER); 
     topBar.add(botonBuscar, BorderLayout.EAST); 

     JPanel statusBar = new JPanel(new BorderLayout(5, 0)); 
     statusBar.setBorder(BorderFactory.createEmptyBorder(3, 5, 3, 5)); 
     statusBar.add(labelStatus, BorderLayout.CENTER); 
     statusBar.add(progressBar, BorderLayout.EAST); 

     panelTodo.add(topBar, BorderLayout.NORTH); 
     panelTodo.add(javaFxPanel, BorderLayout.CENTER); 
     panelTodo.add(statusBar, BorderLayout.SOUTH); 

     getContentPane().add(panelTodo); 

     setPreferredSize(new Dimension(1024, 600)); 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     pack(); 
    } 

    private void createScene() { 

     Platform.runLater(() -> { 
      view = new WebView(); 
      engine = view.getEngine(); 

      engine.setOnAlert((WebEvent<String> wEvent) -> { 
       System.out.println("JS alert() message: " + wEvent.getData()); 
      }); 

      engine.titleProperty().addListener(new ChangeListener<String>() { 
       @Override 
       public void changed(ObservableValue<? extends String> observable, String oldValue, final String newValue) { 
        SwingUtilities.invokeLater(new Runnable() { 
         @Override 
         public void run() { 
          Navegador.this.setTitle(newValue); 
         } 
        }); 
       } 
      }); 

      engine.setOnStatusChanged(new EventHandler<WebEvent<String>>() { 
       @Override 
       public void handle(final WebEvent<String> event) { 
        SwingUtilities.invokeLater(new Runnable() { 
         @Override 
         public void run() { 
          labelStatus.setText(event.getData()); 
         } 
        }); 
       } 
      }); 

      engine.locationProperty().addListener(new ChangeListener<String>() { 
       @Override 
       public void changed(ObservableValue<? extends String> ov, String viejoValor, final String nuevoValor) { 
        SwingUtilities.invokeLater(new Runnable() { 
         @Override 
         public void run() { 
          direction.setText(nuevoValor); 
         } 
        }); 
       } 
      }); 

      engine.getLoadWorker().workDoneProperty().addListener(new ChangeListener<Number>() { 
       @Override 
       public void changed(ObservableValue<? extends Number> observableValue, Number oldValue, final Number newValue) { 
        SwingUtilities.invokeLater(new Runnable() { 
         @Override 
         public void run() { 
          progressBar.setValue(newValue.intValue()); 
         } 
        }); 
       } 
      }); 

      engine.getLoadWorker().exceptionProperty() 
        .addListener(new ChangeListener<Throwable>() { 

         @Override 
         public void changed(ObservableValue<? extends Throwable> o, Throwable old, final Throwable value) { 
          if (engine.getLoadWorker().getState() == FAILED) { 
           SwingUtilities.invokeLater(new Runnable() { 
            @Override 
            public void run() { 
             //TODO Handling Exception 
            } 
           }); 
          } 
         } 
        }); 

      javaFxPanel.setScene(new Scene(view)); 
     }); 
    } 

    public void loadURL(String url) { 
     Platform.runLater(new Runnable() { 
      @Override 
      public void run() { 
       String urlTemporal = toURL(url); 

       if (urlTemporal == null) { 
        urlTemporal = toURL("http://" + url); 
       } 

       engine.load(urlTemporal); 
      } 
     }); 
    } 

    private static String toURL(String str) { 
     try { 
      return new URL(str).toExternalForm(); 
     } catch (MalformedURLException exception) { 
      return null; 
     } 
    } 

} 

我的問題是,當我第一次打開導航器時它工作正常,但是當我關閉它然後再打開時,它只顯示TextFieldButton

注意:

  1. 我用javaswing按鈕打開導航白衣 openNavigator()方法
  2. 當我離開一個導航而不關閉,並在同一時間,我 打開一個或多個導航儀它完美

圖片:

First time i open the Navigator

Second time i open the Navigator

+0

你爲什麼要混合Swing和JavaFX? JavaFX階段在哪裏?我猜測主要階段已經關閉,所以JavaFX工具包會被終結/銷燬,但是如果沒有代碼的相關部分很難說清楚。 – Itai

+1

從「JFXPanel」文檔中並不完全清楚,但我猜測它可能是初始化JavaFX工具包,而不需要「Application」類或主要階段。在這種情況下,調用'Platform.setImplicitExit(false)'可能足以使JavaFX線程不會過早終止。 – Itai

+1

@sillyfly謝謝你太多Platform.setImplicitExit(false)完美地工作,回答這個問題給你答案的答案,真的非常感謝你 – MaQuiNa1995

回答

1

JavaFX線程/工具包必須正在運行。顯然,創建一個JFXPanel就足以初始化它,但是一旦它關閉,線程就會自動終止。
要從自動關閉呼叫

Platform.setImplicitExit(false); 

所以JavaFX的工具箱只關閉時Platform#exit方法被調用,或整個應用程序終止停止它。

相關問題