2

私は Swing を使用しており、プログラムに画像を追加しようとしています。

field = new JFormattedTextField(formatter);

ImageIcon icon = new ImageIcon("background.png"),
          icon1 = new ImageIcon("1.png");

JLabel background = new JLabel(icon); 
JLabel firstIcon = new JLabel(icon1);

JPanel center = new JPanel(new GridLayout(0, 1));


    public void initComponents() {
          this.getContentPane().add(center, BorderLayout.CENTER);

center.add(background);

field.setBounds(50,50);
background.add(field);
background.add(fristIcon);
}

このコードではすべてが機能していますが、同じ画像「background.add(fristIcon);」を追加しようとすると、繰り返しますが、最初に画像が追加されていません。すべての新しい画像は最後のアイコンを削除しています。

4

3 に答える 3

2

background は JLabel であり、通常、ある JLabel を別の JLabel に追加することはありません。ただし、これを行う必要がある場合は、コンテナーとして機能している JLabel に適切なレイアウト マネージャーを与えて、追加コンポーネントをスマートな方法で表示できるようにしてください。デフォルトでは、JLabels にはレイアウトがなく (null レイアウト)、追加されたコンポーネントは、表示するサイズと場所を指定する必要があります。これを行うことはできますが、追加されたすべてのコンポーネントの境界を指定しますが、これを行うと非常に柔軟性のない GUI になり、あるプラットフォームでは見栄えがよくても、他のほとんどのプラットフォームや画面ではひどく見えるため、これを行わないことをお勧めします。これは、更新と維持が非常に困難です。代わりに、レイアウト マネージャーを学習して学習し、JPanels やその他のコンポーネントをネストする必要があります。

私が何を意味するかを理解するために、基本的な FlowLayout を使用することを検討してください。

background.setLayout(new FlowLayout());

注意してください

于 2014-05-17T18:20:01.077 に答える
0

アイコンの上にアイコンを追加したい。

これは、オーバーライドされたメソッド内の既存のGraphics.drawImage()画像を描画するために使用しているコードです。GraphicsJLabelpaintComponent()

詳細については、インライン コメントを参照してください。

サンプルコード:

// back ground image
URL url1 = new URL(
        "https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcQu3FFM1kR-aeYFjJIqebgusVZNM6uG-a0F4Z_0IPopEqfSZwzBBA");
final BufferedImage bg = ImageIO.read(url1);

// foreground image
URL url2 = new URL("https://cdn1.iconfinder.com/data/icons/supermariopack/Mario.png");
final BufferedImage fg = ImageIO.read(url2);

// re size the image
final BufferedImage scaled = new BufferedImage(fg.getWidth() / 2, fg.getHeight() / 2,
        BufferedImage.TYPE_INT_RGB);
Graphics g = scaled.getGraphics();
g.drawImage(fg, 0, 0, scaled.getWidth(), scaled.getHeight(), null);
g.dispose();

// create a JLabel with back ground image
final JLabel label = new JLabel(new ImageIcon(bg)) {
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        // draw the foreground image
        g.drawImage(scaled, 50, 50, null);
    }
};

JOptionPane.showMessageDialog(null, label);

上記のコードは、この投稿のコードを変更したものですHow to draw an image over another image? .

スクリーンショット:

ここに画像の説明を入力

于 2014-05-17T19:37:53.570 に答える
-1

同じコンポーネントを複数回追加することはできません。

次のように進めることをお勧めします。

for(int i=0;i<N;i++){
   JLabel img=new JLabel(icon1);
   switch(i){
   case 0:
      img.setBounds(x,y,w,h);
      break;
   case 1:
      img.setBounds(x,y,w,h);
      break;
   default:
      break;
   }
   background.add();
}

N は、表示するアイコンの数に等しい

ただし、コンテナとして JLabel は推奨されません。そのためには、JPanel をラベルのコンテナとして使用することをお勧めします

于 2014-05-17T18:47:28.637 に答える