Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java CardLayout JPanel显示,但不响应鼠标输入_Java_Swing_Layout Manager_Cardlayout - Fatal编程技术网

Java CardLayout JPanel显示,但不响应鼠标输入

Java CardLayout JPanel显示,但不响应鼠标输入,java,swing,layout-manager,cardlayout,Java,Swing,Layout Manager,Cardlayout,问题1:第一个JPanel将显示,但似乎没有到达ControlPanel类中的actionPerformed方法。我设想在我的实际项目中使用CardLayout在第一个面板和第二个面板之间进行转换,这将包含两个非常不同的游戏环境,每个面板中分别包含游戏逻辑 我希望能够让每个JPanel firstPanel和SecondPanel响应鼠标单击并更改为另一个面板。如果您需要任何其他信息,请告诉我。下面的所有代码都应该能够直接粘贴到EclipseLuna并进行编译。这就是我目前所拥有的 import

问题1:第一个JPanel将显示,但似乎没有到达ControlPanel类中的actionPerformed方法。我设想在我的实际项目中使用CardLayout在第一个面板和第二个面板之间进行转换,这将包含两个非常不同的游戏环境,每个面板中分别包含游戏逻辑

我希望能够让每个JPanel firstPanel和SecondPanel响应鼠标单击并更改为另一个面板。如果您需要任何其他信息,请告诉我。下面的所有代码都应该能够直接粘贴到EclipseLuna并进行编译。这就是我目前所拥有的

import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;


public class CardLayoutMCVE 
{
    Panel1 firstPanel = new Panel1();
    Panel2 secondPanel = new Panel2();
    ControlPanel controlPanel = new ControlPanel();
    CardLayout card = new CardLayout();
    String State, panel1 = "1", panel2 = "2";

    public CardLayoutMCVE()
    {

        firstPanel.setBackground(Color.BLACK);
        secondPanel.setBackground(Color.CYAN);
        JFrame frame = new JFrame("CardLayout MCVE");
        frame.setSize(1000, 1000);
        frame.setVisible(true);
        frame.setContentPane(controlPanel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        controlPanel.setLayout(card);

    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run()
            {
                new CardLayoutMCVE();
            }
        });
    }

    private class ControlPanel extends JPanel implements ActionListener
    {
        public ControlPanel()
        {
            this.setLayout(card);
            /*Which ever is added first is drawn first, regardless of the
             * actionPerformed method.*/
            this.add("Panel1", firstPanel);
            this.add("Panel2", secondPanel);
            Timer timer = new Timer(14, this);
            timer.start();
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            if(State == panel1)
            {
                card.show(controlPanel, "Panel1");
            }

            if(State == panel2)
            {
                card.show(controlPanel, "Panel2");
            }
        }

    }

    private class Panel1 extends JPanel implements ActionListener, MouseListener
    {
        /*Because there is no image the rectangle is set to cover the entire
         * screen, so window should change to Cyan on mouse click*/
        Rectangle rec1 = new Rectangle(0, 0, 1000 , 1000);

        public Panel1()
        {
            this.addMouseListener(this);

        }

        @Override
        public void actionPerformed(ActionEvent arg0) {
            // TODO Auto-generated method stub

        }
        @Override
        public void mouseClicked(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseEntered(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseExited(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mousePressed(MouseEvent e) {
            // TODO Auto-generated method stub
            Point p = e.getPoint();
            if(rec1.contains(p));
            {
                State = panel2;
            }
        }

        @Override
        public void mouseReleased(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }}

    private class Panel2 extends JPanel implements ActionListener, MouseListener
    {
        Rectangle rec1 = new Rectangle(0, 0, 1000 , 1000);

        public Panel2()
        {
            this.addMouseListener(this);
            Timer timer = new Timer(14, this);
            timer.start();
        }

        @Override
        public void actionPerformed(ActionEvent arg0) {
            // TODO Auto-generated method stub

        }
        @Override
        public void mouseClicked(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseEntered(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseExited(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mousePressed(MouseEvent e) {
            // TODO Auto-generated method stub
            Point p = e.getPoint();
            if(rec1.contains(p));
            {
                State = panel1;
            }
        }

        @Override
        public void mouseReleased(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }}
}

感谢安德鲁·汤普森的帮助编辑

MVCE Java CardLayout JPanel不显示?MCVE需要是一个源文件,以便在编译和发现问题之前可以是单个副本/粘贴。单个源文件可能包含多个类,但只有一个类可以是公共的。运行时问题的MCVE还需要一个主字符串[]来运行它!谢谢你的纠正,我肯定不符合这些要求。加上一个实际的、经过测试的MCVE比道歉要好得多;一般来说,设计问题应该转到setBounds1000、1000、1000、1000;要求屏幕至少为2000x2000。用背包代替。