【问题标题】:Java Graphics on a null layout空布局上的 Java 图形
【发布时间】:2018-07-29 03:43:21
【问题描述】:

我对这个面板的最终目的是我有一个能够在屏幕上移动的 img 图标,当它们落在我的一个当前按钮上时,新面板会打开,你会得到一个迷你游戏,即 true/错误、迷宫或单词查找。

我现在在哪里... 我做了一个基本的 null 布局,并将按钮作为占位符,玩家图标将转到其中以打开下一个面板。

我正在努力在屏幕上放置一个简单的矩形,它可以使用箭头键盘监听器来移动。我在网上观看了有关创建它的教程并搜索了这个数据库。

我当前的代码仍然显示我的 null 布局,带有我的地图 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){}

}

【问题讨论】:

  • 为了更好地解决这个问题,您能否用您当前的代码发布您当前不想要的结果? (链接可以,因为是补充,代码已经很长了)
  • 对不起,我对此很陌生,我不希望的结果是代码不会在输出中显示我绘制的矩形,它只显示我的背景图像和按钮。
  • 获取图像的一种方法是热链接到this Q&A 中看到的图像。例如。 This answer 指向嵌入在 this question 中的图像的热链接。
  • I watched tutorials online about creating this as well as searched this data base. - 你不应该使用 KeyListener。论坛中的所有建议都是使用“键绑定”。见Motion Using the Keyboard。该示例显示了如何移动动作组件,而不是图像的绘制。但是,概念是相同的。您无需设置组件的位置,而是设置要绘制的矩形的 x/y 值。

标签: java swing graphics layout-manager null-layout-manager


【解决方案1】:

您的 JLabel 的 ImageIcon 正在添加到绘图 JPanel、this 或地图 JPanel(应重命名为“地图”),因此地图中的任何绘图都不会显示。但为什么要这样做?当您已经覆盖地图的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);
    }

    // ..... 

}   

【讨论】:

  • 我收到一个错误 - backgroundImg = ImageIO.read(IMAGE_PATH);它是说“没有找到适合 read(String) 方法 ImageIO.read(File) 的方法不适用(参数不匹配;字符串无法转换为文件)
  • @Justin: 是的,那应该是new File(...) 那里(已更正),您可能必须处理异常并导入类——这段代码不是作为复制发布的——粘贴解决方案,而是作为一般想法发布。
  • 我对代码编辑有点困惑:@Override protected void paintCompent(Graphics g) {。那不应该产生编译器错误吗? (paintCompent 应该是paintComponent
  • @Andrew,他复制了我的代码并提出了一个尝试,paintCompent 是我的错误,我找到并修复了,但我仍然无法解决这个问题。我尝试了他的想法,我参加了有关绘制 img 的 Oracle 教程,并尝试了“try and catch”方式,但尚未能够在面板上绘制 .jpg 图像。在我尝试解决矩形键盘问题之前,这应该是更好的方法。
  • @AndrewThompson:我的粗心大意。感谢您指出!
【解决方案2】:

找到了一种绘制图像的方法,这对于另一个答案中的初学者来说并不奇怪。

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.

在我想要绘制 img 的 map.java 中。

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);
} 

这个问题还有很多,但似乎对它没有太大兴趣,所以我将在此关闭它。因为这是我在制作这款游戏​​的这个迷你项目中遇到的第一个障碍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    相关资源
    最近更新 更多