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