gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:43:09 25 4
gpt4 key购买 nike

我在名为 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 block 之外?

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

  • 构造函数没有返回类型
  • mouseClicked 无论如何都不在构造函数内

旁白 - 当我移动数字等时,我并不特别希望程序执行任何操作,只需单击它们即可。那么为什么我需要 mousePressed block 等等?如果没有它们,程序将无法编译。像这样将它们留空可以吗?

最佳答案

The pointer should be going around the "while" section in the HTMLWindow constructor, and thus still be within the "try" section, and so should be caught.

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

您似乎假设:

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

我不知道第一个项目符号,但第二个项目符号肯定是不正确的。 (紧密的 while(true) 循环永远都不是正确的解决方案......)

If this is not the best way to get information from the GUI back to the original programme, what is?

目前还不清楚你想要实现什么,但通常 GUI 是“面向事件的” - 所以也许你应该考虑一种方法,使 GUI 公开某种监听器,其他代码可以将其挂接到其中.

Aside - I don't particularly want the programme to do anything when I move over the numbers etc, just click on them. So why do I need the mousePressed blocks and so on? The programme won't compile without them. Is it okay to just leave them blank like that?

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

关于java - 使用 throw/catch 的鼠标监听器 (java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11763388/

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