Java Tutorial/SWT/Browser — различия между версиями
Admin (обсуждение | вклад) м (1 версия) |
|
(нет различий)
|
Версия 20:44, 31 мая 2010
Содержание
- 1 Add CloseWindowListener to Browser
- 2 Adding OpenWindowListener
- 3 Adding ProgressListener to Browser
- 4 Adding StatusTextListener to Browser
- 5 Adding TitleListener to Browser
- 6 Adding VisibilityWindowListener
- 7 Add LocationListener to Browser
- 8 Advanced Browser
- 9 Browser: bring up a browser (pop-up blocker)
- 10 Browser: modify DOM (executing javascript)
- 11 Browser: query DOM node value
- 12 Browser: render HTML that includes relative links from memory
- 13 Browser supports the following listeners:
- 14 Renderer HTML in memory
- 15 Using Browser to load a website
- 16 Using ProgressBar to display the Browser progress
Add CloseWindowListener to Browser
The following HTML link closes the browser window:
<source lang="java">
</source>
Adding OpenWindowListener
Browser conventions allow spawning new browser windows. Things that can trigger a new browser window include the following:
- The user right-clicks a link and selects Open in New Window from the context menu (note that you must build this functionality yourself).
- The user holds down Shift while clicking a link.
- The user clicks a link that has a named target for which no browser currently exists.
When the user performs an action within the browser that spawns a new browser window, any OpenWindowListeners are first notified. OpenWindowListener declares one method:
<source lang="java">
public void open(WindowEvent event)</source>
Adding ProgressListener to Browser
<source lang="java">
import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.browser.ProgressEvent; import org.eclipse.swt.browser.ProgressListener; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.ProgressBar; import org.eclipse.swt.widgets.Shell; public class BrowserProgressListener {
public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); Browser browser = new Browser(shell, SWT.NONE); browser.setBounds(5,5,600,600); final ProgressBar progressBar = new ProgressBar(shell, SWT.NONE); progressBar.setBounds(5,650,600,20); browser.addProgressListener(new ProgressListener() { public void changed(ProgressEvent event) { if (event.total == 0) return; int ratio = event.current * 100 / event.total; progressBar.setSelection(ratio); } public void completed(ProgressEvent event) { progressBar.setSelection(0); } }); browser.setUrl("http://jexp.ru"); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); }
}</source>
Adding StatusTextListener to Browser
<source lang="java">
import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.browser.StatusTextEvent; import org.eclipse.swt.browser.StatusTextListener; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class BroserStatusTextListener {
public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); Browser browser = new Browser(shell, SWT.NONE); browser.setBounds(5,5,600,600); browser.addStatusTextListener(new StatusTextListener() { public void changed(StatusTextEvent event) { System.out.println(event.text); } }); browser.setUrl("http://jexp.ru"); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); }
}</source>
Adding TitleListener to Browser
<source lang="java">
/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/
/*
* Browser example snippet: modify HTML title tag * * For a list of all SWT example snippets see * http://www.eclipse.org/swt/snippets/ * * @since 3.1 */
import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.browser.ProgressEvent; import org.eclipse.swt.browser.ProgressListener; import org.eclipse.swt.browser.TitleEvent; import org.eclipse.swt.browser.TitleListener; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class HTMLTagModify {
public static void main(String[] args) { final String newTitle = "New Value for Title"; Display display = new Display(); final Shell shell = new Shell(display); shell.setLayout(new FillLayout()); final Browser browser = new Browser(shell, SWT.NONE); browser.addTitleListener(new TitleListener() { public void changed(TitleEvent event) { System.out.println("TitleEvent: " + event.title); shell.setText(event.title); } }); browser.addProgressListener(new ProgressListener() { public void changed(ProgressEvent event) { } public void completed(ProgressEvent event) { /* Set HTML title tag using JavaScript and DOM when page has been loaded */ boolean result = browser.execute("document.title="" + newTitle + """); if (!result) { /* Script may fail or may not be supported on certain platforms. */ System.out.println("Script was not executed."); } } }); /* Load an HTML document */ browser.setUrl("http://www.eclipse.org"); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); }
}</source>
Adding VisibilityWindowListener
<source lang="java">
import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.browser.VisibilityWindowListener; import org.eclipse.swt.browser.WindowEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class VisibilityWindowListenerUsing {
public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); Browser browser = new Browser(shell, SWT.NONE); browser.setBounds(5, 5, 600, 600); browser.addVisibilityWindowListener(new VisibilityWindowListener() { public void hide(WindowEvent event) { System.out.println("hide"); Browser browser = (Browser) event.widget; Shell shell = browser.getShell(); shell.setVisible(false); } public void show(WindowEvent event) { Browser browser = (Browser) event.widget; final Shell shell = browser.getShell(); System.out.println("Popup blocked."); shell.open(); } }); browser.setUrl("http://jexp.ru"); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); }
}</source>
Add LocationListener to Browser
The "Location" in LocationListener refers to URLs the browser is loading.
LocationListener has two methods:
<source lang="java">
void changed(LocationEvent event)
void changing(LocationEvent event)</source>
Advanced Browser
<source lang="java">
import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.browser.CloseWindowListener; import org.eclipse.swt.browser.LocationEvent; import org.eclipse.swt.browser.LocationListener; import org.eclipse.swt.browser.ProgressEvent; import org.eclipse.swt.browser.ProgressListener; import org.eclipse.swt.browser.StatusTextEvent; import org.eclipse.swt.browser.StatusTextListener; import org.eclipse.swt.browser.WindowEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.ruposite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; public class AdvancedBrowser {
private static final String AT_REST = "Ready"; public AdvancedBrowser(String location) { Display display = new Display(); Shell shell = new Shell(display); shell.setText("Advanced Browser"); shell.setLayout(new FormLayout()); Composite controls = new Composite(shell, SWT.NONE); FormData data = new FormData(); data.top = new FormAttachment(0, 0); data.left = new FormAttachment(0, 0); data.right = new FormAttachment(100, 0); controls.setLayoutData(data); Label status = new Label(shell, SWT.NONE); data = new FormData(); data.left = new FormAttachment(0, 0); data.right = new FormAttachment(100, 0); data.bottom = new FormAttachment(100, 0); status.setLayoutData(data); final Browser browser = new Browser(shell, SWT.BORDER); data = new FormData(); data.top = new FormAttachment(controls); data.bottom = new FormAttachment(status); data.left = new FormAttachment(0, 0); data.right = new FormAttachment(100, 0); browser.setLayoutData(data); controls.setLayout(new GridLayout(7, false)); Button button = new Button(controls, SWT.PUSH); button.setText("Back"); button.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { browser.back(); } }); button = new Button(controls, SWT.PUSH); button.setText("Forward"); button.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { browser.forward(); } }); button = new Button(controls, SWT.PUSH); button.setText("Refresh"); button.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { browser.refresh(); } }); button = new Button(controls, SWT.PUSH); button.setText("Stop"); button.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { browser.stop(); } }); final Text url = new Text(controls, SWT.BORDER); url.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); url.setFocus(); button = new Button(controls, SWT.PUSH); button.setText("Go"); button.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { browser.setUrl(url.getText()); } }); Label throbber = new Label(controls, SWT.NONE); throbber.setText(AT_REST); shell.setDefaultButton(button); browser.addCloseWindowListener(new AdvancedCloseWindowListener()); browser.addLocationListener(new AdvancedLocationListener(url)); browser.addProgressListener(new AdvancedProgressListener(throbber)); browser.addStatusTextListener(new AdvancedStatusTextListener(status)); // Go to the initial URL if (location != null) { browser.setUrl(location); } shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } class AdvancedCloseWindowListener implements CloseWindowListener { public void close(WindowEvent event) { ((Browser) event.widget).getShell().close(); } } class AdvancedLocationListener implements LocationListener { private Text location; public AdvancedLocationListener(Text text) { location = text; } public void changing(LocationEvent event) { location.setText("Loading " + event.location + "..."); } public void changed(LocationEvent event) { location.setText(event.location); } } class AdvancedProgressListener implements ProgressListener { private Label progress; public AdvancedProgressListener(Label label) { progress = label; } public void changed(ProgressEvent event) { if (event.total != 0) { int percent = (int) (event.current / event.total); progress.setText(percent + "%"); } else { progress.setText("?"); } } public void completed(ProgressEvent event) { progress.setText(AT_REST); } } class AdvancedStatusTextListener implements StatusTextListener { private Label status; public AdvancedStatusTextListener(Label label) { status = label; } public void changed(StatusTextEvent event) { status.setText(event.text); } } public static void main(String[] args) { new AdvancedBrowser("http://www.google.ru"); }
}</source>
Browser: bring up a browser (pop-up blocker)
<source lang="java">
/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/
package org.eclipse.swt.snippets; /*
* Browser snippet: bring up a browser (pop-up blocker) * * For a list of all SWT example snippets see * http://www.eclipse.org/swt/snippets/ * * @since 3.1 */
import org.eclipse.swt.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.graphics.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.browser.*; public class Snippet173 { public static void main(String[] args) {
Display display = new Display(); Shell shell = new Shell(display); shell.setText("Main Window"); shell.setLayout(new FillLayout()); Browser browser = new Browser(shell, SWT.NONE); initialize(display, browser); shell.open(); /* any website with popups */ browser.setUrl("http://www.cnn.ru"); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); }
/* register WindowEvent listeners */ static void initialize(final Display display, Browser browser) {
browser.addOpenWindowListener(new OpenWindowListener() { public void open(WindowEvent event) { Shell shell = new Shell(display); shell.setText("New Window"); shell.setLayout(new FillLayout()); Browser browser = new Browser(shell, SWT.NONE); initialize(display, browser); event.browser = browser; } }); browser.addVisibilityWindowListener(new VisibilityWindowListener() { public void hide(WindowEvent event) { Browser browser = (Browser)event.widget; Shell shell = browser.getShell(); shell.setVisible(false); } public void show(WindowEvent event) { Browser browser = (Browser)event.widget; final Shell shell = browser.getShell(); /* popup blocker - ignore windows with no style */ if (!event.addressBar && !event.menuBar && !event.statusBar && !event.toolBar) { System.out.println("Popup blocked."); event.display.asyncExec(new Runnable() { public void run() { shell.close(); } }); return; } if (event.location != null) shell.setLocation(event.location); if (event.size != null) { Point size = event.size; shell.setSize(shell.ruputeSize(size.x, size.y)); } shell.open(); } }); browser.addCloseWindowListener(new CloseWindowListener() { public void close(WindowEvent event) { Browser browser = (Browser)event.widget; Shell shell = browser.getShell(); shell.close(); } });
} }</source>
Browser: modify DOM (executing javascript)
<source lang="java">
/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/
/*
* Browser example snippet: modify DOM (executing javascript) * * For a list of all SWT example snippets see * http://www.eclipse.org/swt/snippets/ * * @since 3.1 */
import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.ruposite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; public class JavascriptExec {
public static void main(String[] args) {final String html = "<html><title>Snippet</title><body>
Best Friends
Cat and Dog
</body></html>";Display display = new Display(); final Shell shell = new Shell(display); shell.setLayout(new FillLayout()); final Browser browser = new Browser(shell, SWT.BORDER); Composite comp = new Composite(shell, SWT.NONE); comp.setLayout(new FillLayout(SWT.VERTICAL)); final Text text = new Text(comp, SWT.MULTI); text.setText("var newNode = document.createElement("P"); \r\n" + "var text = document.createTextNode("At least when I am around");\r\n" + "newNode.appendChild(text);\r\n" + "document.getElementById("myid").appendChild(newNode);\r\n" + "\r\n" + "document.bgColor="yellow";"); final Button button = new Button(comp, SWT.PUSH); button.setText("Execute Script"); button.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { boolean result = browser.execute(text.getText()); if (!result) { /* Script may fail or may not be supported on certain platforms. */ System.out.println("Script was not executed."); } } }); browser.setText(html); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); }
}</source>
Browser: query DOM node value
<source lang="java">
/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/
/*
* Browser example snippet: query DOM node value * * For a list of all SWT example snippets see * http://www.eclipse.org/swt/snippets/ * * @since 3.1 */
import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.browser.ProgressEvent; import org.eclipse.swt.browser.ProgressListener; import org.eclipse.swt.browser.StatusTextEvent; import org.eclipse.swt.browser.StatusTextListener; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class DOMQuerySWTBrowser {
public static void main(String[] args) {final String html = "<html><title>Snippet</title><body>
Best Friends
Cat and Dog
</body></html>";Display display = new Display(); final Shell shell = new Shell(display); shell.setLayout(new FillLayout()); final Browser browser = new Browser(shell, SWT.NONE); browser.addStatusTextListener(new StatusTextListener() { public void changed(StatusTextEvent event) { browser.setData("query", event.text); } }); browser.addProgressListener(new ProgressListener() { public void changed(ProgressEvent event) { } public void completed(ProgressEvent event) { /* * Use JavaScript to query the desired node content through the Document * Object Model * * Assign result to the window property status to pass the result to the * StatusTextListener This trick is required sinceexecute
* does not return theString
directly. */ boolean result = browser .execute("window.status=document.getElementById("myid").childNodes[0].nodeValue;"); if (!result) { /* Script may fail or may not be supported on certain platforms. */ System.out.println("Script was not executed."); return; } String value = (String) browser.getData("query"); System.out.println("Node value: " + value); } }); /* Load an HTML document */ browser.setText(html); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); }
}</source>
Browser: render HTML that includes relative links from memory
<source lang="java">
/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/
/*
* Browser example snippet: render HTML that includes relative links from memory * * For a list of all SWT example snippets see * http://www.eclipse.org/swt/snippets/ * * @since 3.0 */
import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class HTMLRenderRelativeMemory {
public static void main(String[] args) { /* Relative links: use the HTML base tag */ String html = "<html><head>" + "<base href=\"http://www.eclipse.org/swt/\" >" + "<title>HTML Test</title></head>" + "<body></body></html>"; Display display = new Display(); Shell shell = new Shell(display); shell.setLayout(new FillLayout()); Browser browser = new Browser(shell, SWT.NONE); browser.setText(html); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); }
}</source>
Browser supports the following listeners:
- CloseWindowListener
- LocationListener
- OpenWindowListener
- ProgressListener
- StatusTextListener
- VisibilityWindowListener
Renderer HTML in memory
<source lang="java">
import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class HTMLRendererInMemory {
public static void main(String[] args) { String html = "<HTML><HEAD><TITLE>HTML Test</TITLE></HEAD><BODY>"; for (int i = 0; i < 100; i++){ html += "
"; } html += "</BODY></HTML>"; Display display = new Display(); Shell shell = new Shell(display); shell.setLayout(new FillLayout()); Browser browser = new Browser(shell, SWT.NONE); browser.setText(html); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); }
}</source>
Using Browser to load a website
<source lang="java">
import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class BrowserLoadingWebsite {
public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); Browser browser = new Browser(shell, SWT.NONE); browser.setBounds(5,5,600,600); browser.setUrl("http://jexp.ru"); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); }
}</source>
Using ProgressBar to display the Browser progress
<source lang="java">
import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.browser.ProgressEvent; import org.eclipse.swt.browser.ProgressListener; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.ProgressBar; import org.eclipse.swt.widgets.Shell; public class BrowserProgress {
public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); Browser browser = new Browser(shell, SWT.NONE); browser.setBounds(5,5,600,600); final ProgressBar progressBar = new ProgressBar(shell, SWT.NONE); progressBar.setBounds(5,650,600,20); browser.addProgressListener(new ProgressListener() { public void changed(ProgressEvent event) { if (event.total == 0) return; int ratio = event.current * 100 / event.total; progressBar.setSelection(ratio); } public void completed(ProgressEvent event) { progressBar.setSelection(0); } }); browser.setUrl("http://jexp.ru"); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); }
}</source>