Typowe użycie, w konstruktorze
helpPanel=new HelpHtml(...);
w obsłudze zdarzenia
if(helpPanel.isVisible())
helpPanel.setExtendedState(NORMAL);
else
helpPanel.setVisible(true);
Kod klasy:
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
public class HelpHtml extends JFrame implements HyperlinkListener,ActionListener
{
private JEditorPane ep=new JEditorPane();
private JButton back;
private JButton forward;
private JButton home;
private JButton refresh;
private ArrayList<URL> urls=new ArrayList<URL>();
private int currentUrl=0;
private URL url=null;
private String subdirectory="images";
private boolean ok=true;
//------------------------
public HelpHtml(String file,String title,Dimension d,boolean navigationBar,String subdirectory,Component c)
{
super(title);
this.subdirectory=subdirectory;
String helpFile=System.getProperty("currentUser.dir",".")+System.getProperty("file.separator","\\")+file;
File f=new File(helpFile);
if(!f.exists())
{
ok=false;
}
if(ok)
{
try
{
url=new URL("file:"+helpFile);
}
catch (Exception e)
{
My.say(e.getMessage(),c);
ok=false;
}
}
if(ok)
{
urls.add(url);
setLayout(new BorderLayout(2,2));
ep.setEditable(false);
ep.addHyperlinkListener(this);
try
{
ep.setPage(url);
}
catch (Exception e)
{
}
JScrollPane sp=new JScrollPane(ep);
sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
sp.setPreferredSize(d);
ep.setDocument((HTMLDocument)ep.getDocument());
add(sp,"Center");
if(navigationBar)
{
setToolBar();
}
pack();
setVisible(false);
}
}
//------------------------
public HelpHtml(URL url,String title,Dimension d,boolean navigationBar)
{
super(title);
this.url=url;
urls.add(url);
setLayout(new BorderLayout(2,2));
ep.setEditable(false);
ep.addHyperlinkListener(this);
try
{
ep.setPage(url);
}
catch (Exception e)
{
}
JScrollPane sp=new JScrollPane(ep);
sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
sp.setPreferredSize(d);
ep.setDocument((HTMLDocument)ep.getDocument());
add(sp,"Center");
if(navigationBar)
{
setToolBar();
}
pack();
setVisible(false);
}
//---------------------------
public HelpHtml(URL url,String title,Dimension d)
{
this(url,title,d,true);
}
//---------------------------
public HelpHtml(URL url,String title)
{
this(url,title,new Dimension(640,480),true);
}
//---------------------------
public HelpHtml(URL url)
{
this(url,"Objaśnienia",new Dimension(640,480),true);
}
//---------------------------
private void setToolBar()
{
back=new JButton(new ImageIcon(subdirectory+"/Back.gif"));
forward=new JButton(new ImageIcon(subdirectory+"/Forward.gif"));
home=new JButton(new ImageIcon(subdirectory+"/Home.gif"));
refresh=new JButton(new ImageIcon(subdirectory+"/Refresh.gif"));
JToolBar tb=new JToolBar();
back.setToolTipText("Wstecz");
back.addActionListener(this);
back.setEnabled(false);
tb.add(back);
forward.setToolTipText("Naprzód");
forward.addActionListener(this);
forward.setEnabled(false);
tb.add(forward);
home.setToolTipText(url.toString());
home.addActionListener(this);
home.setEnabled(false);
tb.add(home);
refresh.setToolTipText("Odświeżenie");
refresh.addActionListener(this);
refresh.setEnabled(true);
tb.add(refresh);
add(tb,"North");
}
//---------------------------
public boolean isOk()
{
return ok;
}
//---------------------------
public void hyperlinkUpdate(HyperlinkEvent e)
{
if (e.getEventType()==HyperlinkEvent.EventType.ACTIVATED)
{
if (e instanceof HTMLFrameHyperlinkEvent)
{
HTMLFrameHyperlinkEvent evt=(HTMLFrameHyperlinkEvent)e;
HTMLDocument doc=(HTMLDocument)ep.getDocument();
doc.processHTMLFrameHyperlinkEvent(evt);
}
else
{
try
{
URL newUrl=e.getURL();
ep.setPage(newUrl);
if(currentUrl==urls.size()-1)
{
urls.add(newUrl);
currentUrl++;
setButtons();
return;
}
if(newUrl.equals(urls.get(currentUrl+1)))
{
currentUrl++;
setButtons();
return;
}
for(int i=currentUrl;i<urls.size();i++)
{
if(i>0)
{
urls.remove(i);
}
}
urls.add(newUrl);
currentUrl++;
setButtons();
}
catch (Throwable t)
{
My.showStack(t,10);
}
}
}
}
//------------------------
public void actionPerformed(ActionEvent ae)
{
JButton src=(JButton)ae.getSource();
if(src==back)
{
try
{
ep.setPage(urls.get(currentUrl-1));
currentUrl--;
setButtons();
return;
}
catch (Throwable t)
{
My.showStack(t,10);
}
}
if(src==forward)
{
try
{
ep.setPage(urls.get(currentUrl+1));
currentUrl++;
setButtons();
return;
}
catch (Throwable t)
{
My.showStack(t,10);
}
}
if(src==home)
{
try
{
ep.setPage(url);
currentUrl=0;
setButtons();
}
catch (Throwable t)
{
My.showStack(t,10);
}
}
if(src==refresh)
{
try
{
Document doc=ep.getDocument();
doc.putProperty(Document.StreamDescriptionProperty,null);
ep.setPage(urls.get(currentUrl));
setButtons();
}
catch (Throwable t)
{
My.showStack(t,10);
}
}
}
//------------------------
private void setButtons()
{
if(urls.size()<=1)
{
back.setEnabled(false);
home.setEnabled(false);
forward.setEnabled(false);
}
else
{
if(currentUrl==0)
{
back.setEnabled(false);
home.setEnabled(false);
forward.setEnabled(true);
return;
}
if(currentUrl==urls.size()-1)
{
back.setEnabled(true);
home.setEnabled(true);
forward.setEnabled(false);
return;
}
back.setEnabled(true);
home.setEnabled(true);
forward.setEnabled(false);
}
}
}
Wywołania metod klasy My zamień na swoją ulubioną obsługę wyjątków.
Program korzysta z czterech ikonek, możesz je pobrać stąd http://atos.wmid.amu.edu.pl/~bogdan/images/resources.zip</url></url>