Что заставляет мой java awt и кнопку возврата браузера назад не работать должным образом? - PullRequest
0 голосов
/ 09 марта 2020

Функции actionForward и actionBack выдают исключения IndexOutofBounds, и я не могу понять, почему? Мне было поручено создать очень простой веб-браузер с функциями кнопок «назад» и «вперед», а также адресной строкой URL. Когда ArrayList pageList имеет размер 2, кнопки работают как положено. Тем не менее, когда размер pageList имеет размер 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();
        }
    }
}

1 Ответ

0 голосов
/ 09 марта 2020
                if (pageIndex < listSize - 1) {
                    for (int i = listSize - 1; i > pageIndex; i--) {
                        pageList.remove(i);
                    }
                }

Есть две очевидные проблемы с этим.

  • Вы должны удалить только одну страницу из истории.
  • Если страница находится в конце (pageIndex == listSize - 1 ), то вы не удаляете страницу, а добавляете дубликат.
...