gpt4 book ai didi

java - Java 中的 CardLayout 通过 'cards' 之一中的操作更改

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:59:05 27 4
gpt4 key购买 nike

我正在使用 JFrame 制作一个简单的游戏。我制作了一个简单的“开始”屏幕,它基本上由一个 String 和一个 JButton 组成。我正在使用 actionPerformed(ActionEvent e) 方法获取按钮点击。我不知道如何使用单击按钮更改卡片。这似乎是一个解决起来很简单的问题,但问题也随之而来:我的主要 JFrame、我的 StartScreen 和我的游戏发生位置 JPanel 都在单独的文件中。我的主文件 Virus.java 是我创建 JFrame 的地方。我的文件 VirusGamePanel.java 是游戏发生的地方。我的文件 StartScreen.java 是带有按钮的屏幕。我想在玩家单击按钮时将“卡片”更改为游戏屏幕。我怎样才能做到这一点?我的 StartScreen.java 文件:

package virus;

import javax.swing.JPanel;
import java.awt.event.ActionListener;
import java.awt.Graphics;
import java.awt.Font;
import java.awt.Color;
import javax.swing.JButton;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.CardLayout;




public class StartScreen extends JPanel implements ActionListener{
private static final long serialVersionUID = 1L;
JButton start = new JButton("Start");
public StartScreen(){
start.addActionListener(this);
start.setBounds(new Rectangle(400,300,100,30));
this.add(start);
}
public void paint(Graphics g){
super.paint(g);
g.setFont(new Font("Impact",Font.BOLD,72));
g.setColor(Color.MAGENTA);
g.drawString("Virus",275,300);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==start)
{
//what to do here?
}
}
}

我的 Virus.java 文件:

package virus;

import javax.swing.*;
import java.awt.CardLayout;
import virus.StartScreen;

public class Virus extends JFrame{
private static final long serialVersionUID =1L;
JFrame jf = new JFrame("Virus");
static JPanel thegame = new JPanel(new CardLayout());
JPanel game = new VirusGamePanel();
JPanel start = new StartScreen();

public Virus(){
jf.setResizable(false);
jf.setSize(600,600);
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(EXIT_ON_CLOSE);
jf.setVisible(true);
jf.add(thegame);
thegame.add(start);
thegame.add(game);

}

public static void main(String[] args) {
new Virus();

}

}

最佳答案

您只需在您的actionPerformed(...) 方法中纠正这一点:

public void actionPerformed(ActionEvent e)
{
if(e.getSource()==start)
{
//what to do here?
CardLayout cardLayout = (CardLayout) Virus.thegame.getLayout();
cardLayout.next(Virus.thegame);
}
}

正如@kleopatra (THE EMPRESS) 自己非常指出的那样,不要覆盖 paint() 而是在 paintComponent(Graphics g) 方法中进行绘制任何 JPanel/JComponent。此外,首先将组件添加到您的JFrame,一旦实现其大小,然后仅将其设置为Visible,而不是在此之前。不是为 JFrame 设置大小,而是简单地覆盖 JPanel 的方法 getPreferredSize(),让它返回一些有效的 Dimension 对象。

请在下次编写代码时观看此序列:

public Virus(){
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setResizable(false);
thegame.add(start);
thegame.add(game);
jf.add(thegame);
jf.pack();
jf.setLocationRelativeTo(null);
jf.setVisible(true);
}

这是你的完整代码:

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.event.ActionListener;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Font;
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JLabel;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.CardLayout;

public class Virus extends JFrame{
private static final long serialVersionUID =1L;
JFrame jf = new JFrame("Virus");
static JPanel thegame = new JPanel(new CardLayout());
JPanel game = new VirusGamePanel();
JPanel start = new StartScreen();

public Virus(){
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setResizable(false);
thegame.add(start);
thegame.add(game);
jf.add(thegame);
jf.pack();
jf.setLocationRelativeTo(null);
jf.setVisible(true);
}

public static void main(String[] args) {
new Virus();

}

}

class StartScreen extends JPanel implements ActionListener{
private static final long serialVersionUID = 1L;
JButton start = new JButton("Start");
public StartScreen(){
start.addActionListener(this);
start.setBounds(new Rectangle(400,300,100,30));
this.add(start);
}

@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.setFont(new Font("Impact",Font.BOLD,72));
g.setColor(Color.MAGENTA);
g.drawString("Virus",275,300);
}

@Override
public Dimension getPreferredSize()
{
return (new Dimension(600, 600));
}

public void actionPerformed(ActionEvent e)
{
if(e.getSource()==start)
{
//what to do here?
CardLayout cardLayout = (CardLayout) Virus.thegame.getLayout();
cardLayout.next(Virus.thegame);
}
}
}

class VirusGamePanel extends JPanel
{
public VirusGamePanel()
{
JLabel label = new JLabel("I am ON", JLabel.CENTER);
add(label);
}

@Override
public Dimension getPreferredSize()
{
return (new Dimension(600, 600));
}
}

关于java - Java 中的 CardLayout 通过 'cards' 之一中的操作更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12058439/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com