Java 如何处理cardlayout?

Java 如何处理cardlayout?,java,jpanel,processing,cardlayout,Java,Jpanel,Processing,Cardlayout,我想做一个必须切换屏幕的游戏。我在JPanel上设置了Jbuttons,当您单击一个按钮时,它会切换面板。但是,我只使用常规图形进行了此操作。 下面是一个处理的例子,但我不太明白发生了什么: import javax.swing.*; import processing.awt.PSurfaceAWT; import java.awt.*; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListene

我想做一个必须切换屏幕的游戏。我在JPanel上设置了Jbuttons,当您单击一个按钮时,它会切换面板。但是,我只使用常规图形进行了此操作。 下面是一个处理的例子,但我不太明白发生了什么:

import javax.swing.*;

import processing.awt.PSurfaceAWT;

import java.awt.*;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;

public class Main {

private JFrame window;

private JPanel cardPanel;

private OptionPanel panel1;    
private DrawingSurface panel2;

private PSurfaceAWT.SmoothCanvas processingCanvas;

public Main() {
    panel2 = new DrawingSurface();
    panel2.runMe();

    PSurfaceAWT surf = (PSurfaceAWT) panel2.getSurface();
    processingCanvas = (PSurfaceAWT.SmoothCanvas) surf.getNative();
    window = (JFrame)processingCanvas.getFrame();

    window.setBounds(0,0,800, 600);
    window.setMinimumSize(new Dimension(100,100));
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setResizable(true);

    cardPanel = new JPanel();
    CardLayout cl = new CardLayout();
    cardPanel.setLayout(cl);

    window.getContentPane().removeAll();

    panel1 = new OptionPanel(this);    
    panel2 = new DrawingSurface();

    cardPanel.add(panel1,"1");
    cardPanel.add(processingCanvas,"2");

    window.setLayout(new BorderLayout());

    window.add(cardPanel);
    window.revalidate();
}


public static void main(String[] args)
{
    Main m = new Main();
}

public void changePanel() {
    ((CardLayout)cardPanel.getLayout()).next(cardPanel);
    processingCanvas.requestFocus();
}

}
选项面板如下所示(主屏幕位于上方):


此示例有一个绘图曲面,在该曲面上绘制mario并在某些矩形上跳跃。我只想知道如何连接不同的面板,并能够在每个面板上绘制一个图形。

您通常不应该像这样混合使用Swing和处理

具体来说,您可以在Swing中嵌入处理,但不应该尝试在处理中嵌入Swing。处理有自己的渲染线程和事件队列,这使得在处理中使用Swing非常困难

即使是在Swing中嵌入处理在Processing 3中也变得复杂得多,所以如果可能的话也应该避免

所以说实话,如果我是你,我会尝试重新思考我的方法。你能用两扇单独的窗户来做这件事吗?可能是一个显示按钮的Swing JFrame,然后是一个显示草图的单独处理窗口?也许你可以隐藏一个同时展示另一个

如果确实需要混合Swing和处理,那么需要将处理草图放在Swing窗口中,而不是尝试将Swing组件放在处理窗口中。从技术上讲,处理窗口是一个JFrame,但您可能不应该像那样处理它。相反,获取
processingCanvas
并将其添加到您自己的JFrame中

public class OptionPanel extends JPanel implements ActionListener {

Main w;

public OptionPanel(Main w) {
    this.w = w;
    JButton button = new JButton("Press me!");
    button.addActionListener(this);
    add(button);
}

public void actionPerformed(ActionEvent e) {
    w.changePanel();
}

}