代码之家  ›  专栏  ›  技术社区  ›  muffin

是否将面板与背景正确对齐?

  •  1
  • muffin  · 技术社区  · 13 年前

    几周前,我刚开始使用Java GUI,在对齐方面遇到了困难。 基本上,我正在尝试使用两个具有不同背景图像的面板(顶部栏和内容),我想将它们一个接一个地对齐。 问题是,我不能使用 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();
    }
    }
    
    2 回复  |  直到 13 年前
        1
  •  2
  •   MadProgrammer    13 年前

    我突然想到了很多问题

    1. 你没有打电话 super.paintComponent 。这一点非常重要,不容低估
    2. 你真的应该使用 ImageIO 以加载您的图像。Ala,因为它支持更广泛的图像格式,它还同时加载图像,并在出现问题时抛出有用的异常
    3. 你没有提供任何 preferredSize 价值观布局管理器使用它来决定如何最好地布局组件。不过请记住,这只是提示,布局管理器完全有权忽略它们

    退房 Reading/Loading an Image 有关的更多详细信息 后台以流

        2
  •  2
  •   Andrew Thompson    13 年前

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

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

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

    1. 将内容添加到面板中。
    2. 以(权力)否决 getPreferredSize() 返回 Dimension 图像的。

    第一个是最优的,但我将展示如何做第二个(更少的代码)。

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