我試圖在單擊按鈕時“打開”一個不同的 JFrame 視窗(在本例中為尺寸按鈕),就像瀏覽選單時一樣。我有我的 2 個視窗,主函式和 ActionListener 作為單獨的類。當我單擊應該將我重定向到另一個視窗的按鈕時,它只會顯示一個錯誤,并且不會隱藏第一個視窗并顯示第二個視窗。錯誤是:
“執行緒“AWT-EventQueue-0”中的例外 java.lang.ClassCastException:無法將類 javax.swing.JButton 強制轉換為類 javax.swing.JFrame(javax.swing.JButton 和 javax.swing.JFrame 在模塊 java 中。在 java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1972) 在 java.desktop/javax.swing.AbstractButton$Handler 的 ActionDimensions.actionPerformed(ActionDimensions.java:8) 的加載程式“引導程式”桌面。 actionPerformed(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.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3389) 在 java.desktop/java.awt.Component.processEvent(Component.java:6391) 在 java.desktop/java.awt.Container .processEvent(Container.java:2266) 在 java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5001) 在 java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2324) 在 java.桌面/java.awt.Component.dispatchEvent(Component.java:4833) 在 java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4948) 在 java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container. java:4575) 在 java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4516) 在 java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2310) 在 java.desktop/java.awt .Window.dispatchEventImpl(Window.java:2780) 在 java.desktop/java。awt.Component.dispatchEvent(Component.java:4833) at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722 ) 在 java.base/java.security.AccessController.doPrivileged(AccessController.java:399) 在 java.base/java.security.ProtectionDomain 的 java.desktop/java.awt.EventQueue$4.run(EventQueue.java:716) $JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97) at java.desktop/java.awt.EventQueue$5.run(EventQueue.java: 746) 在 java.base/java.security.AccessController.doPrivileged(AccessController.java:399) 在 java.base/java.security 的 java.desktop/java.awt.EventQueue$5.run(EventQueue.java:744)。保護域$JavaSecurityAccessImpl。doIntersectionPrivilege(ProtectionDomain.java:86) 在 java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:743) 在 java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) 在 java.desktop /java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) 在 java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) 在 java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java :109) 在 java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 在 java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90) "pumpOneEventForFilters(EventDispatchThread.java:203) 在 java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) 在 java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) 在 java.desktop /java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) 在 java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 在 java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java :90)“pumpOneEventForFilters(EventDispatchThread.java:203) 在 java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) 在 java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) 在 java.desktop /java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) 在 java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 在 java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java :90)“在 java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 上的 pumpEvents(EventDispatchThread.java:101)"在 java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 上的 pumpEvents(EventDispatchThread.java:101)"
第一個視窗:
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() 方法,但是如果我不指定該方法,我將無法訪問實體(主選單和維度)。如果是這種情況,我可以通過什么其他方式將 setVisible 方法連接到 ActionListener 中的實體?
uj5u.com熱心網友回復:
這可能是您的問題:
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);
}
}
或者,您可以通過呼叫來獲取按鈕所在的 JFrame SwingUtilities.getWindowAncestor(yourJButton)。
話雖如此,請理解沒有用戶會喜歡將多個視窗推向它們,這就是交換 JFrames 所做的,并且有更好的干凈交換視圖的方法,例如CardLayout 教程。請閱讀多個 JFrame 的使用,好/壞做法?.
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/416541.html
標籤:
上一篇:如何擺脫函式中的重復代碼?
