[英]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);
}
}
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
。 所以不調用LP3
的paintComponent()
。
您可以添加兩個組件(可以定義正確的LayoutManager
例如GridLayout
)來同時調用paintComponent()
protected
而不是public
。 paintComponent(...)
, 最好在重寫方法中調用super.paintComponent(...)
。 PanClass
延伸JPanel
要創建一個新JPanel
一個 ,這是不是你想要的,如果你仔細觀察。 你想要PanClass
本身。 JPanel/JComponent
的getPreferredSize()的習慣習慣。 JFrame
需要關閉的行為。 有關更多信息JFrame.setDefaultCloseOperation(...) 請考慮此代碼以獲取更多參考:
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.