当前位置: 首页 > 知识库问答 >
问题:

使用ActionListener按钮单击隐藏一个JFrame并显示另一个时出错

令狐昌胤
2023-03-14

我试图在点击按钮时“打开”一个不同的JFrame窗口(在本例中是“尺寸”按钮),就像在浏览菜单时一样。我有两个窗口,主函数和ActionListener作为单独的类。当我点击应该将我重定向到另一个窗口的按钮时,它只会显示一个错误,而不会隐藏第一个窗口并显示第二个窗口。错误是:

"异常线程"AWT-EventQueue-0"java.lang.ClassCastExc0019:类javax.swing.JButton不能强制转换为类javax.swing.JFrame(javax.swing.JButton和javax.swing.JFrame在模块java.desktop的加载程序'引导')在ActionDimensions.action执行(ActionDimensions.java: 8)在java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1972)在java.desktop/javax.swing.AbstractButton$Handler.action执行(AbstractButton.java:2313)在java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)在java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)在java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)在java.desktop/java.awt.Component.processMouseEvent(Component. java: 6626)在java.桌面/javax. swings。在java.桌面/java. awt.处理事件(Component. java: 6391)在java.桌面/java. awt.在java.桌面/java. awt.在java.桌面/java. awt.在java.桌面/java. awt.在java.桌面/java. awt.在java.桌面/java. awt.在java.桌面/java. awt.在java.桌面/java. awt.在java.桌面/java. awt.在java.桌面/java. awt.在java.桌面/java. awt.EventQueue4 USD. run(EventQueue. java: 722)在java.桌面/java. awt.在java. base/java. security.AccessController. doPrivileged(AccessController. java: 399)在java. base/java. security.在java. base/java. security上保护域名$JavaSecurityAccessImp. doIntersectionPrivilge(Protse Domain. java: 86)。保护域$JavaSecurityAccessImp. doIntersectionPrivilge(Protse Domain. java: 97)在java.桌面/java. awt.EventQueue5 USD. run(EventQueue. java: 746)在java.桌面/java. awt.在java. base/java. security.AccessController. doPrivileged(AccessController. java: 399)在java. base/java. security.保护域$JavaSecurityAccessImp. doIntersectionPrivilge(Protse Domain. java: 86)在java.桌面/java. awt.事件(EventQueue. java: 743)在java.桌面/java. awt.EventDispatchThread. pumpEventsForFilter(EventDispatchThread. java: 124)在java.桌面/java. awt.java: 113)在java.桌面/java. awt.在java.桌面/java. awt.在java.桌面/java. awt.运行(EventDispatchThread. java: 90)"

第一窗口:

public class MainMenu extends JFrame {
   public MainMenu(){
       setSize(300,600);
       JPanel center = new JPanel();
       center.setLayout(new GridLayout(3,1));
       JButton MainMenuButtonStart = new JButton("Start");
       JButton MainMenuButtonContinue = new JButton("Continue");
       JButton MainMenuButtonDimensions = new JButton("Dimensions");
       center.add(MainMenuButtonStart);
       center.add(MainMenuButtonContinue);
       center.add(MainMenuButtonDimensions);
       ActionDimensions actionDimensions = new ActionDimensions();
       MainMenuButtonDimensions.addActionListener(actionDimensions);
       add(center, BorderLayout.CENTER);

   }
}

第二窗口:

import javax.swing.*;
import java.awt.*;

public class Dimensions extends JFrame {
   public Dimensions(){
       setSize(600,500);
       JPanel north = new JPanel();
       JLabel labelnorth = new JLabel("Enter Dimensions! Rows and Columns");
       north.add(labelnorth);
       JPanel center = new JPanel();
       JPanel south = new JPanel();
       JButton buttonsouth = new JButton("Return to Main Menu");
       south.add(buttonsouth);
       center.setLayout(new GridLayout(1,2));
       TextField rowtextfield = new TextField();
       TextField columntextfield = new TextField();
       center.add(rowtextfield);
       center.add(columntextfield);
       add(north,BorderLayout.NORTH);
       add(center,BorderLayout.CENTER);
       add(south,BorderLayout.SOUTH);

主要功能:

public class Main {
   public static void main(String[] args) {
       MainMenu mainMenu = new MainMenu();
       Dimensions dimensions = new Dimensions();
       dimensions.setVisible(false);
       mainMenu.setVisible(true);
       mainMenu.setDefaultCloseOperation(3);

   }
}

操作侦听器:

public class ActionDimensions implements ActionListener {
   @Override
   public void actionPerformed(ActionEvent e) {
   JFrame mainMenu = (JFrame) e.getSource();
   JFrame dimensions = (JFrame) e.getSource();
   mainMenu.setVisible(false);
   dimensions.setVisible(true);
   }
}

我认为问题在于我试图通过一个框架使用getsource()方法,但是如果我没有指定该方法,我就无法访问实例(mainmenu和dimensions)。如果是这种情况,还有什么其他方法可以将setVisible方法连接到ActionListener内的实例?

共有1个答案

米元凯
2023-03-14

这可能是您的问题:

JFrame mainMenu = (JFrame) e.getSource();
JFrame dimensions = (JFrame) e.getSource();

ActionEvent#getSource()方法返回触发动作的源代码,这里是一个JButton,您试图将从该方法返回的同一个JButton对象转换为两个不同的JFrame,这实际上没有多大意义,因为该方法同样不返回JFrame,其次,强制转换不会将一个对象转换为两个不同的对象。如果需要对JFrame的引用,请将其传递到需要的位置,例如,为ActionListener类提供一个接受JFrame参数的构造函数:

ActionDimensions actionDimensions = new ActionDimensions(this);

public class ActionDimensions implements ActionListener {
    private  MainMenu mainMenu;
    
    public ActionDimensions(MainMenu mainMenu) {
        this.mainMenu = mainMenu;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // JFrame mainMenu = (JFrame) e.getSource();
        // JFrame dimensions = (JFrame) e.getSource();
        mainMenu.setVisible(false);
        
        // create a new Dimensions JFrame here?
        Dimensions dimensions = new Dimensions();
        // .... other code
        
        dimensions.setVisible(true);
    }
}

或者,您可以通过调用SwingUtilities.getWindowAncestor(your JButton)来获取按钮所在的JFrame。

话虽如此,但要明白没有用户会喜欢有多个窗口指向他们,这就是交换JFrames所做的,还有更好的方法来干净地交换视图,比如使用CardLayout教程。请阅读使用多个JFrames,好/坏的做法?。

 类似资料:
  • 我正在尝试隐藏按钮div和显示一个隐藏的div后,一个表单按钮已经被点击,加上延迟提交/重定向。下面是我想出的办法,但似乎没有100%奏效。 null null 任何建议都非常感谢

  • 问题内容: 我的html文件中有两个div。我想隐藏第一个div并在html输入按钮事件上显示另一个div 。 这是我的代码, 但这不起作用。任何帮助将不胜感激。 谢谢。 问题答案: 1)在onclick内,您不必使用暗示的“ javascript:”。 2)您检查“显示:阻止”,我总是检查“显示:无”(因为显示也可以是“行内阻止”,等等。) 尝试这个:

  • 我一直在工作的swings框架,其中有一个卡片布局面板在大型机。 我总共有20个jpanels添加到我的卡片布局面板中,在这20个面板中,有3个面板是由一个按钮组成的,点击这个按钮会加载另一个JFrame。当我使用IDE运行这个GUI时,它工作得很好,但是,当我运行jar文件时,在三种情况中的两种情况下,当单击按钮时,它不显示帧。 这是我正在为ButtonListener使用的代码。这个按钮只在一

  • 问题内容: 众所周知,我是一名完全的Java新手。我已经尝试过对此进行研究(通过阅读StackOverflow上的其他文章,谷歌搜索,并问一个不太喜欢Java新手的朋友),但我不知道。答案可能是明确而容易的,但我对此视而不见。我正在尝试从其他框架中放置A。 我的应用程序应该按以下方式工作: 按下框架X时有一个按钮:产生框架Y 框架Y有一个按钮,当按下时:产生框架Z 按下框架Z时有一个按钮:在放置框

  • 很多人可能都知道,我是一个完全的Java新手。我已经尝试过对此进行研究(通过阅读StackOverflow上的其他帖子,在谷歌上搜索,并询问一位不太熟悉java的朋友),但我无法理解。答案可能很清楚也很简单,但我对此视而不见。我试图从不同的帧中处理JFrame。 我的应用程序应该按如下方式工作: 帧X有一个按钮,按下时:生成帧Y 帧Y有一个按钮,按下时:生成帧Z Frame Z有一个按钮,按下时:

  • 我在stack overflow上搜索了我的问题的类似答案,但都没有帮助我。 所以我的问题是: 我有一个名为的主JFrame,它上有一个JTable和一个JButton。单击该按钮后,将打开另一个JFrame(),我可以从中更新表。Update_Window JFrame有两个文本字段和一个按钮。 简单地说,我想从JFrame更新中的JTable。在TextFields中键入内容并使用按钮提交后,