繁体   English   中英

Swing问题绘制2张图像

[英]Swing issues drawing 2 images

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

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

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()
    {
        try
        {               
            image2=ImageIO.read(new File("New Game.png"));     
        }
        catch (IOException e)
        {
            //Nothing
        }
        frame.setSize(1000,100);
        frame.setResizable(true);
        frame.add(Panel);
        Panel.setOpaque(true);
        frame.pack();
        frame.setVisible(true);     
    }

    public void paintComponent(Graphics g)
    {
        g.drawImage(image2,0,0,null);
    }
}

2级:

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

public class PanClass extends JPanel
{
    private static BufferedImage theimage;
    private static BufferedImage image2;
    private JPanel a=new JPanel();

    public PanClass()
    {
        a.setLayout(null);
        a.setOpaque(true);
        try
        {                 
            theimage = ImageIO.read(new File(design4.jpg"));
        }
        catch (IOException e)
        {
            //Not handled.
        }
    }

    public void paintComponent(Graphics g)
    {
        g.drawImage(theimage,0,0,null);
    }
}

现在的代码只显示来自PanClass的图像。 如果我要在PanClass中添加两个图像的绘图,那么两者都将被正确绘制。 我很想知道为什么会这样,因为我更感兴趣的是学习它的工作原理而不是完成工作。 此外,如果我在类中创建JFrame和JLayered窗格,则创建另外两个类,使用paintComponent()绘制图像(使用与上面类似的代码),然后在不同图层上的分层窗格上添加每个类的实例第一堂课,为什么没有显示?

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

您没有将LP3添加到JFrame但只添加了PanClass 所以不调用LP3paintComponent()

您可以添加两个组件(可以定义正确的LayoutManager例如GridLayout )来同时调用paintComponent()


指出你在程序中做错了什么:

  • 您在代码中使用的命名约定,并不意味着使用Java。 有关详细信息,请参阅Java命名约定 两个简单的事情使用Pascal Notions用于类名称和Camel表示法用于变量名称。
  • 每当需要覆盖超类的方法时,尽可能保持ACCESS SPECIFIER最好的 在您的情况下, paintComponent(...)方法的Access Specifier protected而不是public
  • 特别是在重写paintComponent(...)最好在重写方法中调用super.paintComponent(...)
  • 里面你PanClass延伸JPanel要创建一个新JPanel 一个 ,这是不是你想要的,如果你仔细观察。 你想要PanClass本身。
  • 当你将它扩展到任何类时,让它成为覆盖JPanel/JComponentgetPreferredSize()的习惯习惯。
  • 始终定义按下X按钮时JFrame需要关闭的行为。 有关更多信息JFrame.setDefaultCloseOperation(...)
  • 每当覆盖超类的方法时,最好在它前面添加一个注释。 有关Java Annotation Tutorials的更多信息
  • 我希望在一切之后,有关Swing中的Concurrency的小信息值得一提:-)
  • 最后但并非最不重要的,答案是由@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(...)一个非常重要的观点,你对ImageObserver部分使用null ,在这种情况下是你的JPanel而不是null

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM