使用throw / catch的鼠标监听器(java)

时间:2012-08-01 16:14:36

标签: java swing try-catch mouselistener throw

我在名为test2;

的软件包中名为Test2.java的文件中有以下代码
package test2;

import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class Test2 {
    public static void main(String[] args) {
        int k = 7;
        while(true) {
            try {
                JFrame mainWindow = new HtmlWindow(k);
            } catch(UnsupportedOperationException numberChosen) {
                JOptionPane.showInternalMessageDialog(null, "information",
                        "You clicked on number " + numberChosen, 
                        JOptionPane.INFORMATION_MESSAGE);
                Integer l = new Integer("0" + numberChosen);
            }
        }
    }
}

我在同一个包中名为HtmlWindow的文件中有以下代码;

package test2;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JLabel;

class HtmlWindow extends JFrame implements MouseListener {
    public HtmlWindow(int k) throws UnsupportedOperationException {
        super("blah");
        setSize(150, 200);
        Container content = getContentPane();
        content.setLayout(new FlowLayout());
        JLabel[] coloredLabel = new JLabel[k];
        String[] labelText = new String[k];
        for(int i=0; i<=k-1; i++) {
            labelText[i] = "<html><img src = "
                + "\"http://images.nycsubway.org/bullets/lines/"
                + (i+1)
                + ".GIF\">"
                + "</html>";
            coloredLabel[i] = new JLabel(labelText[i]);
            coloredLabel[i].setName((i + 1) + " ");
            coloredLabel[i].addMouseListener(this);
            addMouseListener(this);
            content.add(coloredLabel[i]);
        }
        this.setVisible(true);
        while(true) {
        }
    }

@Override
public void mousePressed(MouseEvent me) {
}

@Override
public void mouseReleased(MouseEvent me) {
}

@Override
public void mouseEntered(MouseEvent me) {
}

@Override
public void mouseExited(MouseEvent me) {
}

@Override
public void mouseClicked(MouseEvent me) {
    throw new UnsupportedOperationException(me.getComponent().getName());
}
}

当我运行它时,会出现一个预期的窗口,其中包含数字图片,但是当我点击它们中的任何一个时,不会捕获异常抛出。为什么是这样?指针应该在HTMLWindow构造函数中的“while”部分周围,因此仍然在“try”部分,因此应该被捕获。我的猜测是因为mouseClicked部分不在HTMLWindow构造函数中,异常以某种方式抛出try块之外?

如果这不是从GUI获取信息回原始程序的最佳方式,那是什么?我不认为这是通过使用“返回”,因为

  • 构造函数没有返回类型
  • mouseClicked不在构造函数中任何方式

除此之外 - 我不特别希望程序在移动数字等时做任何事情,只需点击它们即可。那么为什么我需要mousePressed块等等?没有它们,程序将无法编译。可以把它们留空吗?

1 个答案:

答案 0 :(得分:2)

  

指针应该围绕HTMLWindow构造函数中的“while”部分,因此仍然在“try”部分内,因此应该被捕获。

它仍然在try块内 - 但显然while循环不会抛出异常,是吗?

您似乎假设

  • UI将在不同的线程上运行
  • UI线程上抛出的任何异常都会以某种方式被编组到包含构造函数的线程

我不知道第一个子弹,但第二个肯定是是不正确的。 (紧张的while(true)循环从不正确的解决方案......)

  

如果这不是从GUI获取信息回原始程序的最佳方式,那是什么?

你想要实现的目标并不是很清楚,但通常GUI都是“面向事件的” - 所以也许你应该想办法让GUI暴露某种你的其他代码可以挂钩的监听器

  

除此之外 - 我不特别希望程序在移动数字等时做任何事情,只需点击它们即可。那么为什么我需要mousePressed块等等?没有它们,程序将无法编译。可以把它们留空吗?

不使用直接实现MouseListener,而是使用其中一个适配器类(例如MouseAdapter),它实现了相关的接口,为您提供了无操作的实现。但显然你无法使你的窗口扩展MouseAdapter JFrame - 你应该在这里有两个不同的类。