簡體   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