ここでの私の質問は、JPanelに画像を表示するにはどうすればよいですか?似たようなことを尋ねるここの他のトピックは、どうすればそれができるかについて私にはわかりません。
プロジェクトフォルダに、画像ファイル_Project Folder/GUI/img
_、具体的には_gray.png
_と_green.png
_があり、JPanelに表示したいディレクトリがあります。
他の投稿で見つけたImageIcon
とJLabel
を使用して、次のコードを試してみました。
_ImageIcon image = new ImageIcon("GUI/img/gray.png");
JLabel label = new JLabel(image);
//JPanel panel is already initialized by the IDE
panel.add(label)
_
しかし、機能しません... JPanel
は、画像を表示せずに空のままです。どうやってやるの?
これに加えて、ボタンを押すなどのアクションが実行されると、JPanel
内の画像が変更されます(_gray.png
_ for _green.png
_)。 JPanel
に画像を表示するのと同じ方法でアーカイブできますか?
前もって感謝します!
編集:これを取得するためのテストコードの例を次に示します。初期化はIDEによって自動的に行われます。
_import Java.awt.Image;
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.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
public class Sample extends javax.swing.JFrame {
public Sample() {
initComponents();
}
//Initialization
private void initComponents() {
PanelImage = new javax.swing.JPanel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
addWindowListener(new Java.awt.event.WindowAdapter() {
public void windowOpened(Java.awt.event.WindowEvent evt) {
formWindowOpened(evt);
}
});
javax.swing.GroupLayout PanelImageLayout = new javax.swing.GroupLayout(PanelImage);
PanelImage.setLayout(PanelImageLayout);
PanelImageLayout.setHorizontalGroup(
PanelImageLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
);
PanelImageLayout.setVerticalGroup(
PanelImageLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(61, 61, 61)
.addComponent(PanelImage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(239, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(45, 45, 45)
.addComponent(PanelImage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(155, Short.MAX_VALUE))
);
pack();
}
private void formWindowOpened(Java.awt.event.WindowEvent evt) {
try {
DisplayImage(PanelImage, "/GUI/img/gray.png");
} catch (Exception ex) {
Logger.getLogger(Sample.class.getName()).log(Level.SEVERE, null, ex);
}
}
//For display the url image in a JPanel
private void DisplayImage(JPanel jp, String url) throws IOException, Exception {
try {
Image image=ImageIO.read(this.getClass().getResource(url));
ImageIcon imageicon=new ImageIcon(image);
JLabel label=new JLabel(imageicon);
jp.add(label);
} catch (IOException ex) {
throw new IOException();
} catch (Exception ex) {
throw new Exception();
}
}
public static void main(String args[]) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
Java.util.logging.Logger.getLogger(Sample.class.getName()).log(Java.util.logging.Level.SEVERE, null, ex);
}
Java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Sample().setVisible(true);
}
});
}
// Variables declaration
private javax.swing.JPanel PanelImage;
}
_
private void DisplayImage(JPanel jp, String url)
は、_String url
_のURL _JPanel jp
_から、画像を表示するために作業する必要があるものです。
グーグルでコードの断片を探して、私は解決策に行き着きました...そして以前のコメントが参照しているのと同じパターンを適用していました。私に解決策を与えたコードは次のとおりです。
label.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/gray.png")))
それで、実装したいメソッドを作成しました。
private static void DisplayImage(JPanel jp, String url) {
JLabel jl=new JLabel();
jl.setIcon(new javax.swing.ImageIcon(getClass().getResource(url)));
jp.add(jl);
}
たぶんこれは完璧で最も正しい解決策ではありませんが、私にとっては完璧に機能します。それが私が望んでいることです。
答えと提案をありがとう!
Minesweeperの作成に取り組んでいたときに、同様の問題が発生しました。結局、解決策を見つけて、最初に画像をロードし、次にその画像からImageIconを作成することで、それを機能させることになりました。
Image myImage = ImageIO.read(getClass().getResource("image_path.jpg"));
myImage = myImage.getScaledInstance(30, 30, Java.awt.Image.SCALE_SMOOTH);
ImageIcon myImageIcon = new ImageIcon(myImage);
imageIcon(this.getClass()。getResource( "/ Gui/img/gray.png"));を使用する必要があります。
これがその動作の例です。
import Java.awt.Dimension;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class ExImage extends JPanel
{
public ExImage()
{
ImageIcon imageIcon = new ImageIcon(this.getClass().getResource("/gray.png"));
JLabel label = new JLabel(imageIcon);
add(label);
}
public static void main(String[] args)
{
JFrame frame = new JFrame();
frame.add(new ExImage());
frame.setVisible(true);
frame.setPreferredSize(new Dimension(200, 300));
}
}