如何在 Java 中移动 JFrame 上的 JPanel?
How can I move a JPanel on a JFrame in Java?
所以我想用 java 从头开始制作一个简单的类似乒乓球的游戏。
我目前正在移动两个桨。
但是,我一开始就陷入困境。
我正在尝试设置 2 个桨的起始位置,但我不能。
我试图通过设置自定义布局,但后来我当然想通过移动它们来不断改变它们的位置。
我有以下代码:
package com.kristof;
import javax.swing.*;
import java.awt.*;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame("gEngine");
Player playerOne = new Player();
Player playerTwo = new Player();
frame.add(playerOne.getMyPanel());
frame.add(playerTwo.getMyPanel());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBackground(Color.RED);
frame.setSize(1280, 720);
frame.setResizable(false);
frame.setVisible(true);
}
public static class Player {
private JPanel myPanel;
public Player() {
this.myPanel = new MyPanel();
}
public JPanel getMyPanel() {
return myPanel;
}
}
static class MyPanel extends JPanel {
public MyPanel() {
setBackground(Color.BLACK);
}
@Override
public void paintComponent(Graphics g) {
// let the component be painted "natural"
super.paintComponent(g);
// Do custom painting
g.setColor(Color.WHITE);
g.fillRect(50, getHeight() / 2, 20, 120);
}
}
}
我已经尝试通过在他们的 myPanel
上调用 setLocation
方法来改变他们的位置,但这没有用。
所以您创建了一个玩家 class,但是您在 class 中没有玩家的位置。
由于桨只会上下移动,我们只需要改变 y 坐标的方法。
static class Player{
int x;
int y;
Player(int x){this.x=x;}
void moveUp(){y--;}
void moveDown(){y++;}
void drawPlayer(Graphics2D g){
g.fillRect(x,y,40,120);
}
}
现在,在扩展 JPanel 的 class 中(在您的情况下 MyPanel
),我们可以将新创建的 Player
class 作为输入(通过将其放入构造函数)
我们还可以创建一个计时器,以便定期刷新帧。
通过在时钟中添加players[0].moveDown;
,第一个桨将每帧向下移动
在paint方法中我们可以遍历玩家并使用Player
class中的drawPlayer
方法显示他们。
MyPanel(Player[] players) {
this.players = players;
setBackground(Color.BLACK);
new Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
repaint();
players[0].moveDown;
}
}, 300, 1000 / 60);
}
@Override
public void paint(Graphics g) {
super.paintComponent(g);
g.setColor(Color.WHITE);
for(Player p : players){
p.drawPlayer((Graphics2D) g);
}
}
现在把它们放在一起,我们只需要在启动程序时创建播放器。
Player[] players = new Player[]{
new Player(100),
new Player(1000)
};
frame.add(new PongWindow(players));
代码整体如下:
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Timer;
import java.util.TimerTask;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame("gEngine");
Player[] players = new Player[]{
new Player(100),
new Player(1000)
};
frame.add(new PongWindow(players));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBackground(Color.RED);
frame.setSize(1280, 720);
frame.setResizable(false);
frame.setVisible(true);
}
static class Player{
int x;
int y;
Player(int x){this.x=x;}
void moveUp(){y+= -8;}
void moveDown(){y+= 8;}
void drawPlayer(Graphics2D g){
g.fillRect(x,y,40,120);
}
}
static class PongWindow extends JPanel {
//private JPanel panel = new JPanel();
Player[] players;
PongWindow(Player[] players) {
this.players = players;
setBackground(Color.BLACK);
new Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
repaint();
players[0].moveDown();
}
}, 300, 1000 / 60);
}
@Override
public void paint(Graphics g) {
super.paintComponent(g);
g.setColor(Color.WHITE);
for(Player p : players){
p.drawPlayer((Graphics2D) g);
}
}
}
}
所以我想用 java 从头开始制作一个简单的类似乒乓球的游戏。 我目前正在移动两个桨。 但是,我一开始就陷入困境。 我正在尝试设置 2 个桨的起始位置,但我不能。 我试图通过设置自定义布局,但后来我当然想通过移动它们来不断改变它们的位置。
我有以下代码:
package com.kristof;
import javax.swing.*;
import java.awt.*;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame("gEngine");
Player playerOne = new Player();
Player playerTwo = new Player();
frame.add(playerOne.getMyPanel());
frame.add(playerTwo.getMyPanel());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBackground(Color.RED);
frame.setSize(1280, 720);
frame.setResizable(false);
frame.setVisible(true);
}
public static class Player {
private JPanel myPanel;
public Player() {
this.myPanel = new MyPanel();
}
public JPanel getMyPanel() {
return myPanel;
}
}
static class MyPanel extends JPanel {
public MyPanel() {
setBackground(Color.BLACK);
}
@Override
public void paintComponent(Graphics g) {
// let the component be painted "natural"
super.paintComponent(g);
// Do custom painting
g.setColor(Color.WHITE);
g.fillRect(50, getHeight() / 2, 20, 120);
}
}
}
我已经尝试通过在他们的 myPanel
上调用 setLocation
方法来改变他们的位置,但这没有用。
所以您创建了一个玩家 class,但是您在 class 中没有玩家的位置。
由于桨只会上下移动,我们只需要改变 y 坐标的方法。
static class Player{
int x;
int y;
Player(int x){this.x=x;}
void moveUp(){y--;}
void moveDown(){y++;}
void drawPlayer(Graphics2D g){
g.fillRect(x,y,40,120);
}
}
现在,在扩展 JPanel 的 class 中(在您的情况下 MyPanel
),我们可以将新创建的 Player
class 作为输入(通过将其放入构造函数)
我们还可以创建一个计时器,以便定期刷新帧。
通过在时钟中添加players[0].moveDown;
,第一个桨将每帧向下移动
在paint方法中我们可以遍历玩家并使用Player
class中的drawPlayer
方法显示他们。
MyPanel(Player[] players) {
this.players = players;
setBackground(Color.BLACK);
new Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
repaint();
players[0].moveDown;
}
}, 300, 1000 / 60);
}
@Override
public void paint(Graphics g) {
super.paintComponent(g);
g.setColor(Color.WHITE);
for(Player p : players){
p.drawPlayer((Graphics2D) g);
}
}
现在把它们放在一起,我们只需要在启动程序时创建播放器。
Player[] players = new Player[]{
new Player(100),
new Player(1000)
};
frame.add(new PongWindow(players));
代码整体如下:
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Timer;
import java.util.TimerTask;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame("gEngine");
Player[] players = new Player[]{
new Player(100),
new Player(1000)
};
frame.add(new PongWindow(players));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBackground(Color.RED);
frame.setSize(1280, 720);
frame.setResizable(false);
frame.setVisible(true);
}
static class Player{
int x;
int y;
Player(int x){this.x=x;}
void moveUp(){y+= -8;}
void moveDown(){y+= 8;}
void drawPlayer(Graphics2D g){
g.fillRect(x,y,40,120);
}
}
static class PongWindow extends JPanel {
//private JPanel panel = new JPanel();
Player[] players;
PongWindow(Player[] players) {
this.players = players;
setBackground(Color.BLACK);
new Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
repaint();
players[0].moveDown();
}
}, 300, 1000 / 60);
}
@Override
public void paint(Graphics g) {
super.paintComponent(g);
g.setColor(Color.WHITE);
for(Player p : players){
p.drawPlayer((Graphics2D) g);
}
}
}
}