Add a picture to a JFrame

2020-05-10 14:04发布

All I am trying to do is add a picture to a JFrame.

I am really confused and don't really understand... I have looked up every possible question on this site, looked on other java stuff, such as forums. I tried my best and now I must ask guys for help. I hope the code is clean and easy to read. Thanks for the help.

package zeus;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.ImageIcon;

public class Main extends JFrame{

    public static final int WIDTH = 800;
    public static final int HEIGHT = 600;
    public static final int SCALE = 1;

    public static void Launch(){

        JFrame xF = new JFrame("xFrame");
        xF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        xF.setResizable(false);
        xF.setVisible(true);
        xF.setSize(WIDTH*SCALE,HEIGHT*SCALE);
        xF.setLocationRelativeTo(null);
        xF.add(new JLabel(new ImageIcon("/Clicker/xS/cow.png")));

    }

    public static void main(String[] args){

        Launch();

    }

}

Very sorry for the confusion, eclipse shows no error, also I am trying to open a JFrame with an image on it, that I can eventually use to create into a button to change a value of a int value.

3条回答
Summer. ? 凉城
2楼-- · 2020-05-10 14:25

I have a couple of tips for you:

  • If you know your frame size then there is no need to over-complicate it
  • Try using frame as the JFrame's name rather than xF so it is easier to look at.
  • Rearrange your methods so that setVisible(true); is at the end.

Now, as for your code I suggest you use two classes: One for the frame and one for the panel.

The frame class

import javax.swing.JFrame;

public class Apollo
{
    public static void main(String[] args)
    {
    Jframe frame = new JFrame("xFrame");
    frame.setSize(800,600);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setContentPane(new Poseidon());
    frame.setVisible(true);
    }
}

The panel class

import javax.swing.*;
import java.awt.*;

public class Poseidon extends JPanel
{
    public void paintComponent(Graphics g)
    {
    g.setColor(Color.WHITE);
    g.fillRect(0,0,800,600);

    ImageIcon clicker = new ImageIcon("/Clicker/xS/cow.png");
    /*The following are two methods for image sizing,
     *Use the one that best fits your code:
     *
     *g.drawImage(clicker.getImage(), x, y, null); 
     *Fill in the arguments for x and y to locate your upper left corner
     *The image will be in it's original size
     *
     *g.drawImage(clicker.getImage(), x, y, w, h, null);
     *Fill in the arguments for w and h to set the width and height of your image
     *The image will be in it's scaled size
     */
    }
}
查看更多
一夜七次
3楼-- · 2020-05-10 14:30

The biggest issues I can see are...

  • Extending from JFrame, but not actually using it...
  • Reliance on static when not really required...
  • Calling setVisible before anything has actually begin added. In fact, generally trying to manipulate the frame properties before anything was added to it and after it was made visible...

    public class Main {

     public static void main(String[] args){
    
         EventQueue.invokeLater(new Runnable() {
             public void run() {
    
                 JFrame xF = new JFrame("xFrame");
                 xF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                 xF.add(new JLabel(new ImageIcon("/Clicker/xS/cow.png")));
                 xF.setResizable(false);
                 xF.setSize(WIDTH*SCALE,HEIGHT*SCALE);
                 xF.setLocationRelativeTo(null);
                 xF.setVisible(true);
    
              }
         }
     }
    

    }

But since you never actually described what problems you were having, these are all guesses...

查看更多
放荡不羁爱自由
4楼-- · 2020-05-10 14:38

You can use xF.setContentPane(new JLabel(new ImageIcon(image_path)));

查看更多
登录 后发表回答