Java 通知调用方类发生了什么事情
比如说,您有一个子类Java 通知调用方类发生了什么事情,java,swing,Java,Swing,比如说,您有一个子类JFrame,并使用它创建您自己的自定义JFrame。在这个类中(我们称之为大型机),我们创建了对另一个自定义JFrame类的引用(我们称之为侧面板) 在侧面板中,您有不同的按钮、单选按钮 我的问题是,有没有一种方法可以通知用户按下按钮的主机 我创建了一个(未经测试的)示例来说明我的意思: class mainFrame extends JFrame { public mainFrame() { super("main frame"); //..
JFrame
,并使用它创建您自己的自定义JFrame
。在这个类中(我们称之为大型机
),我们创建了对另一个自定义JFrame
类的引用(我们称之为侧面板
)
在侧面板中
,您有不同的按钮、单选按钮
我的问题是,有没有一种方法可以通知用户按下按钮的主机
我创建了一个(未经测试的)示例来说明我的意思:
class mainFrame extends JFrame {
public mainFrame() {
super("main frame");
//...........
sidePanel panel = new sidePanel();
//...........
}
public static void main(String[] args) {
mainFrame mainF = new mainFrame();
//.........
}
}
和侧面板
类:
class sidePanel extends JFrame {
public sidePanel() {
super("sidePanel frame");
//...........
JButton button1 = new JButton();
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
//Notify mainFrame somehow button is pressed
}});
//...........
}
}
若要将事件通知
大型机
,侧面板
实例(对于帧而言,名称非常糟糕)必须具有对大型机
的引用。将mainFrame
作为侧面板构造函数的参数传递,并从侧面板中的actionPerformed
方法回调mainFrame
:
SidePanel panel = new SidePanel(this);
public void actionPerformed(ActionEvent e) {
mainFrame.buttonHasBeenClicked();
...
}
在侧面板中:
SidePanel panel = new SidePanel(this);
public void actionPerformed(ActionEvent e) {
mainFrame.buttonHasBeenClicked();
...
}
不过,这两个类紧密结合在一起。将它们解耦的一种方法是使侧面板对象接受自定义事件的侦听器,并在单击按钮时触发此类事件。大型机将构造侧面板实例,并将自身(或内部匿名类实例)作为侦听器添加到侧面板
例如,请参阅。“假设您有一个子类JFrame,并使用它创建您自己的自定义JFrame。在这个类中(我们称之为mainFrame,我们创建了对另一个自定义JFrame的引用…”这是两个设计错误,共两句话。很好!1)一个应用程序。通常需要对框架的引用,而不是扩展框架的类。2) 不要使用多个框架。除了显示其余内容外,还有多种选择。@AndrewThompson好吧,我只是想制作一个带有主框架和侧框架的应用程序,比如GIMP或其他许多绘画程序。仅仅使用2个JFrames是最简单的事情。你有什么建议?我对其他想法持开放态度。“喜欢GIMP”GIMP通常被定位为一个经典的例子,说明为什么我们不应该将多帧应用程序强加给(不幸的)最终用户。“我对其他想法持开放态度。”1)一个拥有许多
JDialog
实例的JFrame
。2) 一个JDesktopPane
有许多JInternalFrame
实例3)一个JFrame
有许多可浮动JToolBar
实例..其他建议:一个带侧窗格的JSplitPane。。。另一方面,谢谢你的提示,我选择了JToolBar选项:)谢谢你的回答和链接,但是还有其他方法吗(比如线程)?Swing应用程序中的ThanksAll事件处理代码在事件调度线程中执行。无论如何,线程是用来并行执行多个任务的,而不是在对象之间进行通信。我看不出线程与您的问题有多大关系。EventListenerList的+1;另见此。