是什么导致了我的java awt和swing浏览器';s后退按钮不能正常工作?

是什么导致了我的java awt和swing浏览器';s后退按钮不能正常工作?,java,swing,awt,Java,Swing,Awt,actionForward和actionBack函数都抛出IndexOutofBounds异常,我不知道为什么?我的任务是制作一个非常简单的网页浏览器,带有后退和前进按钮以及url地址栏。当ArrayList页面列表的大小为2时,按钮按预期工作。但是,一旦页面列表的大小为3或更多,它们就会中断 class Proj03RunnerHtmlHandler extends JFrame implements HyperlinkListener{ JEditorPane html; J

actionForward和actionBack函数都抛出IndexOutofBounds异常,我不知道为什么?我的任务是制作一个非常简单的网页浏览器,带有后退和前进按钮以及url地址栏。当ArrayList页面列表的大小为2时,按钮按预期工作。但是,一旦页面列表的大小为3或更多,它们就会中断

class Proj03RunnerHtmlHandler extends JFrame implements HyperlinkListener{
    JEditorPane html;
    JButton backButton, forwardButton;
    JTextField urlTextField;
    ArrayList<String> pageList = new ArrayList<String>();

    public Proj03RunnerHtmlHandler(String website) {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Asg03");
        pageList.add(website);

        try{
            if(website != null){
                html = new JEditorPane(website);
                html.setEditable(false);
                html.addHyperlinkListener(this);

                JPanel buttonPanel = new JPanel();
                backButton = new JButton("Back");
                backButton.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        actionBack();
                    }
                });
                buttonPanel.add(backButton);

                urlTextField = new JTextField("http://www.somesite.com");
                urlTextField.addKeyListener(new KeyAdapter() {
                    public void keyReleased(KeyEvent e){
                        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                            try {
                                showPage(new URL(urlTextField.getText()), true);
                            } catch(Exception ey){
                                ey.printStackTrace();
                            }
                        }
                    }
                });
                buttonPanel.add(urlTextField);

                forwardButton = new JButton("Forward");
                forwardButton.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        actionForward();
                    }
                });
                buttonPanel.add(forwardButton);

                JScrollPane scroller = new JScrollPane();
                JViewport vp = scroller.getViewport();
                vp.add(html);

                this.getContentPane().add(buttonPanel, BorderLayout.NORTH);
                this.getContentPane().add(scroller, BorderLayout.CENTER);
                this.setSize(669,669);
                this.setVisible(true);
            }
        } catch(Exception e){
            e.printStackTrace();
        }
    }

    public void hyperlinkUpdate(HyperlinkEvent e){
        if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED){
            if (!(e instanceof HTMLFrameHyperlinkEvent)) {
                try {
                    showPage(e.getURL(), true);
                } catch(Exception ex){
                    ex.printStackTrace();
                }
            }
        }
    }

    public void actionBack() {
        try {
            String currentUrl = html.getPage().toString();
            int currentIndex = pageList.indexOf(currentUrl);
            showPage(new URL(pageList.get(currentIndex - 1)), false);
        } catch (Exception e){
            e.printStackTrace();
        }
    }

    public void actionForward() {
        try {
            String currentUrl = html.getPage().toString();
            int currentIndex = pageList.indexOf(currentUrl);
            showPage(new URL(pageList.get(currentIndex + 1)), false);
        } catch (Exception e){
            e.printStackTrace();
        }
    }

    public void showPage(URL pageUrl, boolean addToList){
        try {
            URL currentUrl = html.getPage();

            html.setPage(pageUrl);

            if (addToList) {
                int listSize = pageList.size();
                if (listSize > 0) {
                    int pageIndex =
                            pageList.indexOf(currentUrl.toString());
                    if (pageIndex < listSize - 1) {
                        for (int i = listSize - 1; i > pageIndex; i--) {
                            pageList.remove(i);
                        }
                    }
                }
                pageList.add(pageUrl.toString());
            }
            urlTextField.setText(pageUrl.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
类Proj03RunnerHtmlHandler扩展JFrame实现HyperlinkListener{
电子版html;
JButton backButton、forwardButton;
JTextField-urtextfield;
ArrayList pageList=新建ArrayList();
公共Proj03RunnerHtmlHandler(字符串网站){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle(“Asg03”);
页面列表。添加(网站);
试一试{
如果(网站!=null){
html=新的电子版(网站);
html.setEditable(false);
addHyperlinkListener(this);
JPanel buttonPanel=新的JPanel();
backButton=新的JButton(“Back”);
addActionListener(新ActionListener()){
已执行的公共无效操作(操作事件e){
actionBack();
}
});
按钮面板。添加(backButton);
urlTextField=新的JTextField(“http://www.somesite.com");
urlTextField.addKeyListener(新的KeyAdapter(){
公共无效密钥已释放(密钥事件e){
如果(例如getKeyCode()==KeyEvent.VK_ENTER){
试一试{
showPage(新URL(urlTextField.getText()),true);
}捕获(异常ey){
ey.printStackTrace();
}
}
}
});
buttonPanel.add(urlTextField);
forwardButton=新的JButton(“Forward”);
addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
行动前进();
}
});
按钮面板。添加(前进按钮);
JScrollPane scroller=新的JScrollPane();
JViewport vp=scroller.getViewport();
vp.add(html);
this.getContentPane().add(buttonPanel,BorderLayout.NORTH);
this.getContentPane().add(滚动条,BorderLayout.CENTER);
此.setSize(669669);
此.setVisible(true);
}
}捕获(例外e){
e、 printStackTrace();
}
}
公共无效hyperlinkUpdate(HyperlinkEvent e){
如果(e.getEventType()==HyperlinkEvent.EventType.ACTIVATED){
if(!(HTMLFrameHyperlinkEvent的e实例)){
试一试{
showPage(如getURL(),true);
}捕获(例外情况除外){
例如printStackTrace();
}
}
}
}
公开作废actionBack(){
试一试{
字符串currentUrl=html.getPage().toString();
int currentIndex=pageList.indexOf(currentUrl);
showPage(新URL(pageList.get(currentIndex-1)),false);
}捕获(例外e){
e、 printStackTrace();
}
}
公共无效行动转发(){
试一试{
字符串currentUrl=html.getPage().toString();
int currentIndex=pageList.indexOf(currentUrl);
showPage(新URL(pageList.get(currentIndex+1)),false);
}捕获(例外e){
e、 printStackTrace();
}
}
公共无效显示页面(URL页面URL,布尔添加列表){
试一试{
URL currentUrl=html.getPage();
setPage(pageUrl);
如果(添加列表){
int listSize=pageList.size();
如果(列表大小>0){
整型页面索引=
index(currentUrl.toString());
如果(页面索引<列表大小-1){
对于(inti=listSize-1;i>pageIndex;i--){
页面列表。删除(i);
}
}
}
pageList.add(pageUrl.toString());
}
urlTextField.setText(pageUrl.toString());
}捕获(例外e){
e、 printStackTrace();
}
}
}
if(页面索引pageIndex;i--){
页面列表。删除(i);
}
}
这有两个明显的问题

  • 您应该只从历史记录中删除一页
  • 如果页面位于末尾(
    pageIndex==listSize-1
    ),则不删除该页面,而是添加一个副本
1)进行一些调试。显示索引的值,然后确定其超出范围的原因。2) 不要将KeyListener添加到文本字段。添加一个
ActionListener
。按下Enter键时将调用ActionListener。
                if (pageIndex < listSize - 1) {
                    for (int i = listSize - 1; i > pageIndex; i--) {
                        pageList.remove(i);
                    }
                }