Java 空布局上的图形
Java Graphics on a null layout
我对这个面板的最终游戏是我有一个 img 图标可以在屏幕上移动,当它们落在我当前的按钮之一上时,新面板打开,你会得到一个迷你游戏,即true/false、迷宫或找词。
我目前所在的位置...
我制作了一个基本的空布局,并将按钮作为占位符放置在玩家图标打开下一个面板的位置。
我正在努力在屏幕上放置一个简单的矩形,它会使用箭头键盘侦听器来回移动。我在线观看了有关创建它的教程并搜索了该数据库。
我当前的代码仍然显示我的空布局,带有我的地图 img 背景和带有 img 图标的按钮。它不会显示我的矩形。
是的,我是一名学生,这是学校的一个项目,我希望你能为我在这里尝试做的 3 件主要事情提供正确的指导。
A. 在屏幕上获取矩形并移动它。
B. 获取矩形上的图像图标。
C. 我应该从哪里开始着手制作它,以便当移动的物体碰到某个点时 JLable、Jbutton、Janything 我想不出如何调出我已经制作的新面板。
感谢大家提供的帮助。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class map extends JPanel implements ActionListener, KeyListener{
Timer t = new Timer(5,this);
int x = 0, y = 0, velX = 0, velY = 0;
JButton mapButton, worldCampusB, universityParkB, fayetteB, erieB, yorkB,
hazeltonB;
JLabel background;
ImageIcon img;
public map(){
t.start();
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
setBackground(new Color(9, 49, 98));
setLayout(new BorderLayout());
ImageIcon oldmain = new ImageIcon("images/oldmain.jpg");
ImageIcon hazelton = new ImageIcon("images/hazelton.jpeg");
ImageIcon york = new ImageIcon("images/york.jpg");
ImageIcon erie = new ImageIcon("images/erie.jpg");
ImageIcon fayette = new ImageIcon("images/fayette.jpg");
ImageIcon worldcampus = new ImageIcon("images/worldcampus.png");
background = new JLabel(new ImageIcon("images/pennmap.jpg"));
add (background);
background.setLayout(null);
mapButton = new JButton("Map Menu: Click to return to main menu.");
mapButton.setBounds(new Rectangle(300,20,300,50));
worldCampusB = new JButton("World Campus");
worldCampusB.setIcon(worldcampus);
universityParkB = new JButton("University Park");
universityParkB.setIcon(oldmain);
fayetteB = new JButton("Fayette");
fayetteB.setIcon(fayette);
erieB = new JButton ("Erie");
erieB.setIcon(erie);
yorkB = new JButton ("York");
yorkB.setIcon(york);
hazeltonB = new JButton ("Hazelton");
hazeltonB.setIcon(hazelton);
background.add(mapButton);
background.add(worldCampusB);
background.add(universityParkB);
background.add(fayetteB);
background.add(erieB);
background.add(yorkB);
background.add(hazeltonB);
//adjusted the button locations on the map - jpk5816
worldCampusB.setBounds(new Rectangle (750,20,195,150));
worldCampusB.setHorizontalTextPosition(JButton.CENTER);
worldCampusB.setVerticalTextPosition(JButton.BOTTOM);
universityParkB.setBounds(new Rectangle(380,250,175,140));
universityParkB.setHorizontalTextPosition(JButton.CENTER);
universityParkB.setVerticalTextPosition(JButton.BOTTOM);
fayetteB.setBounds(new Rectangle(40,445,200,150));
fayetteB.setHorizontalTextPosition(JButton.CENTER);
fayetteB.setVerticalTextPosition(JButton.BOTTOM);
erieB.setBounds(new Rectangle(50,100,175,170));
erieB.setHorizontalTextPosition(JButton.CENTER);
erieB.setVerticalTextPosition(JButton.BOTTOM);
yorkB.setBounds(new Rectangle(625,460,185,130));
yorkB.setHorizontalTextPosition(JButton.CENTER);
yorkB.setVerticalTextPosition(JButton.BOTTOM);
hazeltonB.setBounds(new Rectangle(690,190,170,140));
hazeltonB.setHorizontalTextPosition(JButton.CENTER);
hazeltonB.setVerticalTextPosition(JButton.BOTTOM);
}
public void paintCompent(Graphics g){
super.paintComponent(g);
g.setColor(new Color(9, 49, 98));
g.fillRect(x, y, 50, 30);
}
public void actionPerformed(ActionEvent e){
repaint();
x += velX;
y += velY;
}
public void up(){
velY = -1;
velX = 0;
}
public void down(){
velY = 1;
velX = 0;
}
public void left(){
velX = -1;
velY = 0;
}
public void right(){
velX = 1;
velY = 0;
}
public void keyPressed(KeyEvent e){
int code = e.getKeyCode();
if (code == KeyEvent.VK_UP){
up();
}
if (code == KeyEvent.VK_DOWN){
down();
}
if (code == KeyEvent.VK_LEFT){
left();
}
if (code == KeyEvent.VK_RIGHT){
right();
}
}
public void keyTyped(KeyEvent e){}
public void keyReleased(KeyEvent e){}
}
正在将您的 JLabel 的 ImageIcon 添加到绘图 JPanel、this
或地图 JPanel(应重命名 "Map"),以便 none 绘图内的地图会显示。但是为什么要这样做呢?当您已经覆盖地图的 paintComponent 时,为什么还要使用带有 ImageIcon 的 JLabel 作为背景图像?更好的解决方案是摆脱背景 JLabel 并简单地在 map 的 paintComponent 方法中绘制该图像,然后在之后绘制矩形。
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(backgroundImg, 0, 0, this); // draw image
g.setColor(new Color(9, 49, 98));
g.fillRect(x, y, 50, 30);
}
// rename this to Map so that it complies with Java standards
public class Map extends JPanel implements ActionListener, KeyListener {
private static String IMAGE_PATH = "images/pennmap.jpg";
// ..... other code here
// JLabel background; // **** get rid of this ****
// ImageIcon img;
private BufferedImage backgroundImg;
// constructor needs to be re-named
public Map(){
backgroundImg = ImageIO.read(new File(IMAGE_PATH)); // read in image. Better to use resources though
// .... code here
// background = new JLabel(new ImageIcon("images/pennmap.jpg")); // again get rid of
// add (background); // get rid of
// .... code here
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(backgroundImg, 0, 0, this); // draw image
g.setColor(new Color(9, 49, 98));
g.fillRect(x, y, 50, 30);
}
// .....
}
在另一个答案中找到了一种绘制图像的方法,这对初学者来说并不奇怪。
in myJPanel
public class myJPanel extends JPanel implements ActionListener {
ImageIcon img; //declare
public myJPanel(){
super();
setBackground(Color.white);
setLayout (new BorderLayout());
credits = new credits();
instructions = new instructions();
characterTheme = new characterTheme();
img = new ImageIcon("images/pennmap.jpg");//grab from images foler.
在 map.java 中,这是我想要绘制 img 的地方。
public class map extends JPanel {
ImageIcon img;
public map (ImageIcon img){
this.img = img;
Dimension size = new Dimension(getWidth(),getHeight());
setPreferredSize(size);
setMinimumSize(size);
setMaximumSize(size);
setSize(size);
setLayout(null);
}
public void paintComponent(Graphics g){
g.drawImage(img.getImage(), 0, 0, null);
}
这个问题还有很多内容,但似乎没有多少人对此感兴趣,所以我将在此结束。因为这是我制作这款游戏的迷你项目的第一个障碍。
我对这个面板的最终游戏是我有一个 img 图标可以在屏幕上移动,当它们落在我当前的按钮之一上时,新面板打开,你会得到一个迷你游戏,即true/false、迷宫或找词。
我目前所在的位置... 我制作了一个基本的空布局,并将按钮作为占位符放置在玩家图标打开下一个面板的位置。
我正在努力在屏幕上放置一个简单的矩形,它会使用箭头键盘侦听器来回移动。我在线观看了有关创建它的教程并搜索了该数据库。
我当前的代码仍然显示我的空布局,带有我的地图 img 背景和带有 img 图标的按钮。它不会显示我的矩形。
是的,我是一名学生,这是学校的一个项目,我希望你能为我在这里尝试做的 3 件主要事情提供正确的指导。 A. 在屏幕上获取矩形并移动它。 B. 获取矩形上的图像图标。 C. 我应该从哪里开始着手制作它,以便当移动的物体碰到某个点时 JLable、Jbutton、Janything 我想不出如何调出我已经制作的新面板。
感谢大家提供的帮助。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class map extends JPanel implements ActionListener, KeyListener{
Timer t = new Timer(5,this);
int x = 0, y = 0, velX = 0, velY = 0;
JButton mapButton, worldCampusB, universityParkB, fayetteB, erieB, yorkB,
hazeltonB;
JLabel background;
ImageIcon img;
public map(){
t.start();
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
setBackground(new Color(9, 49, 98));
setLayout(new BorderLayout());
ImageIcon oldmain = new ImageIcon("images/oldmain.jpg");
ImageIcon hazelton = new ImageIcon("images/hazelton.jpeg");
ImageIcon york = new ImageIcon("images/york.jpg");
ImageIcon erie = new ImageIcon("images/erie.jpg");
ImageIcon fayette = new ImageIcon("images/fayette.jpg");
ImageIcon worldcampus = new ImageIcon("images/worldcampus.png");
background = new JLabel(new ImageIcon("images/pennmap.jpg"));
add (background);
background.setLayout(null);
mapButton = new JButton("Map Menu: Click to return to main menu.");
mapButton.setBounds(new Rectangle(300,20,300,50));
worldCampusB = new JButton("World Campus");
worldCampusB.setIcon(worldcampus);
universityParkB = new JButton("University Park");
universityParkB.setIcon(oldmain);
fayetteB = new JButton("Fayette");
fayetteB.setIcon(fayette);
erieB = new JButton ("Erie");
erieB.setIcon(erie);
yorkB = new JButton ("York");
yorkB.setIcon(york);
hazeltonB = new JButton ("Hazelton");
hazeltonB.setIcon(hazelton);
background.add(mapButton);
background.add(worldCampusB);
background.add(universityParkB);
background.add(fayetteB);
background.add(erieB);
background.add(yorkB);
background.add(hazeltonB);
//adjusted the button locations on the map - jpk5816
worldCampusB.setBounds(new Rectangle (750,20,195,150));
worldCampusB.setHorizontalTextPosition(JButton.CENTER);
worldCampusB.setVerticalTextPosition(JButton.BOTTOM);
universityParkB.setBounds(new Rectangle(380,250,175,140));
universityParkB.setHorizontalTextPosition(JButton.CENTER);
universityParkB.setVerticalTextPosition(JButton.BOTTOM);
fayetteB.setBounds(new Rectangle(40,445,200,150));
fayetteB.setHorizontalTextPosition(JButton.CENTER);
fayetteB.setVerticalTextPosition(JButton.BOTTOM);
erieB.setBounds(new Rectangle(50,100,175,170));
erieB.setHorizontalTextPosition(JButton.CENTER);
erieB.setVerticalTextPosition(JButton.BOTTOM);
yorkB.setBounds(new Rectangle(625,460,185,130));
yorkB.setHorizontalTextPosition(JButton.CENTER);
yorkB.setVerticalTextPosition(JButton.BOTTOM);
hazeltonB.setBounds(new Rectangle(690,190,170,140));
hazeltonB.setHorizontalTextPosition(JButton.CENTER);
hazeltonB.setVerticalTextPosition(JButton.BOTTOM);
}
public void paintCompent(Graphics g){
super.paintComponent(g);
g.setColor(new Color(9, 49, 98));
g.fillRect(x, y, 50, 30);
}
public void actionPerformed(ActionEvent e){
repaint();
x += velX;
y += velY;
}
public void up(){
velY = -1;
velX = 0;
}
public void down(){
velY = 1;
velX = 0;
}
public void left(){
velX = -1;
velY = 0;
}
public void right(){
velX = 1;
velY = 0;
}
public void keyPressed(KeyEvent e){
int code = e.getKeyCode();
if (code == KeyEvent.VK_UP){
up();
}
if (code == KeyEvent.VK_DOWN){
down();
}
if (code == KeyEvent.VK_LEFT){
left();
}
if (code == KeyEvent.VK_RIGHT){
right();
}
}
public void keyTyped(KeyEvent e){}
public void keyReleased(KeyEvent e){}
}
正在将您的 JLabel 的 ImageIcon 添加到绘图 JPanel、this
或地图 JPanel(应重命名 "Map"),以便 none 绘图内的地图会显示。但是为什么要这样做呢?当您已经覆盖地图的 paintComponent 时,为什么还要使用带有 ImageIcon 的 JLabel 作为背景图像?更好的解决方案是摆脱背景 JLabel 并简单地在 map 的 paintComponent 方法中绘制该图像,然后在之后绘制矩形。
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(backgroundImg, 0, 0, this); // draw image
g.setColor(new Color(9, 49, 98));
g.fillRect(x, y, 50, 30);
}
// rename this to Map so that it complies with Java standards
public class Map extends JPanel implements ActionListener, KeyListener {
private static String IMAGE_PATH = "images/pennmap.jpg";
// ..... other code here
// JLabel background; // **** get rid of this ****
// ImageIcon img;
private BufferedImage backgroundImg;
// constructor needs to be re-named
public Map(){
backgroundImg = ImageIO.read(new File(IMAGE_PATH)); // read in image. Better to use resources though
// .... code here
// background = new JLabel(new ImageIcon("images/pennmap.jpg")); // again get rid of
// add (background); // get rid of
// .... code here
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(backgroundImg, 0, 0, this); // draw image
g.setColor(new Color(9, 49, 98));
g.fillRect(x, y, 50, 30);
}
// .....
}
在另一个答案中找到了一种绘制图像的方法,这对初学者来说并不奇怪。
in myJPanel
public class myJPanel extends JPanel implements ActionListener {
ImageIcon img; //declare
public myJPanel(){
super();
setBackground(Color.white);
setLayout (new BorderLayout());
credits = new credits();
instructions = new instructions();
characterTheme = new characterTheme();
img = new ImageIcon("images/pennmap.jpg");//grab from images foler.
在 map.java 中,这是我想要绘制 img 的地方。
public class map extends JPanel {
ImageIcon img;
public map (ImageIcon img){
this.img = img;
Dimension size = new Dimension(getWidth(),getHeight());
setPreferredSize(size);
setMinimumSize(size);
setMaximumSize(size);
setSize(size);
setLayout(null);
}
public void paintComponent(Graphics g){
g.drawImage(img.getImage(), 0, 0, null);
}
这个问题还有很多内容,但似乎没有多少人对此感兴趣,所以我将在此结束。因为这是我制作这款游戏的迷你项目的第一个障碍。