[英]I need help inserting an image to a JPanel in java,
這是我寫的代碼,它沒有導致沒有圖像 output 面板只是空的 我的目標是有一個有 8 個面板的框架,每個面板都包含一張圖片
ImageIcon image1 = new ImageIcon("kenya.png");
Image ken = image1.getImage();
Image kenya = ken.getScaledInstance(200,100,java.awt.Image.SCALE_FAST);
image1 = new ImageIcon(kenya);
JFrame frame = new JFrame("Ticket airline system");
frame.setVisible(true);
frame.setSize(1800,1000);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setBackground(new Color(200,250,255));
panel.setSize(1800,1000);
panel.setLayout(null);
panel.setBounds (0,0,1800,1000);
JPanel panel1 = new JPanel();
panel1.setBounds(0,140,300,280);
panel1.setLayout(null);
JLabel label1 = new JLabel();
label1.setSize(200,180);
label1.setIcon(image1);
panel1.add(label1);
panel.add(panel1);
frame.add(panel);
null
或“像素完美”布局是一種錯覺。 go 確定組件的最佳尺寸/位置和關系有很多因素,您需要花費大量時間嘗試使其在每個平台上都能正常工作。
相反,請利用所有已經完成的工作,有關更多詳細信息,請參閱在容器中布置組件。
ImageIcon(String)
期望在磁盤上您指定的位置找到一個文件。 由於您使用的是相對路徑,因此這將偏離應用程序的“工作”位置(即啟動目錄)。
如果圖像“似乎沒有加載”,我會考慮使用類似System.out.println(new File("kenya.png").exists());
,這將很好地指示問題是圖像文件本身還是在當前上下文中找不到圖像文件。
如果你想知道當前的工作目錄是什么,你可以使用System.out.println(System.getProperty("user.dir"));
ImageIcon
還將嘗試在后台線程中加載圖像,這意味着如果失敗,它將默默地加載。 由於這個(以及其他一些)原因,我更喜歡使用ImageIO.read
,請參閱讀取/加載圖像
現在,解決外部文件這個問題的一種方法是將它們直接“嵌入”到應用程序上下文中。 通常這是通過將它們包含在生成的 Jar 中來完成的。 根據您構建的系統和 IDE,您應該能夠將圖像添加到項目中的“位置”,這將使它們在開發過程中很容易獲得,並在導出時自動將它們包含在 Jar 中。
在 Netbeans(使用基於 Ant 的項目)中,您可以簡單地將資源拖放到src
目錄中。
一旦它們被“嵌入”,您就不能再將它們視為文件,而是需要根據您的需要使用Class#getResource
或Class#getResourceAsStream
例如...
BYO 自己的圖像(我不應該這么說,但你會感到驚訝)。
我還特意將列數設置為 3,以便更好地顯示“突出顯示”。
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (IOException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
public class TestPane extends JPanel {
public TestPane() throws IOException {
setLayout(new GridLayout(-1, 3));
for (int index = 0; index < 8; index++) {
BufferedImage img = ImageIO.read(getClass().getResource("/images/Cute" + (index + 1) + ".png"));
JLabel label = new JLabel(new ImageIcon(img.getScaledInstance(-1, 50, Image.SCALE_SMOOTH)));
JPanel panel = new JPanel(new GridBagLayout());
panel.add(label);
if (index % 2 == 0) {
panel.setBackground(Color.DARK_GRAY);
}
add(panel);
}
}
}
}
現在,如果您希望圖像是可選的,那么您應該考慮使用JList
代替,它可以支持列和行(它默認為單列)
如果您希望將圖像列在單列中(對於上面的示例),則更改GridLayout
使用的列數,這比嘗試自己手動重新計算位置要簡單得多
Image#setScaledInstance
既不高效也不美觀,請參閱
更多細節
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.