- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一款游戏,玩家试图在迷宫中导航,但我遇到了两个绝对难倒我的错误。我的第一个问题是使用setContentPane()
。每当我将其设置为我想要的背景时,它都会覆盖屏幕上的其他所有内容。我尝试过将它重新安置到我认为可能的每个地方,但它仍然掩盖了它。我的第二个问题是关于我的 JButton
。每当我单击它时,它都会按预期更改播放速度,但之后我无法移动。当我在 Keylistener 中使用该方法时,它会起作用,并且它们内部具有相同的代码。我已经包含了我认为必要的所有代码,但如果您需要更多代码,请告诉我。该项目的完整源代码可以在 Here 找到。 .
package game;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Random;
public class Game extends JPanel implements ActionListener, KeyListener {
private boolean upPressed = false;
private boolean downPressed = false;
private boolean rightPressed = false;
private boolean leftPressed = false;
private int tileSize = 200;
private int playerSize = tileSize / 4;
private int playerSpeed = playerSize / 10;
private int mazeX = 51;
private int mazeY = 51;
private int[][] maze = new int[mazeX][mazeY];
private int[][] initX = new int[mazeX][mazeY];
private int[][] initY = new int[mazeX][mazeY];
private boolean[][] visited = new boolean[mazeX][mazeY];
private int currentCellX = 0;
private int currentCellY = 0;
private int deltaX = 0;
private int deltaY = 0;
JComponent background = new JLabel(new ImageIcon(Main.class.getResource("/assets/ui/mainMenu.png")));
JButton adventure = new JButton();
JButton freePlay = new JButton();
JButton exit = new JButton();
JButton pause = new JButton();
JButton resume = new JButton();
private String screen = "menu";
public Main main;
public Game(Main main) {
this.main = main;
setFocusable(true);
addKeyListener(this);
addButtons();
setUpInitialCoordinates();
Timer timer = new Timer(1000 / 120, this);
timer.start();
}
private void tick() {
switch (screen) {
case "playing" :
background.setVisible(false);
if (upPressed) {
deltaY += playerSpeed;
} else if (downPressed) {
deltaY -= playerSpeed;
}
if (rightPressed) {
deltaX -= playerSpeed;
} else if (leftPressed) {
deltaX += playerSpeed;
}
break;
case "paused":
background.setVisible(false);
adventure.setVisible(false);
freePlay.setVisible(false);
pause.setVisible(false);
exit.setVisible(true);
break;
case "menu":
main.setContentPane(new JLabel(new ImageIcon(Main.class.getResource("/assets/ui/mainMenu.png"))));
adventure.setVisible(true);
freePlay.setVisible(true);
pause.setVisible(false);
exit.setVisible(true);
break;
}
repaint();
}
private void addButtons() {
setLayout(null);
add(freePlay);
freePlay.setBounds(10, 100, 180, 80);
freePlay.setSize(180, 80);
freePlay.setAction(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent ae) {
downPressed = false;
rightPressed = false;
leftPressed = false;
generateMaze();
screen = "playing";
}
});
freePlay.setIcon(new ImageIcon(Main.class.getResource("/assets/ui/buttons/freePlayUnselected.png")));
freePlay.setRolloverIcon(new ImageIcon(Main.class.getResource("/assets/ui/buttons/freePlaySelected.png")));
}
private void setUpInitialCoordinates() {
}
private void generateMaze() {
}
private boolean checkForUnvisitedCells() {
}
private boolean checkForUnvisitedAdjacentCells() {
}
@Override
public void actionPerformed(ActionEvent e) {
tick();
}
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void paintComponent(Graphics g) {
}
}
最佳答案
setContentPane
就是这样做的,它用新组件替换了以前用作内容的内容。
仔细看看How to Use Root Panes了解更多详情。
我建议更好的解决方案是使用 CardLayout
,但在这种情况下,更好的解决方案是仅更改 icon
属性当前内容 Pane ...
background.setIcon(new ImageIcon(Main.class.getResource("/assets/ui/mainMenu.png")));
然后简单地将背景
设置为框架的内容 Pane ...
JLabel background = new JLabel(new ImageIcon(Main.class.getResource("/assets/ui/mainMenu.png")));
//....
public Game(Main main) {
this.main = main;
setContentPane(background);
//...
那就永远不要更改内容 Pane ...
然后,您可以使用 CardLayout
更改内容 Pane 上显示的内容
My second question is about my JButton. Whenever I click it, it changes to the playing speed as intended, but I can't move afterwards. It works when I use the method in my Keylistener
欢迎来到为什么不应该使用 KeyListener
的奇妙世界,按钮已经窃取了键盘焦点,并且 KeyListener
将不再响应键盘输入,因为它依赖于它注册为可聚焦和聚焦的组件。请改用键绑定(bind)。 How to Use Key Bindings
关于java - setContentPane 覆盖了所有内容并且 JButton 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29811630/
此代码连接到 mysql 并在 JFrame 中显示表。首先,我尝试了 frame.add(table) 但它不起作用,但是 frame.setcontentpane(table )这段代码运行正常,
因此,我将进入 Java 中的 GUI,并尝试为计时器创建一个简单的主菜单。一切都很好,直到我尝试为 GUI 添加背景。添加背景有效,但是所有其他组件现在都消失了(按钮)。我该如何解决这个问题? 编辑
我正在工作中处理一个测试示例,我需要使用绝对布局。这就是老板想要的。我在网上找到了一个简单的示例,可以正常工作,我可以将自定义组件放在上面,框架显示得很好。 但是当我尝试在已经存在的表单上执行此操作时
此代码输出一个框架,其中在图像上放置了一个按钮。如果我将语句从 fr.setContentPane( new JPanel... 更改为 fr.add(new JPanel...),我只会看到大小为
我正在制作一款游戏,玩家试图在迷宫中导航,但我遇到了两个绝对难倒我的错误。我的第一个问题是使用setContentPane()。每当我将其设置为我想要的背景时,它都会覆盖屏幕上的其他所有内容。我尝试过
我的小程序有问题:它没有在我需要时刷新。 我试图在单击按钮时从一个界面屏幕切换到另一个界面屏幕。 我有一个 public class PixelRainEditorApp extends JApple
我正在学习 Java 中的 GUI 编程,并尝试修改现有程序以将包含按钮的垂直左侧面板添加到我的主框架。 主要方法如下。目前,MainPanel 类扩展 JPanel 并包含程序的主要组件(基本游戏)
这个问题我想了很久。 我通常通过使用 JFrame 和 JPanel 来构建我的 SWING 程序,该 JPanel 包含由 setContentPane() 设置为内容 Pane 的窗口内容.当我希
我找到了三种方法来填充我的 JFrame frame = new JFrame("...")createContentPanel 返回一个 JPanel,createToolBar 返回一个 Tool
import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; publi
如果这有助于解决问题,我可以提供所有代码,但我相信,由于这实际上只影响一个类,因此可以在这里解决它,以简化问题。 我有一个 Solitaire 项目(注意包/类名称,这是反复试验,我没有删除旧项目),
这是我的代码。当我 setContentPane(panel) 时,它可以工作,但是当我 getContentPane().add(panel) 时,它不起作用。 为什么第二种方法不起作用? (它没有
经过实验,在我看来,Swing 的 GroupLayout 往往会丢失打算在我的 GUI 中重复使用的组件。 但我没有在文档中看到任何明确说明此一次性使用规则的内容。这让我想知道我是否犯了错误,或者我
我是一名优秀的程序员,十分优秀!