新しいクラスやメソッドを作成せずに、JPanelの残りの属性と一緒に挿入するだけで、JPanelに背景画像を追加するにはどうすればよいですか?
画像を使用してJPanelの背景を設定しようとしていますが、見つかったすべての例では、独自のクラスでパネルを拡張することを提案しているようです。
私は、まったく新しいクラスを作成せずに、同じメソッド内で単純に画像を追加する方法を探していました(物事を整理してシンプルに保つことを試みています)。
以下に、JPanelを設定する方法の例を示します。
public static JPanel drawGamePanel(){
//Create game panel and attributes
JPanel gamePanel = new JPanel();
Image background = Toolkit.getDefaultToolkit().createImage("Background.png");
gamePanel.drawImage(background, 0, 0, null);
//Set Return
return gamePanel;
}
画像を使用してJPanelの背景を設定しようとしていますが、見つかったすべての例は、独自のクラスでパネルを拡張することを提案しているようです
はい。JPanel
を拡張し、paintcomponent(Graphics g)
関数をオーバーライドする必要があります。
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(bgImage, 0, 0, null);
}
私はまったく新しいクラスを作成せずに同じメソッド内で画像を単純に追加する方法を探していました(物事を整理してシンプルに保つことを試みる )。
画像をアイコンとして直接追加できる他のコンポーネントを使用できます。 JLabel
必要な場合。
ImageIcon icon = new ImageIcon(imgURL);
JLabel thumb = new JLabel();
thumb.setIcon(icon);
しかし、再び括弧内に物事を整理してシンプルにしようとする !!新しいクラスを作成するだけで、ごちゃごちゃした世界に導かれると思わせるのはなぜですか?
JPanelの背景として画像を設定する最も簡単な方法
JPanelを使用しないでください。 JLabelとアイコンを使用するだけで、カスタムコードは不要です。
背景パネル を参照してください。また、3つの異なるペイントオプションを使用してJPanelにイメージをペイントするソリューションについても参照してください。
私ができる方法を知っているように、paintComponent
を継承することを要求するJPanel
メソッドをオーバーライドすることです
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); // Paint the background image and scale it to fill the entire space
g.drawImage(/*....*/);
}
2番目のカスタムJPanel
とputを作成するもう1つの方法(少し複雑)は、メインの背景として
ImagePanel
public class ImagePanel extends JPanel
{
private static final long serialVersionUID = 1L;
private Image image = null;
private int iWidth2;
private int iHeight2;
public ImagePanel(Image image)
{
this.image = image;
this.iWidth2 = image.getWidth(this)/2;
this.iHeight2 = image.getHeight(this)/2;
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
if (image != null)
{
int x = this.getParent().getWidth()/2 - iWidth2;
int y = this.getParent().getHeight()/2 - iHeight2;
g.drawImage(image,x,y,this);
}
}
}
EmptyPanel
public class EmptyPanel extends JPanel{
private static final long serialVersionUID = 1L;
public EmptyPanel() {
super();
init();
}
@Override
public boolean isOptimizedDrawingEnabled() {
return false;
}
public void init(){
LayoutManager overlay = new OverlayLayout(this);
this.setLayout(overlay);
ImagePanel iPanel = new ImagePanel(new IconToImage(IconFactory.BG_CENTER).getImage());
iPanel.setLayout(new BorderLayout());
this.add(iPanel);
iPanel.setOpaque(false);
}
}
IconToImage
public class IconToImage {
Icon icon;
Image image;
public IconToImage(Icon icon) {
this.icon = icon;
image = iconToImage();
}
public Image iconToImage() {
if (icon instanceof ImageIcon) {
return ((ImageIcon)icon).getImage();
} else {
int w = icon.getIconWidth();
int h = icon.getIconHeight();
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice Gd = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = Gd.getDefaultConfiguration();
BufferedImage image = gc.createCompatibleImage(w, h);
Graphics2D g = image.createGraphics();
icon.paintIcon(null, g, 0, 0);
g.dispose();
return image;
}
}
/**
* @return the image
*/
public Image getImage() {
return image;
}
}
フレームに追加されるJPanelの背景に画像を描画します。通常、レイアウトマネージャーを使用して、ボタンやその他のコンポーネントをパネルに追加します。他の子パネルを追加する場合、おそらくchild.setOpaque(false)を設定する必要があります。
import javax.imageio.ImageIO;
import javax.swing.*;
import Java.awt.*;
import Java.io.IOException;
import Java.net.URL;
public class BackgroundImageApp {
private JFrame frame;
private BackgroundImageApp create() {
frame = createFrame();
frame.getContentPane().add(createContent());
return this;
}
private JFrame createFrame() {
JFrame frame = new JFrame(getClass().getName());
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
return frame;
}
private void show() {
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private Component createContent() {
final Image image = requestImage();
JPanel panel = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, null);
}
};
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
for (String label : new String[]{"One", "Dois", "Drei", "Quatro", "Peace"}) {
JButton button = new JButton(label);
button.setAlignmentX(Component.CENTER_ALIGNMENT);
panel.add(Box.createRigidArea(new Dimension(15, 15)));
panel.add(button);
}
panel.setPreferredSize(new Dimension(500, 500));
return panel;
}
private Image requestImage() {
Image image = null;
try {
image = ImageIO.read(new URL("http://www.johnlennon.com/wp-content/themes/jl/images/home-gallery/2.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
return image;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new BackgroundImageApp().create().show();
}
});
}
}