1

最近、数週間前に Java GUI を使い始めましたが、調整に苦労しています。基本的に、背景画像 (トップバーとコンテンツ) が異なる 2 つのパネルを作成しようとしており、それらを順番に並べたいと考えています。問題は、背景画像が元のサイズを失い、非常に小さくなるため、BorderLayout.NORTH使用できないことです。BorderLayout.SOUTH

元のサイズを失うことなく、それらを正しく配置するにはどうすればよいですか?

これが私のコードです:

package main;

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ImageTest {

  public static void main(String[] args) {
    ImageFrame frame = new ImageFrame("topBar.png", "contentImage.png");
    frame.setSize(640,480);
    frame.setVisible(true);
  }
}

class ImagePanel extends JPanel {

private Image img;

public ImagePanel(String img) {
    this(new ImageIcon(img).getImage());    
}

public ImagePanel(Image img) {
    this.img = img;
}

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

}

class ImageFrame extends JFrame {
public ImageFrame(String topBar, String body) {
    setLayout(new BorderLayout());
    ImagePanel topPanel = new ImagePanel(topBar);
    ImagePanel bodyPanel = new ImagePanel(body);
    add(topPanel, BorderLayout.NORTH);
    add(bodyPanel, BorderLayout.SOUTH);
    pack();
}
}
4

2 に答える 2

2

..背景画像は元のサイズを失い、非常に小さくなります。

これは、コンポーネントが配置されるまで、パネルの推奨サイズが 0x0 であるためです。

これを解決するには、少なくとも 2 つの方法があります。

  1. パネルにコンテンツを追加します。
  2. getPreferredSize()イメージの を返すようにオーバーライドしDimensionます。

最初の方法が最適ですが、2 番目の方法 (少ないコード) を紹介します。

画像テスト

import java.awt.*;
import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ImageTest {

  public static void main(String[] args) {
    ImageFrame frame = new ImageFrame();
    //frame.setSize(640,480);
    frame.pack();
    frame.setVisible(true);
  }
}

class ImagePanel extends JPanel {

private Image img;

public ImagePanel(String img) {
    this(new ImageIcon(img).getImage());
}

public ImagePanel(Image img) {
    this.img = img;
}

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    // a panel IS an ImageObserver, so use it here.
    g.drawImage(img, 0, 0, this);
}

@Override
public Dimension getPreferredSize() {
    int w = img.getWidth(this);
    int h = img.getHeight(this);
    return new Dimension(w,h);
}

}

class ImageFrame extends JFrame {
public ImageFrame() {
    setLayout(new BorderLayout(2,2));
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    ImagePanel topPanel = new ImagePanel(new BufferedImage(200,20,BufferedImage.TYPE_INT_RGB));
    ImagePanel bodyPanel = new ImagePanel(new BufferedImage(200,100,BufferedImage.TYPE_INT_RGB));
    add(topPanel, BorderLayout.NORTH);
    add(bodyPanel, BorderLayout.SOUTH);
    pack();
}
}
于 2013-03-18T10:05:20.877 に答える
2

私にポップアップする多くの問題があります

  1. あなたは電話していませんsuper.paintComponent。これは非常に重要であり、過小評価することはできません
  2. ImageIO画像をロードするために実際に使用する必要があります。より広い範囲の画像フォーマットをサポートしているという事実から、また、画像を同時にロードし、何か問題が発生したときに有用な例外をスローします
  3. 値を指定していませんpreferredSize。これは、コンポーネントを最適にレイアウトする方法を決定するために、レイアウト マネージャーによって使用されます。ただし、これは単なるヒントであり、レイアウト マネージャーにはそれらを無視する権利があります。

詳細については、画像の読み取り/読み込みを参照してください。ImageIO

于 2013-03-18T08:43:02.123 に答える