【发布时间】:2017-02-17 02:57:19
【问题描述】:
我正在尝试创建一个在面板之间移动的程序,并且在每个面板中用户回答一个问题。我目前正在尝试使用 next() 来换卡,但它给了我一个 IllegalArgumentException 问题。
我已将我的代码简化为我的问题的基础,以便让问题不再需要的代码。 我的主要课程是箭头,我的第二个课程是 Flash,因为我希望每个面板都有自己的物理文件。我试图在 Flash 中调用相同的 next() 函数并获得相同的效果,即使技术上没有第三个面板。
这里是箭头(主)
package layout;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Arrow{
public JPanel panelHouse;
public JFrame frame = new JFrame();
public int total = 3000;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Arrow window = new Arrow();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
} } }); } //putting all the closing brackets on one line saves space. This is test code so it doesn't matter to me
public Arrow() {
initialize();
}
public Arrow(int x){
//this is here so I don't run initialize when I need to create an Arrow variable in other classes
//it doesn't actually do anything
}
private void initialize() {
CardLayout cl = new CardLayout(0, 0);
frame.setBounds(400, 400, 909, 572);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(cl);
JPanel panelHouse = new JPanel();
panelHouse.setBounds(0, 0, 10, 10);
frame.getContentPane().add(panelHouse, "Housing");
panelHouse.setLayout(null);
Flash Flash1 = new Flash();
frame.getContentPane().add(Flash1, "Flash");
Flash1.setLayout(null);
JButton btnHouseNext = new JButton("NEXT STATION");
btnHouseNext.setFont(new Font("Times New Roman", Font.PLAIN, 20));
btnHouseNext.setBounds(344, 371, 184, 48);
btnHouseNext.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
cl.next(frame);
}
});//Close housingNext button actionlistener
panelHouse.add(btnHouseNext);
}//close initialize
public JPanel getPanelHouse() {
return panelHouse;
}
public JFrame getFrame(){
return frame;
}
}//close class body
这是 Flash(第二个面板)
package layout;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Flash extends JPanel{
private CardLayout cardLayout = new CardLayout();
private static final long serialVersionUID = 1L;
public Flash() {
Arrow a = new Arrow(4);
JPanel Flash1 = new JPanel();
setBounds(0, 0, 10, 10);
setLayout(null);
setBackground(Color.orange);
JButton buttonFlash = new JButton("NEXT STATION");
buttonFlash.setFont(new Font("Times New Roman", Font.PLAIN, 20));
buttonFlash.setBounds(344, 371, 184, 48);
buttonFlash.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
Flash1.setVisible(false);
cardLayout.next(a.getFrame());
}
});
add(buttonFlash);
setVisible(true);
}
}
这是我的错误堆栈跟踪
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: wrong parent for CardLayout
at java.awt.CardLayout.checkLayout(Unknown Source)
at java.awt.CardLayout.next(Unknown Source)
at layout.Arrow$2.actionPerformed(Arrow.java:48)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
现在我还看到了容器是 JPanel 而不是像我一样的 JFrame 的代码。我是否做错了,应该改变我的吗?
编辑:我更改了代码以反映建议
【问题讨论】:
-
Flash类中的CardLayout与父容器或它使用的布局没有关系,我什至认为它没有责任决定接下来应该发生的事情,它应该将其传达给父母,最好是通过某种interface
标签: java swing layout-manager illegalargumentexception cardlayout