web-dev-qa-db-ja.com

JFrameの背景画像

単純なGUIですが、GUIを作成しています。ウィンドウ全体を背景画像(2048 X 2048)で埋め、左上の角に64 X 64の画像を時々ロードできるようにしたいです。手伝ってくれる人に感謝します:)編集:私はすでにJFrameをセットサイズにする方法を知っています。

12
Aaron

これは、JFrameに背景画像を追加する簡単な例です。

import javax.swing.*;
import Java.awt.*;
import Java.awt.event.*;
class BackgroundImageJFrame extends JFrame
{
    JButton b1;
    JLabel l1;

    public BackgroundImageJFrame()
    {
        setTitle("Background Color for JFrame");
        setSize(400,400);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);

        /*
        One way
        -----------------
        setLayout(new BorderLayout());
        JLabel background=new JLabel(new ImageIcon("C:\\Users\\Computer\\Downloads\\colorful design.png"));
        add(background);
        background.setLayout(new FlowLayout());
        l1=new JLabel("Here is a button");
        b1=new JButton("I am a button");
        background.add(l1);
        background.add(b1);
        */

        // Another way
        setLayout(new BorderLayout());
        setContentPane(new JLabel(new ImageIcon("C:\\Users\\Computer\\Downloads\\colorful design.png")));
        setLayout(new FlowLayout());
        l1=new JLabel("Here is a button");
        b1=new JButton("I am a button");
        add(l1);
        add(b1);
        // Just for refresh :) Not optional!
        setSize(399,399);
        setSize(400,400);
    }

    public static void main(String args[])
    {
        new BackgroundImageJFrame();
    }
} 
  • 詳細については、 here をクリックしてください
16
Nambi

画像を読み込む最良の方法は ImageIO AP​​I を使用することです

BufferedImage img = ImageIO.read(new File("/path/to/some/image"));

画像を画面にレンダリングする方法はいくつかあります。

JLabelを使用できます。とにかく画像を変更したくない場合、これは最も簡単な方法です...

JLabel background = new JLabel(new ImageIcon(img));

次に、必要に応じてウィンドウに追加します。コンポーネントを追加する必要がある場合は、ラベルのレイアウトマネージャーを必要なものに設定し、コンポーネントを追加するだけです。

ただし、より洗練されたものが必要な場合、何らかの方法で画像を変更する必要がある場合、または追加の効果を適用する場合は、カスタムペイントを使用する必要があります。

最初のケーブル:最上位のコンテナー(JFrameなど)に直接ペイントしないでください。トップレベルのコンテナはダブルバッファリングされないため、再描画と他のオブジェクトがウィンドウ上に住んでいる間に点滅する可能性があるため、ペイントプロセスの変更は面倒であり、他の問題を引き起こす可能性があり、フレームには可視領域内にレンダリングされる境界線があります窓の...

代わりに、JPanelのようなものから拡張するカスタムコンポーネントを作成します。 paintComponentメソッドをオーバーライドして、出力をレンダリングします。たとえば...

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(img, 0, 0, this);
}

詳細については、 カスタムペイントの実行 および 2Dグラフィックス をご覧ください。

12
MadProgrammer

@bottと非常によく似た方法を使用しましたが、画像のサイズを変更する必要がないように少し変更しました。

BufferedImage img = null;
try {
    img = ImageIO.read(new File("image.jpg"));
} catch (IOException e) {
    e.printStackTrace();
}
Image dimg = img.getScaledInstance(800, 508, Image.SCALE_SMOOTH);
ImageIcon imageIcon = new ImageIcon(dimg);
setContentPane(new JLabel(imageIcon));

毎回動作します。 jFrameの幅と高さを取得し、それぞれ800と508の代わりに使用することもできます。

5
Riccorbypro

できるよ:

setContentPane(new JLabel(new ImageIcon("resources/taverna.jpg")));

Jframeクラスコンストラクターの最初の行で、それは私のためにうまく機能します

2
bott