gpt4 book ai didi

java - 如何从多个外部类中调用 JPanel?

转载 作者:行者123 更新时间:2023-12-02 01:43:44 25 4
gpt4 key购买 nike

我目前正在制作一款带有主菜单和您实际玩的世界的游戏。

我有一个名为Game的类,它继承自JPanel并实现了RunnableMouseListenerKeyListener和 ActionListener 接口(interface)(仅包含重要部分)

我还有两个类 InWorldHandlerOutWorldHandler 分别用于处理世界内部和外部的机制。

Game 类:

public class Game extends JPanel implements Runnable, KeyListener, MouseListener, ActionListener
{
protected JFrame frame;
private Timer timer = new Timer(25, this);

private World world;
private Player player = new Player();

private boolean draw;

Game(World world)
{
frame = new JFrame("Minecraft 2D");
this.world = world;
player.enterWorld(world, this);
}

@Override
protected void paintComponent(Graphics g)
{
Graphics2D g2d = (Graphics2D)g;

if(draw)
{
g2d.setColor(new Color(255, 255, 255));
g2d.fillRect(0, 0, frame.getWidth(), frame.getHeight());

draw = false;
//Here, the in-game mechanics should be handled
if(player.inWorld())
{
Chunk chunk = player.getLoadedChunk();
for(int x = 0; x < 16; x++)
{
for(int y = 0; y < 16; y++)
{
Block block = chunk.getBlockAt(x, y);
BufferedImage texture = block.getTexture();

g2d.drawImage(block.getTexture(), x*32, y*32, texture.getWidth()*2, texture.getHeight()*2, null);
}
}
}
//Here, the out-game mechanics should be handled
else
{

}
}
}

@Override
public void actionPerformed(ActionEvent e)
{
this.repaint();
draw = true;
}

@Override
public void run()
{
draw = true;

frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(this);
frame.setMinimumSize(new Dimension(518, 540));
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.addKeyListener(this);
frame.addMouseListener(this);
frame.setFocusable(true);
frame.setVisible(true);
frame.pack();
timer.start();
}
}

其他类目前都有空的 body 。我只是不知道该怎么做。

我希望当玩家在游戏中时,InWorldHandler类在面板上绘制,当玩家在主菜单中时,我希望OutWorldHandler类在面板上绘制,两者都在Game 类。我该怎么做?

最佳答案

与其使用单个 JPanel,为什么不尝试使用 CardLayout并根据确定您所在程序位置的标志切换显示InnerWorld还是OuterWorld

当您实现KeyListener时,我认为您可以移动角色,请查看此问题上已接受的答案:Keylistener not working for JPanel并使用 KeyBindings 代替。

同时避免使用 setMimimum/Maximum/PreferredSize() 并重写这些方法:Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

以这段代码为例:

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;

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

public class Game {
private JFrame frame;
private JButton button;
private boolean status;
private JPanel[] cards;
private CardLayout cl;
private JPanel gamePane;

public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new Game().createAndShowGUI());
}

private void createAndShowGUI() {
frame = new JFrame(getClass().getSimpleName());
button = new JButton("Switch Worlds");
status = true; //True = Inner / False = Outer

cl = new CardLayout();

gamePane = new JPanel(cl);
cards = new JPanel[2];

cards[0] = new InnerWorld();
cards[1] = new OuterWorld();

gamePane.add(cards[0], "innerWorld");
gamePane.add(cards[1], "outerWorld");

button.addActionListener(e -> {
status = !status;
if (status) {
cl.show(gamePane, "innerWorld");
} else {
cl.show(gamePane, "outerWorld");
}
});

frame.add(gamePane);
frame.add(button, BorderLayout.SOUTH);

frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

@SuppressWarnings("serial")
class InnerWorld extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);

Graphics2D g2d = (Graphics2D) g;

g2d.drawString("Inner World", 50, 50);
}

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

@SuppressWarnings("serial")
class OuterWorld extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);

Graphics2D g2d = (Graphics2D) g;

g2d.drawString("Outer World", 50, 50);
}

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

enter image description here enter image description here

关于java - 如何从多个外部类中调用 JPanel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54042979/

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