Java Swing问题绘图2图像

Java Swing问题绘图2图像,java,swing,jpanel,awt,paintcomponent,Java,Swing,Jpanel,Awt,Paintcomponent,我正在尝试使用SWING设计GUI。我的问题是我不确定paintComponent方法是如何工作的。我试图显示2个图像,但只显示PanClass中的一个。下面是相关代码(2个类) 第二类: 现在的代码只显示PanClass中的图像。如果我在PanClass中添加两个图像的绘制,那么这两个图像都将正确绘制。我很想知道为什么会发生这种情况,因为我更想了解它是如何工作的,而不是完成工作。另外,如果我在一个类中创建一个JFrame和一个JLayered窗格,然后再创建两个类,使用paintCompo

我正在尝试使用SWING设计GUI。我的问题是我不确定paintComponent方法是如何工作的。我试图显示2个图像,但只显示PanClass中的一个。下面是相关代码(2个类)


第二类:
现在的代码只显示PanClass中的图像。如果我在PanClass中添加两个图像的绘制,那么这两个图像都将正确绘制。我很想知道为什么会发生这种情况,因为我更想了解它是如何工作的,而不是完成工作。另外,如果我在一个类中创建一个JFrame和一个JLayered窗格,然后再创建两个类,使用paintComponent()绘制图像(使用与上面类似的代码),然后在第一个类的不同层的分层窗格上添加每个类的实例,为什么什么都不显示


(我的主要方法应该是在LP3上,但我只是使用一个IDE,它允许您直接在实例上调用方法,而无需使用主要方法进行学习)

您没有将LP3添加到
JFrame
中,只添加了
PanClass
。因此不会调用
LP3
paintComponent()


您可以添加这两个组件(可能是定义适当的
LayoutManager
,例如
GridLayout
)来调用这两个
paintComponent()

您没有将LP3添加到
JFrame
中,但只添加了
PanClass
。因此不会调用
LP3
paintComponent()

您可以添加这两个组件(可以定义适当的
LayoutManager
,例如
GridLayout
)来调用这两个
paintComponent()
您在程序中的错误点:
  • 您在代码中使用的命名约定并不意味着使用Java。有关更多信息,请参阅。两件简单的事情是使用Pascal概念作为类名,使用骆驼符号作为变量名
  • 每当需要重写超类的方法时,最好尽量保持访问说明符。在您的情况下,方法的访问说明符是
    受保护的
    ,而不是
    公共的
  • 特别是在重写
    paintComponent(…)
    时,最好在重写方法中调用
    super.paintComponent(…)
  • 在扩展了
    JPanel
    PanClass
    中,您正在创建一个新的
    JPanel
    a,如果仔细观察,这不是您想要的。您需要
    PanClass
    本身
  • 当您将
    JPanel/JComponent
    扩展到任何类时,请养成一种习惯,即重写
    JPanel/JComponent的
  • 始终定义按下X按钮时,
    JFrame
    需要如何关闭的行为。更多信息
  • 每当重写超类的方法时,最好在其前面加上注释。更多有关
  • 我希望在这一切之后,一个与之相关的小信息,是值得一提的:-)
  • 最后但并非最不重要的一点是,@StanislavL给出了答案

请考虑此代码以供参考:

import javax.swing.*;
import java.io.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;
import java.awt.Image;
import java.net.URL;

public class LP3 extends JPanel
{
    public static BufferedImage image;
    public static BufferedImage image2;
    private JFrame frame = new JFrame();
    private PanClass panel = new PanClass();

    public LP3()
    {
        setOpaque(true);
        try
        {               
            image2=ImageIO.read(new URL(
                "https://encrypted-tbn1.gstatic.com/images?q=tbn:" + 
                "ANd9GcQCluuYpyVQYZuADHAYIfpkRO7SaWMn0OCM_nGH6Tr2SCFtGtE_"));     
        }
        catch (IOException e)
        {
            //Nothing
            e.printStackTrace();
        }           
    }

    @Override
    public Dimension getPreferredSize()
    {
        return (new Dimension(300, 300));
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(image2,0,0,this);
    }

    private void displayGUI()
    {
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setResizable(true);
        JPanel contentPane = new JPanel();
        contentPane.setLayout(new GridLayout(0, 1, 5, 5));
        contentPane.add(panel);
        contentPane.add(this);
        frame.setContentPane(contentPane);
        frame.pack();
        frame.setVisible(true); 
    }

    public static void main(String[] args)
    {
        Runnable runnable = new Runnable()
        {
            @Override
            public void run()
            {
                new LP3().displayGUI();
            }
        };
        EventQueue.invokeLater(runnable);
    }
}

class PanClass extends JPanel
{
    private static BufferedImage theimage;
    private static BufferedImage image2;

    public PanClass()
    {
        setOpaque(true);
        try
        {                 
            theimage = ImageIO.read(
                new URL(
                    "https://encrypted-tbn0.gstatic.com/" + 
                    "images?q=tbn:ANd9GcR5PNwAcLVjphhST_" + 
                    "S-K_dU0CEAuXM0g4oc1-v1r-z5VJFuemOD"));
        }
        catch (IOException e)
        {
            //Not handled.
            e.printStackTrace();
        }
    }

    @Override
    public Dimension getPreferredSize()
    {
        return (new Dimension(300, 300));
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(theimage, 0, 0, this);
    }
}

编辑:!
  • 我上次忘记了一个非常重要的一点,关于您使用
    g.draw(…)
    ,您使用
    null
    作为零件,在本例中是您的
    JPanel
    ,而不是
    null

您在程序中的错误点:
  • 您在代码中使用的命名约定并不意味着使用Java。有关更多信息,请参阅。两件简单的事情是使用Pascal概念作为类名,使用骆驼符号作为变量名
  • 每当需要重写超类的方法时,最好尽量保持访问说明符。在您的情况下,方法的访问说明符是
    受保护的
    ,而不是
    公共的
  • 特别是在重写
    paintComponent(…)
    时,最好在重写方法中调用
    super.paintComponent(…)
  • 在扩展了
    JPanel
    PanClass
    中,您正在创建一个新的
    JPanel
    a,如果仔细观察,这不是您想要的。您需要
    PanClass
    本身
  • 当您将
    JPanel/JComponent
    扩展到任何类时,请养成一种习惯,即重写
    JPanel/JComponent的
  • 始终定义按下X按钮时,
    JFrame
    需要如何关闭的行为。更多信息
  • 每当重写超类的方法时,最好在其前面加上注释。更多有关
  • 我希望在这一切之后,一个与之相关的小信息,是值得一提的:-)
  • 最后但并非最不重要的一点是,@StanislavL给出了答案

请考虑此代码以供参考:

import javax.swing.*;
import java.io.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;
import java.awt.Image;
import java.net.URL;

public class LP3 extends JPanel
{
    public static BufferedImage image;
    public static BufferedImage image2;
    private JFrame frame = new JFrame();
    private PanClass panel = new PanClass();

    public LP3()
    {
        setOpaque(true);
        try
        {               
            image2=ImageIO.read(new URL(
                "https://encrypted-tbn1.gstatic.com/images?q=tbn:" + 
                "ANd9GcQCluuYpyVQYZuADHAYIfpkRO7SaWMn0OCM_nGH6Tr2SCFtGtE_"));     
        }
        catch (IOException e)
        {
            //Nothing
            e.printStackTrace();
        }           
    }

    @Override
    public Dimension getPreferredSize()
    {
        return (new Dimension(300, 300));
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(image2,0,0,this);
    }

    private void displayGUI()
    {
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setResizable(true);
        JPanel contentPane = new JPanel();
        contentPane.setLayout(new GridLayout(0, 1, 5, 5));
        contentPane.add(panel);
        contentPane.add(this);
        frame.setContentPane(contentPane);
        frame.pack();
        frame.setVisible(true); 
    }

    public static void main(String[] args)
    {
        Runnable runnable = new Runnable()
        {
            @Override
            public void run()
            {
                new LP3().displayGUI();
            }
        };
        EventQueue.invokeLater(runnable);
    }
}

class PanClass extends JPanel
{
    private static BufferedImage theimage;
    private static BufferedImage image2;

    public PanClass()
    {
        setOpaque(true);
        try
        {                 
            theimage = ImageIO.read(
                new URL(
                    "https://encrypted-tbn0.gstatic.com/" + 
                    "images?q=tbn:ANd9GcR5PNwAcLVjphhST_" + 
                    "S-K_dU0CEAuXM0g4oc1-v1r-z5VJFuemOD"));
        }
        catch (IOException e)
        {
            //Not handled.
            e.printStackTrace();
        }
    }

    @Override
    public Dimension getPreferredSize()
    {
        return (new Dimension(300, 300));
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(theimage, 0, 0, this);
    }
}

编辑:!
  • 我上次忘记了一个非常重要的一点,关于您使用
    g.draw(…)
    ,您使用
    null
    作为零件,在本例中是您的
    JPanel
    ,而不是
    null

感谢您的回复。我不知道你的意思。如果我在JFrame上添加LP的实例,这不是一个无限循环吗?(我的主方法应该在LP3上,但我只是使用一个IDE,它允许您直接在实例上调用方法,而不需要使用主方法进行学习)您的框架应该是创建的第一件事。所有面板应位于层次结构的较低位置。为什么不让LP3扩展JFrame?我不知道为什么会出现这种行为。我不明白为什么在LP3类中不调用paintComponent。不应该叫它吗
import javax.swing.*;
import java.io.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;
import java.awt.Image;
import java.net.URL;

public class LP3 extends JPanel
{
    public static BufferedImage image;
    public static BufferedImage image2;
    private JFrame frame = new JFrame();
    private PanClass panel = new PanClass();

    public LP3()
    {
        setOpaque(true);
        try
        {               
            image2=ImageIO.read(new URL(
                "https://encrypted-tbn1.gstatic.com/images?q=tbn:" + 
                "ANd9GcQCluuYpyVQYZuADHAYIfpkRO7SaWMn0OCM_nGH6Tr2SCFtGtE_"));     
        }
        catch (IOException e)
        {
            //Nothing
            e.printStackTrace();
        }           
    }

    @Override
    public Dimension getPreferredSize()
    {
        return (new Dimension(300, 300));
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(image2,0,0,this);
    }

    private void displayGUI()
    {
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setResizable(true);
        JPanel contentPane = new JPanel();
        contentPane.setLayout(new GridLayout(0, 1, 5, 5));
        contentPane.add(panel);
        contentPane.add(this);
        frame.setContentPane(contentPane);
        frame.pack();
        frame.setVisible(true); 
    }

    public static void main(String[] args)
    {
        Runnable runnable = new Runnable()
        {
            @Override
            public void run()
            {
                new LP3().displayGUI();
            }
        };
        EventQueue.invokeLater(runnable);
    }
}

class PanClass extends JPanel
{
    private static BufferedImage theimage;
    private static BufferedImage image2;

    public PanClass()
    {
        setOpaque(true);
        try
        {                 
            theimage = ImageIO.read(
                new URL(
                    "https://encrypted-tbn0.gstatic.com/" + 
                    "images?q=tbn:ANd9GcR5PNwAcLVjphhST_" + 
                    "S-K_dU0CEAuXM0g4oc1-v1r-z5VJFuemOD"));
        }
        catch (IOException e)
        {
            //Not handled.
            e.printStackTrace();
        }
    }

    @Override
    public Dimension getPreferredSize()
    {
        return (new Dimension(300, 300));
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(theimage, 0, 0, this);
    }
}