gpt4 book ai didi

java - 无法在 ActionListener 中重新绘制

转载 作者:行者123 更新时间:2023-11-29 03:36:19 24 4
gpt4 key购买 nike

编辑:现在它工作正常,但是当我切换到“游戏”JPanel 时,KeyListener 不工作:(有什么办法可以解决这个问题吗?

我正在编写一个 java 游戏,repaint() 方法有问题:我想从菜单进入游戏,所以我删除了菜单面板并添加了游戏面板(“Zeichnen”扩展了 JPanel)但是每次我尝试重新绘制时,eclipse 都会给我以下错误:“方法 repaint() 未定义对于 new ActionListener(){} 类型,有人可以帮我吗? :(

代码:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Frame {

JFrame frame;
JPanel menu;
JButton start;
Zeichnen game;

public Frame() {

start = new JButton("Start Game");
menu = new JPanel();
game = new Zeichnen();
frame = new JFrame("Epic Game");

start.addActionListener(new ActionListener () {
public void actionPerformed(ActionEvent e) {

frame.remove(menu);
frame.add(game);
repaint();

}});

frame.setVisible(true);
frame.setSize(640,480);
game.addKeyListener(new Listener(game));
menu.add(start);
frame.add(menu);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);

}
}

最佳答案

建议:

  • 您应该使用 CardLayout 来让容器交换组件,因为这是更改 View 的最简单和最可靠的方法。在本网站的先前问题中有许多使用此方法的示例。
  • 不要使用 KeyListener,而是使用 Key Bindings,因为它们在组件焦点方面更加宽容。
  • 将您的“框架”类重命名为与核心 Java 类不匹配的名称。这是一个非常困惑的名字。

例如:

import java.awt.event.*;
import java.awt.*;

import javax.swing.*;

public class ContentPane extends JPanel {

public static final String MENU = "menu";
public static final String GAME = "game";
private static final int PREF_W = 640;
private static final int PREF_H = 480;

private CardLayout cardlayout = new CardLayout();
private JPanel menu = new JPanel();
private JButton start;
private Zeichnen game;

public ContentPane() {
setLayout(cardlayout);
start = new JButton("Start Game");
game = new Zeichnen();

add(menu, MENU);
add(game, GAME);

start.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
cardlayout.next(ContentPane.this);
}
});

menu.add(start);
}

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

private static void createAndShowGui() {
JFrame frame = new JFrame("Epic Game");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new ContentPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

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

和键绑定(bind):

@SuppressWarnings("serial")
class Zeichnen extends JPanel {
private static final String DOWN = "down";

public Zeichnen() {
int condition = WHEN_IN_FOCUSED_WINDOW;
InputMap inputMap = getInputMap(condition);
ActionMap actionMap = getActionMap();

inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), DOWN);
actionMap.put(DOWN, new AbstractAction(DOWN) {
{
putValue(ACTION_COMMAND_KEY, DOWN);
}

@Override
public void actionPerformed(ActionEvent evt) {
System.out.println(evt.getActionCommand());
}
});
}
}

关于java - 无法在 ActionListener 中重新绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15348953/

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