2017-02-22 17 views
2

Im маленький бит застрял с этим. Im использует JxBrowser для моего проекта JavaFX. Я также использую JFoenix, чтобы подтолкнуть взгляд. Теперь, когда я просматриваю некоторые сайты, URLBar, который является JFXTextField, становится непригодным. Я больше не могу писать. Но контекстное меню JavaFX по умолчанию все еще работает. Интересно, что ключевые слушатели на веб-сайте, такие как F для полноэкранного просмотра на YouTube, все еще работают. Чтобы исправить это, единственный способ, который работает, - щелкнуть совершенно другое окно на ПК. Например, im щелкнув на IntelliJ, а не обратно на фрейм JavaFX, чем на его работу снова. Поскольку я написал его только на сайтах specefic. Исключения не выбрасываются.JFXTextField нельзя использовать с JxBrowser

Если его maybew важно, im использует 2 TabPanes, один для вкладки и другой для Контента.

У кого-то есть идея?

Класс, который генерирует Tab:

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

К сожалению, это даже не рендеринг. Я просто помещаю просмотр браузера в содержимое вкладки. я уже пробовал такие вещи, как делать все действия в потоке пользовательского интерфейса или помещать браузер в панель и панель на вкладку. – Liz3

+0

В режиме рендеринга в тяжелом режиме библиотека встраивает собственное окно Chromium в окно JavaFX, что может вызвать проблемы с фокусом. Попробуйте облегченный режим рендеринга и дайте мне знать результаты. – Vladimir

+0

Да, это так, в легком его не работает, как сказано в моем комментарии выше. В тяжелом весе его рендеринг просто отлично – Liz3

 Смежные вопросы

  • Нет связанных вопросов^_^