2

そのため、私は自分のプログラムに取り組んでいますが、ネットワークマップの背景画像を使用してJFrameを設定し、JFrameのにMigLayoutを使用してJPanelを設定するのに問題があります。これにより、ネットワークマップ。背景画像を設定する方法についていくつかの異なる方法を見て、このサイトの他の場所で見つけた例を使用してみましたが、うまく機能していません。また、これについてさらに調査したところ、JFrameの上にJPanelを配置すると、JFrameの背景画像が表示されなくなる可能性があることがわかりました。私は誰かが私のコードを見て、それが事実かどうか私に知らせてくれることを望んでいました。

背景を設定するクラスは次のとおりです。

public class bwMonBackground extends JFrame {
    Image img;
    public bwMonBackground() {
        try {
            img = ImageIO.read(new File("/Users/pwopperer/workspace/BWmon/src/customer_vlans.jpg"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
public void paintComponent(Graphics g)
{
    super.paintComponents(g);
    g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
}

}

これが私のメインです:

public class bwMonBackgroundMain {

    public static void main( String[] args )
        {
            bwMonBackground frame = new bwMonBackground();
            frame.setLayout(new FlowLayout(FlowLayout.LEFT,10,20));
            migLayout testing = new migLayout();
            frame.add(testing.createLayout());
            frame.setVisible(true);
            frame.setResizable(false);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();

        }
}

編集:このように実行すると、6つのJLabelが追加されたJPanelしか取得できません

4

1 に答える 1

3

少しうるさいsuper.paintComponentですが、本当に、本当に正当な理由がない限り、常に電話する必要があります。

また、可能な場合は提供する必要がGraphics.drawImageありImageObserverます。基本的に、これは、画像処理が別のスレッドで行われている場合、ImageObserverは変更を通知せず、自動的に更新されることを意味します;)

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

コンポーネントをマップに配置するときは、コンポーネントが透明であることを確認する必要があります(JComponent.setOpaque(false))。これにより、背景が透けて見えます。

明らかに、不透明にするコンポーネントを選択して、読みやすくしたり、AlphaComposite半透明の効果を提供したりすることができます。

追加のアイデア

JFrame私はこの方法でオーバーライドしません。フレームには、コアコンテンツを担当するコンテンツペインがあります。

その上、メモリからJFrame、メソッドがありませんpaintComponent:P

代わりに、オーバーライドJPanel(またはJComponent)とuser therepaintComponentメソッドを使用し、このパネルをフレームのコンテンツペインに追加するか、コンテンツペイン自体として設定します(frame.setContentPane(...)-他のコンポーネントをフレームに追加する前に、これを行うことに注意してください。 UIから効果的に削除します;))

于 2012-08-08T01:47:28.787 に答える