正确对齐面板背景?

时间:2013-03-18 07:58:04

标签: java awt panel frame

我最近几周前开始使用Java GUI,但我很难对齐。 基本上,我试图让两个面板具有不同的背景图像(顶部栏和内容),我想一个接一个地对齐它们。 问题是,我无法使用BorderLayout.NORTHBorderLayout.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();
}
}

2 个答案:

答案 0 :(得分:2)

我身上出现了许多问题

  1. 你没有打电话给super.paintComponent。这非常重要,不能低估
  2. 您确实应该使用ImageIO来加载图片。 Ala支持更广泛的图像格式,它还会加载图像并发,并在出现问题时抛出有用的异常
  3. 您没有提供任何preferredSize值。布局管理器使用它来决定如何最好地布局组件。但请记住,这只是提示,布局管理员完全有权忽略它们
  4. 有关ImageIO

    的更多详情,请查看Reading/Loading an Image

答案 1 :(得分:2)

  

..背景图片失去了原来的尺寸,变得非常小。

这是因为在放入组件之前,面板的首选大小为0x0。

至少有两种方法可以解决这个问题:

  1. 向面板添加内容。
  2. 覆盖getPreferredSize()以返回图片的Dimension
  3. 第一个是最佳的,但我将展示如何做第二个(更少的代码)。

    Image Test

    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();
    }
    }