2

以下是我到目前为止的代码:所有导入都是正确的。我确定。:D

当我运行程序时,我得到的只是一个空白帧,没有图片。它应该出现。

public class WindowPractice extends JFrame {

   final static int width= 800;
   final static int height= 400;
   int x;
   int y;
   Image steve;
   Dimension gamesize= new Dimension (width, height);
    public WindowPractice(){
        setTitle ("Hangman");
        setSize (gamesize);
        setVisible (true);
        setResizable (false);
        setLocationRelativeTo (null);
        setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);


    }
    public static void main (String[] args) {
        new WindowPractice();
        ImageIcon steve= new ImageIcon ("Libraries/Pictures/ba190cd951302bcebdf216239e156a4.jpg");
        JLabel imageLabel = new JLabel(steve);

    }
    public void paint(Graphics g){

        g.setColor(Color.red);
        //g.fillRect(  x, y, 100, 20);
        g.drawImage(steve, x, y,this);


        x= 150;
        y= 250;
    }

}
4

1 回答 1

7

这有很多问题我不知道从哪里开始......

让我们从头开始...

问题 #1

您声明了一个steve在您的WindowPractice类中调用的实例字段,这很好,但是在您的 main 方法中,您声明了另一个变量steve,您正在使用对加载图像的引用...

public static void main(String[] args) {
    new WindowPractice();
    ImageIcon steve = new ImageIcon("C:/Users/shane/Dropbox/issue459.jpg");
    JLabel imageLabel = new JLabel(steve);
}

这意味着类实例变量永远不会被初始化并保持不变null

问题 #2

虽然没有直接关系,但您永远不会super.paint从您的paint方法中调用。这是一个很大的不,不。您有义务维护油漆链。绘画方法很复杂,非常非常重要。

问题 #3

您永远不应该覆盖顶级容器(例如JFrame),也不应该覆盖它的任何paint方法。这有很多原因,但在前两个中,大多数顶级容器实际上包含许多组件(JRootPane,其中包含玻璃窗格、内容窗格、图层窗格和菜单栏),这些组件可以覆盖您的绘画工作和,一般来说,它们不是双缓冲的,这意味着你绘制的更新会闪烁并且看起来很糟糕;)

您还应该避免使用paint,相反,您应该考虑paintComponent在可用的地方使用。

问题 #4

ImageIcon不是您加载图像的最佳选择。我不使用它们的主要原因是您不知道正在加载的图像何时真正可用(实际上有一些方法,但坦率地说,ImageIO只是更简单)。这是 1999 年的一个很棒的功能,当时拨号速度在 14.4k 左右,但现在……

ImageIO支持更广泛的图片格式,支持图像的读取和写入,并保证当方法返回(成功)时,图像像素数据可供您的应用程序使用。

例子

这是一个更好的(恕我直言)方法......

在此处输入图像描述

public class BetterDrawing {

    public static void main(String[] args) {
        new BetterDrawing();
    }

    public BetterDrawing() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new PaintPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class PaintPane extends JPanel {

        private BufferedImage background;

        public PaintPane() {
            try {
                background = ImageIO.read(new File("/path/to/image"));
                // Use this instead to load embedded resources instead
                //background = ImageIO.read(getClass().getResource("/path/to/image"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return background == null ? super.getPreferredSize() : new Dimension(background.getWidth(), background.getHeight());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            if (background != null) {

                int x = (getWidth() - background.getWidth()) / 2;
                int y = (getHeight() - background.getHeight()) / 2;

                g.drawImage(background, x, y, this);

            }

        }
    }
}

读一读

了解更多信息。

于 2012-12-14T01:55:43.907 回答