是什么导致了我的java awt和swing浏览器';s后退按钮不能正常工作?
actionForward和actionBack函数都抛出IndexOutofBounds异常,我不知道为什么?我的任务是制作一个非常简单的网页浏览器,带有后退和前进按钮以及url地址栏。当ArrayList页面列表的大小为2时,按钮按预期工作。但是,一旦页面列表的大小为3或更多,它们就会中断是什么导致了我的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
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
ActionListener
。按下Enter键时将调用ActionListener。
if (pageIndex < listSize - 1) {
for (int i = listSize - 1; i > pageIndex; i--) {
pageList.remove(i);
}
}