2017-02-22 66 views
2

Im有點小小的問題。 我爲我的JavaFX項目使用JxBrowser。我也使用JFoenix來推動外觀。 現在當我瀏覽到一些網站時,作爲JFXTextField的URLBar變得不可用。我不能再寫了。 但默認的JavaFX contextmenu仍然有效。 有趣的是,網站上的關鍵聽衆,如YouTube上全屏的F仍然有效。 要解決這個問題,唯一有效的方法是單擊PC上完全不同的窗口。 例如,即時點擊到IntelliJ而不是返回到JavaFX框架,比再次工作。因爲我只在specefic網站上寫過它。 不引發異常。JFXTextField不能與JxBrowser一起使用

如果它很重要,即時通訊使用2個TabPanes,一個用於標籤,另一個用於內容。

有人有想法嗎?

生成選項卡中的類:

package de.liz3.liz3web.browser; 

import com.teamdev.jxbrowser.chromium.Browser; 
import com.teamdev.jxbrowser.chromium.javafx.BrowserView; 
import de.liz3.liz3web.gui.controller.MainController; 
import javafx.application.Platform; 
import javafx.scene.control.Tab; 
import javafx.scene.control.TabPane; 
import javafx.scene.input.KeyCode; 

import java.util.Vector; 

/** 
* Created by Liz3 on 22.02.2017. 
*/ 
public class TabManager { 

private Vector<BrowserTab> activeTabs; 
private MainController controller; 

public TabManager(MainController controller) { 
    this.controller = controller; 

    activeTabs = new Vector<>(); 

    controller.getUrlField().setOnMouseClicked(event -> controller.getUrlField().requestFocus()); 
    TabPane head = controller.getHeaderTabPane(); 
    controller.getUrlField().setOnKeyReleased(event -> { 

     if (event.getCode() == KeyCode.ENTER) { 

      selectedBrowserTab().browseOrSearch(TabManager.this.controller.getUrlField().getText()); 
     } 
    }); 
    controller.getBackBtn().setOnAction(event -> selectedBrowserTab().getEngine().goBack()); 
    controller.getForwardBtn().setOnAction(event -> selectedBrowserTab().getEngine().goForward()); 
    head.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> { 

     if (newValue == controller.getNewTab()) { 
      newTab(null); 
      return; 
     } 
     controller.getMainTabPane().getSelectionModel().select(getContentTab(newValue)); 

     controller.getUrlField().setText(selectedBrowserTab().getCurrentUrl()); 
    }); 
} 

public void newTab(String url) { 


    new Thread(() -> { 

     Browser browser = new Browser(); 
     BrowserView view = new BrowserView(browser); 

     Tab headerTab = new Tab("New Tab"); 
     Tab contentTab = new Tab(); 
     contentTab.setContent(view); 
     BrowserTab t = new BrowserTab(browser, view, contentTab, headerTab); 
     activeTabs.add(t); 


     Platform.runLater(() -> { 

      controller.getHeaderTabPane().getTabs().add(headerTab); 
      controller.getMainTabPane().getTabs().add(contentTab); 
      controller.getHeaderTabPane().getTabs().remove(controller.getNewTab()); 
      controller.getHeaderTabPane().getTabs().add(controller.getNewTab()); 
      controller.getMainTabPane().getSelectionModel().select(contentTab); 
      controller.getHeaderTabPane().getSelectionModel().select(headerTab); 
      controller.getUrlField().setEditable(true); 
      controller.getUrlField().setText(""); 
      t.browseOrSearch(url); 

     }); 
    }).start(); 

} 


public BrowserTab selectedBrowserTab() { 

    for (BrowserTab tab : activeTabs) { 

     if (tab.getHeaderTab() == controller.getHeaderTabPane().getSelectionModel().getSelectedItem()) { 
      return tab; 
     } 
    } 
    return null; 
} 

public Tab getSelectedHeaderTab() { 

    return controller.getHeaderTabPane().getSelectionModel().getSelectedItem(); 
} 

public Tab getSelectedContentTab() { 

    return controller.getMainTabPane().getSelectionModel().getSelectedItem(); 
} 

public Tab getHeaderTab(Tab contentTab) { 

    for (BrowserTab tab : activeTabs) { 

     if (tab.getContentTab() == contentTab) { 
      return tab.getHeaderTab(); 
     } 
    } 
    return null; 
} 

public Tab getContentTab(Tab headerTab) { 

    for (BrowserTab tab : activeTabs) { 

     if (tab.getHeaderTab() == headerTab) { 
      return tab.getContentTab(); 
     } 
    } 
    return null; 
} 

public MainController getController() { 
    return controller; 
} 

public Vector<BrowserTab> getActiveTabs() { 
    return activeTabs; 
} 
} 

瀏覽器類:

package de.liz3.liz3web.browser; 

import com.teamdev.jxbrowser.chromium.Browser; 
import com.teamdev.jxbrowser.chromium.events.*; 
import com.teamdev.jxbrowser.chromium.javafx.BrowserView; 
import de.liz3.liz3web.Main; 
import javafx.application.Platform; 
import javafx.event.Event; 
import javafx.event.EventHandler; 
import javafx.scene.control.Tab; 

import java.io.UnsupportedEncodingException; 
import java.net.URLEncoder; 

/** 
* Created by Liz3 on 21.02.2017. 
*/ 
public class BrowserTab { 

private Browser engine; 
private BrowserView view; 
private Tab contentTab; 
private Tab headerTab; 
private String currentUrl; 



public BrowserTab(Browser engine, BrowserView view, Tab contentTab, Tab headerTab) { 
    this.engine = engine; 
    this.view = view; 
    this.contentTab = contentTab; 
    this.headerTab = headerTab; 
    this.currentUrl = ""; 

    setUpTab(); 

} 

public void browseOrSearch(String address) { 

    if (address == null) { 
     return; 
    } 

    if (address.startsWith("http://") || address.startsWith("https://")) { 

     this.engine.loadURL(address); 

     return; 
    } 
    if (!address.contains(" ") && address.contains(".")) { 

     address = "http://" + address; 
     this.engine.loadURL(address); 
     return; 
    } 

    String encode = null; 
    try { 
     encode = URLEncoder.encode(address, "utf-8"); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } 

    this.engine.loadURL("https//google.com/search?q=" + encode); 

} 

private void setUpTab() { 

    this.headerTab.setClosable(true); 
    this.headerTab.setOnCloseRequest(new EventHandler<Event>() { 
     @Override 
     public void handle(Event event) { 

      Main.tm.getController().getMainTabPane().getTabs().remove(contentTab); 
      Main.tm.getActiveTabs().remove(this); 

     } 
    }); 
    this.engine.addTitleListener(titleEvent -> Platform.runLater(() -> BrowserTab.this.headerTab.setText(titleEvent.getTitle()))); 
    this.engine.addLoadListener(new LoadListener() { 
     @Override 
     public void onStartLoadingFrame(StartLoadingEvent startLoadingEvent) { 

      Platform.runLater(() -> { 
       BrowserTab.this.currentUrl = BrowserTab.this.engine.getURL(); 
       if (Main.tm.getSelectedHeaderTab() == BrowserTab.this.headerTab) { 

        Main.tm.getController().getUrlField().setText(BrowserTab.this.currentUrl); 
       } 
      }); 

     } 

     @Override 
     public void onProvisionalLoadingFrame(ProvisionalLoadingEvent provisionalLoadingEvent) { 

     } 

     @Override 
     public void onFinishLoadingFrame(FinishLoadingEvent finishLoadingEvent) { 
      Platform.runLater(() -> { 

       BrowserTab.this.currentUrl = BrowserTab.this.engine.getURL(); 
       if (Main.tm.getSelectedHeaderTab() == BrowserTab.this.headerTab) { 

        Main.tm.getController().getUrlField().setText(BrowserTab.this.currentUrl); 
       } 
      }); 
     } 

     @Override 
     public void onFailLoadingFrame(FailLoadingEvent failLoadingEvent) { 

     } 

     @Override 
     public void onDocumentLoadedInFrame(FrameLoadEvent frameLoadEvent) { 

     } 

     @Override 
     public void onDocumentLoadedInMainFrame(LoadEvent loadEvent) { 

     } 
    }); 
    this.engine.setPopupHandler(popupParams -> { 
     Platform.runLater(() -> Main.tm.newTab(popupParams.getURL())); 

     return null; 
    }); 

} 

public Browser getEngine() { 
    return engine; 
} 

public BrowserView getView() { 
    return view; 
} 

public Tab getContentTab() { 
    return contentTab; 
} 

public Tab getHeaderTab() { 
    return headerTab; 
} 

public String getCurrentUrl() { 
    return currentUrl; 
} 
} 

回答

1

默認JxBrowser在HEAVYWEIGHT渲染模式下運行。建議不要在帶有選項卡和圖層的應用程序中使用HEAVYWEIGHT渲染模式。請使用LIGHTWEIGHT渲染模式。它應該沒有任何問題的工作:

Browser browser = new Browser(BrowserType.LIGHTWEIGHT); 
BrowserView view = new BrowserView(browser); 
+0

可悲的是,它甚至沒有渲染。 我只是把瀏覽器視圖放入標籤內容。我已經嘗試了一些方法,例如在UI線程上進行所有操作,或者將瀏覽器放入窗格並將窗格放入選項卡中。 – Liz3

+0

在重量級渲染模式下,該庫將Chromium本機窗口嵌入您的JavaFX窗口中,這可能會導致焦點問題。請嘗試輕量級渲染模式,並讓我知道結果。 – Vladimir

+0

是的,它在輕量級,它不工作在我上面的評論中說。 在Havyweight它的渲染就好 – Liz3

相關問題