gpt4 book ai didi

java - 是什么导致我的 java awt 和 swing 浏览器的后退按钮无法正常工作?

转载 作者:行者123 更新时间:2023-12-01 18:03:34 24 4
gpt4 key购买 nike

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();
}
}
}

最佳答案

                if (pageIndex < listSize - 1) {
for (int i = listSize - 1; i > pageIndex; i--) {
pageList.remove(i);
}
}

这有两个明显的问题。

  • 您应该只从历史记录中删除一页。
  • 如果页面位于末尾 (pageIndex == listSize - 1),则您不会删除该页面,而是添加副本。

关于java - 是什么导致我的 java awt 和 swing 浏览器的后退按钮无法正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60593589/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com