2012-08-01 51 views
1

我在名爲test2的包中名爲Test2.java的文件中具有以下代碼;使用throw/catch(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模塊等?沒有它們,程序將不會編譯。把它們留空就可以了嗎?

回答

2

指針應該繞過HTMLWindow構造函數中的「while」部分,因此仍然位於「try」部分內,因此應該被捕獲。

它仍然是try塊中 - 但顯然這while循環不會拋出異常,是什麼呢?

你似乎假設是:

  • 的UI將是在不同的線程運行
  • 拋出的UI線程上的任何異常以某種方式將被整理到包含線程構造

我不知道第一顆子彈,但第二絕對是不正確的。 (和從緊的while(true)環路從未合適的解決方案...)

如果這不是爲了從GUI信息返回到原程序的最佳方式是什麼?

這不是真的清楚你要達到什麼樣的,但一般的GUI是「面向事件」 - 這樣也許你應該考慮的製作方式的GUI暴露某種監聽你的其他代碼可以鉤入。

另外 - 我不特別希望程序做任何事情時,我移動數字等,只需點擊它們。那麼爲什麼我需要mousePressed模塊等?沒有它們,程序將不會編譯。把它們留空就可以了嗎?

代替直接實施MouseListener的,使用適配器類(例如MouseAdapter),它實現了相關的接口之一,提供無操作實現爲您服務。但顯然你不能讓你的窗口延伸MouseAdapterJFrame - 你應該在這裏有兩個單獨的類。