私は人々がこれを繰り返すことで私を憎むかもしれないと思います:P:
- JFrameクラスを拡張しないでください
- クラス名は大文字で始まります。
Guikopie
また、背景が何に使用されているかによっても異なります。つまり、特定の場所にロゴが追加される場合は、JPanel
aを使用してJLabel
も問題ありませんが、背景として使用されている場合はそうではありません。コンポーネントが追加されると移動するため、背景をコンポーネントとして追加するのではなく、コンポーネントに背景をペイントします。
あなたの質問について:
私の質問は:なぜこのコードは画像を表示しないのですか?
あなたのコードは私にとって完璧に機能するので、あなたの写真の場所は間違っているに違いありません。
背景にを追加してImage
からに追加する方法を示す短い例を実行しました。これには、画像のサイズを変更するためのクラスも含まれています。JPanel
JPanel
JFrame
ImgUtils
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class JFrameWithPicture {
public JFrameWithPicture() throws MalformedURLException, IOException {
initComponents();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
new JFrameWithPicture();
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
}
private void initComponents() throws MalformedURLException, IOException {
JFrame frame = new JFrame("Frame with JPanel and background");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final Image background = ImageUtils.scaleImage(300, 300, ImageIO.read(new URL("http://images2.layoutsparks.com/1/98191/naruto-14-red-design.jpg")));
final Dimension jpanelDimensions = new Dimension(new ImageIcon(background).getIconWidth(), new ImageIcon(background).getIconHeight());
frame.add(new JPanel() {
@Override
protected void paintComponent(Graphics grphcs) {
super.paintComponent(grphcs);
grphcs.drawImage(background, 0, 0, this);
}
@Override
public Dimension getPreferredSize() {
return jpanelDimensions;
}
});
frame.setResizable(false);
frame.pack();
frame.setVisible(true);
}
}
class ImageUtils {
public static BufferedImage scaleImage(int width, int height, String filename) {
BufferedImage bi;
try {
ImageIcon ii = new ImageIcon(filename);
bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = (Graphics2D) bi.createGraphics();
g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
g2d.drawImage(ii.getImage(), 0, 0, width, height, null);
} catch (Exception e) {
return null;
}
return bi;
}
static Image scaleImage(int width, int height, BufferedImage filename) {
BufferedImage bi;
try {
bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = (Graphics2D) bi.createGraphics();
g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
g2d.drawImage(filename, 0, 0, width, height, null);
} catch (Exception e) {
return null;
}
return bi;
}
}
または、 Image#getScaledInstance(int width、int height、int Hints)を使用してサイズを変更することもできますが、これには危険が伴います。主な問題は次のとおりです。
Image.getScaledInstance()
完成した拡大縮小された画像は返されません。後で画像ピクセルが使用されるときに、スケーリング作業の多くが残ります。