如何摆脱 JFXPanel 中的边缘?

How to get rid of edges in JFXPanel?

我正在开发 Java Swing 地图应用程序,它获取 url 并从 Google 地图以不同的缩放级别加载地图。

但是地图中的地址栏很烦人,我想去掉它或减少它 space。

在我下面的代码中,我首先尝试了:Use_iFrame_B=false

这将得到一个像这样带有大地址栏的地图,并且无法缩放:

然后我试了:Use_iFrame_B=true;

这将显示缩放的地图,但有大边:

所以,我的问题是:

  1. 当Use_iFrame_B=false时,如何在第一种情况下隐藏地址栏并在地址上仍然显示一个指示符[红色气球]?
  2. 在上述情况下如何使缩放工作[Use_iFrame_B=false]。
  3. 如果上面的 1 和 2 不可行,那么我更愿意使用 iFrame,它会显示更小更有意义的地址,并且缩放也可以。但是它留下了大边缘,当 Use_iFrame_B=true?
  4. 时如何去除这些边缘

这是我的程序:

import java.awt.*;
import java.io.File;
import java.net.URL;

import javafx.embed.swing.JFXPanel;
import javafx.application.Platform;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.layout.*;
import javafx.scene.web.*;
import javax.swing.*;
import javax.swing.border.*;

/**
 Note using the browser might require setting the properties
 - http.proxyHost
 - http.proxyPort
 e.g. -Dhttp.proxyHost=webcache.mydomain.com -Dhttp.proxyPort=8080
*/

public class JavaFX_Browser_Panel extends JPanel
{
  static int Edge_W=0,Edge_H=0;
  private int PANEL_WIDTH_INT=1200,PANEL_HEIGHT_INT=900;
  private JFXPanel browserFxPanel;
  private Pane browser;
  WebView view;
  WebEngine eng;
//  static String Url,Urls[]=new String[]{"http://www.Yahoo.com","www.Google.com","dell.com","C:/Dir_Fit/Yahoo_Maps_Frame.html","C:/Dir_Broadband_TV/TV.html"};
//  static String Url,Urls[]=new String[]{"C:/Dir_Broadband_TV/TV.html"};
//  static String Url,Urls[]=new String[]{"http://screen.yahoo.com/cecily-strong-snl-skits/hermes-000000630.html"};
  static String Url,Urls[]=new String[]{"https://www.google.com/maps/@33.8470183,-84.3677322,11z"};

  public JavaFX_Browser_Panel() { init(); }

  public JavaFX_Browser_Panel(int W,int H)
  {
    PANEL_WIDTH_INT=W+Edge_W;
    PANEL_HEIGHT_INT=H+Edge_H;
    init();
  }

  public JavaFX_Browser_Panel(String Url)
  {
    this.Url=Url;
    init();
    setURL(Url);
  }

  void init()
  {
    FlowLayout FL=new FlowLayout();
    FL.setHgap(0);
    FL.setVgap(0);
    setLayout(FL);
    browserFxPanel=new JFXPanel();
//    browserFxPanel.setBorder(new EmptyBorder(0,0,0,0));
    add(browserFxPanel);
    setPreferredSize(new Dimension(PANEL_WIDTH_INT,PANEL_HEIGHT_INT));
    Platform.runLater(new Runnable() { public void run() { createScene(); } });
  }

  public static void Set_Edge(int W,int H)
  {
    Edge_W=W;
    Edge_H=H;
  }

  public String getURL() { return eng.getLocation(); }

  public String goBack()
  {    
    final WebHistory history=eng.getHistory();
    ObservableList<WebHistory.Entry> entryList=history.getEntries();
    int currentIndex=history.getCurrentIndex();
//    Out("currentIndex = "+currentIndex);
//    Out(entryList.toString().replace("],","]\n"));

    Platform.runLater(new Runnable() { public void run() { history.go(-1); } });
    return entryList.get(currentIndex>0?currentIndex-1:currentIndex).getUrl();
  }

  public String goForward()
  {    
    final WebHistory history=eng.getHistory();
    ObservableList<WebHistory.Entry> entryList=history.getEntries();
    int currentIndex=history.getCurrentIndex();
//    Out("currentIndex = "+currentIndex);
//    Out(entryList.toString().replace("],","]\n"));

    Platform.runLater(new Runnable() { public void run() { history.go(1); } });
    return entryList.get(currentIndex<entryList.size()-1?currentIndex+1:currentIndex).getUrl();
  }

  public void refresh() { Platform.runLater(new Runnable() { public void run() { eng.reload(); } }); }

  public void stop() { Platform.runLater(new Runnable() { public void run() { eng.getLoadWorker().cancel(); } }); }

  public void Load_iFrame(final String Url,final int W,final int H)
  {
    Platform.runLater(new Runnable()
    {
      public void run()
      {

        if (new File(Url).exists()) setURL(new File(Url));
        else eng.loadContent("<iframe width="+W+" height="+H+" src="+Url+" style=border:0; marginheight=0 marginwidth=0 allowfullscreen></iframe>");
//        else eng.loadContent("<iframe width="+W+" height="+H+" src="+Url+" frameborder=0 marginheight=0 marginwidth=0 allowfullscreen></iframe>");
//        else eng.loadContent("<iframe width='990' height='915' src="+Url+" frameborder='0' allowfullscreen></iframe>");
      }
    });
  }

  public void setURL(final String Url)
  {
    Platform.runLater(new Runnable()
    {
      public void run()
      {
        if (new File(Url).exists()) setURL(new File(Url));
        else eng.load((Url.startsWith("http://") || Url.startsWith("https://"))?Url:"http://"+Url);
      }
    });
  }

  public void setURL(final URL Url)
  {
    Platform.runLater(new Runnable()
    {
      public void run()
      {
        try { eng.load(Url.toString()); }
        catch (Exception e) { e.printStackTrace(); }
      }
    });
  }

  public void setURL(final File file)
  {
    Platform.runLater(new Runnable()
    {
      public void run()
      {
        try { eng.load(file.toURI().toURL().toString()); }
        catch (Exception e) { e.printStackTrace(); }
      }
    });
  }

  private void createScene()
  {
    browser=createBrowser();
    browserFxPanel.setScene(new Scene(browser));
  }

  private Pane createBrowser()
  {
    Double widthDouble=new Integer(PANEL_WIDTH_INT).doubleValue();
    Double heightDouble=new Integer(PANEL_HEIGHT_INT).doubleValue();
    view=new WebView();
    view.setMinSize(widthDouble,heightDouble);
    view.setPrefSize(widthDouble,heightDouble);
    eng=view.getEngine();
    GridPane grid=new GridPane();
    grid.getChildren().addAll(view);
    return grid;
  }

  public static void out(String message) { System.out.print(message); }   
  public static void Out(String message) { System.out.println(message); }

  public static void main(String[] args)
  {
    final JavaFX_Browser_Panel demo=new JavaFX_Browser_Panel(Urls[0]);

    int i=0;

    SwingUtilities.invokeLater(new Runnable()
    {
      public void run()
      {
//        try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); }
//        catch (Exception e) { e.printStackTrace(); }

        JFrame frame=new JFrame("JavaFX 2.2 in Swing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(demo);

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
      }
    });

    while (i<Urls.length-1)
    {
      try
      {
        demo.setURL(Urls[++i]);
        Thread.sleep(2000);
      }
      catch (Exception e) { e.printStackTrace(); }
    }
//    demo.goBack();
  }
}


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

public class Map_Maker_2 extends JPanel implements Runnable
{
  public static final long serialVersionUID=26362862L;
  int W=1600,H=1200,JavaFX_Browser_Edge_W=200,JavaFX_Browser_Edge_H=200,Upper_Left_Button_Panel_W=90;
  static Dimension Screen_Size=Toolkit.getDefaultToolkit().getScreenSize();
  String Google_Url="http://maps.google.com/maps?q=Address&t=m&z=Zoom",Address="760 West Genesee Street Syracuse NY 13204",Url;
  Insets An_Inset=new Insets(0,0,0,0);
  JTextArea Upper_Left_TextArea=new JTextArea(Address);
  JavaFX_Browser_Panel Left_JavaFX_Browser_Panel,Upper_Right_JavaFX_Browser_Panel,Lower_Right_JavaFX_Browser_Panel;
//  boolean Use_iFrame_B=true;
  boolean Use_iFrame_B=false;
  Thread Empty_JPanel_Thread;

  public Map_Maker_2()
  {
    JavaFX_Browser_Panel.Set_Edge(JavaFX_Browser_Edge_W,JavaFX_Browser_Edge_H);

    FlowLayout Fl=new FlowLayout(0,0,0);
    setLayout(Fl);

    JPanel Left_Panel=new JPanel(Fl);
    Left_Panel.setBorder(new EtchedBorder());
    Left_Panel.setPreferredSize(new Dimension(W/2,H));
    add(Left_Panel);

    JPanel Upper_Left_Panel=new JPanel(Fl);
    Upper_Left_Panel.setBorder(new EtchedBorder());
    Upper_Left_Panel.setPreferredSize(new Dimension(W/2-2,H/4-2));
    Left_Panel.add(Upper_Left_Panel);

    Upper_Left_TextArea.setFont(new Font("Times New Roman",0,16));
    Upper_Left_TextArea.setBorder(new EtchedBorder());
    Upper_Left_TextArea.setPreferredSize(new Dimension(W/2-2-Upper_Left_Button_Panel_W-4,H/4-6));
    Upper_Left_Panel.add(Upper_Left_TextArea);

    FlowLayout Button_Panel_Fl=new FlowLayout(0,0,66);

    JPanel Upper_Left_Button_Panel=new JPanel(Button_Panel_Fl);
    Upper_Left_Button_Panel.setBorder(new EtchedBorder());
    Upper_Left_Button_Panel.setPreferredSize(new Dimension(Upper_Left_Button_Panel_W,H/4-6));
    Upper_Left_Panel.add(Upper_Left_Button_Panel);

    JButton Get_Maps_Button=new JButton("Get Maps");
    Get_Maps_Button.setForeground(new Color(0,0,230));
    Get_Maps_Button.setFont(new Font("Times New Roman",0,16));
    Get_Maps_Button.setMargin(An_Inset);
    Get_Maps_Button.setPreferredSize(new Dimension(Upper_Left_Button_Panel_W-5,26));
    Get_Maps_Button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { Get_Maps(); } });

    Upper_Left_Button_Panel.add(Get_Maps_Button);

    JButton Print_Button=new JButton("Print");
    Print_Button.setForeground(new Color(0,0,230));
    Print_Button.setFont(new Font("Times New Roman",0,16));
    Print_Button.setMargin(An_Inset);
    Print_Button.setPreferredSize(new Dimension(Upper_Left_Button_Panel_W-5,26));
    Upper_Left_Button_Panel.add(Print_Button);


    JPanel Lower_Left_Panel=new JPanel(Fl);
    Lower_Left_Panel.setPreferredSize(new Dimension(W/2-2,H*3/4));
    Left_Panel.add(Lower_Left_Panel);

    Left_JavaFX_Browser_Panel=new JavaFX_Browser_Panel(W/2-4,H*3/4);
    Lower_Left_Panel.add(Left_JavaFX_Browser_Panel);

    JPanel Right_Panel=new JPanel(new FlowLayout(0,0,1));
    Right_Panel.setBorder(new EtchedBorder());
    Right_Panel.setPreferredSize(new Dimension(W/2,H-2));
    add(Right_Panel);

    JPanel Upper_Right_Outer_Panel=new JPanel(Fl);
    Upper_Right_Outer_Panel.setBorder(new EtchedBorder());
    Upper_Right_Outer_Panel.setPreferredSize(new Dimension(W/2-4,H/2-4));
    Right_Panel.add(Upper_Right_Outer_Panel);

    JPanel Upper_Right_Panel=new JPanel(Fl);
    Upper_Right_Panel.setPreferredSize(new Dimension(W/2-8,H/2-8));
    Upper_Right_Outer_Panel.add(Upper_Right_Panel);

    Upper_Right_JavaFX_Browser_Panel=new JavaFX_Browser_Panel(W/2-8,H/2-8);
    Upper_Right_Panel.add(Upper_Right_JavaFX_Browser_Panel);

    JPanel Lower_Right_Outer_Panel=new JPanel(Fl);
    Lower_Right_Outer_Panel.setBorder(new EtchedBorder());
    Lower_Right_Outer_Panel.setPreferredSize(new Dimension(W/2-4,H/2-4));
    Right_Panel.add(Lower_Right_Outer_Panel);

    JPanel Lower_Right_Panel=new JPanel(Fl);
    Lower_Right_Panel.setPreferredSize(new Dimension(W/2-8,H/2-8));
    Lower_Right_Outer_Panel.add(Lower_Right_Panel);

    Lower_Right_JavaFX_Browser_Panel=new JavaFX_Browser_Panel(W/2-8,H/2-8);
    Lower_Right_Panel.add(Lower_Right_JavaFX_Browser_Panel);

    setPreferredSize(new Dimension(W,H));
    Get_Maps();
  }

  void Get_Maps()
  {
    Address=Upper_Left_TextArea.getText();
    Out(Address);
    Url=Google_Url.replace("Address",Address.replace(" ","+"));
    Out(Url);

    if (Use_iFrame_B)
    {
      Left_JavaFX_Browser_Panel.Load_iFrame(Url.replace("Zoom","12&output=embed"),785,890);
      Upper_Right_JavaFX_Browser_Panel.Load_iFrame(Url.replace("Zoom","16&output=embed"),778,578);
      Lower_Right_JavaFX_Browser_Panel.Load_iFrame(Url.replace("Zoom","19&output=embed"),775,575);
    }
    else
    {
      Left_JavaFX_Browser_Panel.setURL(Url.replace("Zoom","12"));           // This works fine without output=embed in url, but it will show address bar, I want to hide that
      Upper_Right_JavaFX_Browser_Panel.setURL(Url.replace("Zoom","16"));
      Lower_Right_JavaFX_Browser_Panel.setURL(Url.replace("Zoom","19"));      
    }
  }

  public void run()
  {


  }

  public void start()
  {
    if (Empty_JPanel_Thread==null)
    {
      Empty_JPanel_Thread=new Thread(this);
      Empty_JPanel_Thread.setPriority(Thread.NORM_PRIORITY);
      Empty_JPanel_Thread.start();
    }
  }

  public void stop() { if (Empty_JPanel_Thread!=null) Empty_JPanel_Thread=null; }

  private static void out(String message) { System.out.print(message); }
  private static void Out(String message) { System.out.println(message); }

  // Create the GUI and show it. For thread safety, this method should be invoked from the event-dispatching thread.
  static void Create_And_Show_GUI()
  {
    final Map_Maker_2 demo=new Map_Maker_2();

    JFrame frame=new JFrame("Map Maker 2");
    frame.add(demo);
    frame.addWindowListener( new WindowAdapter()
    {
      public void windowActivated(WindowEvent e) { }
      public void windowClosed(WindowEvent e) { }
      public void windowClosing(WindowEvent e)  { System.exit(0); }
      public void windowDeactivated(WindowEvent e)  { }
      public void windowDeiconified(WindowEvent e)  { demo.repaint(); }
      public void windowGainedFocus(WindowEvent e)  { demo.repaint(); }
      public void windowIconified(WindowEvent e)  { }
      public void windowLostFocus(WindowEvent e)  { }
      public void windowOpening(WindowEvent e) { demo.repaint(); }
      public void windowOpened(WindowEvent e)  { }
      public void windowResized(WindowEvent e) { demo.repaint(); }
      public void windowStateChanged(WindowEvent e) { demo.repaint(); }
    });
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }

  public static void main(String[] args)
  {
    // Schedule a job for the event-dispatching thread : creating and showing this application's GUI.
    SwingUtilities.invokeLater(new Runnable() { public void run() { Create_And_Show_GUI(); } });
  }
}

好的,我找到了答案:

将JavaFX_Browser_Panel中的代码替换为:

    if (new File(Url).exists()) setURL(new File(Url));
    else eng.loadContent("<iframe width="+W+" height="+H+" src="+Url+" style=border:0; marginheight=0 marginwidth=0 allowfullscreen></iframe>");

具有以下内容:

    String Content="<Html>\n"+
                   "<style>\n"+
                   "  html,body,div,iframe\n"+
                   "  {\n"+
                   "    height: 100%;\n"+
                   "    overflow: hidden;\n"+
                   "    overflow-x: hidden;\n"+
                   "    overflow-y: hidden;\n"+
                   "    margin: 0; padding: 0;\n"+
                   "  }\n"+
                   "</style>\n"+
                   "<iframe width="+W+" height="+H+" src="+Url+" style=border:0></iframe>\n"+
                   "</Html>";
    if (new File(Url).exists()) setURL(new File(Url));
    else eng.loadContent(Content);