我最近几周前开始使用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();
}
}
答案 0 :(得分:2)
我身上出现了许多问题
super.paintComponent
。这非常重要,不能低估ImageIO
来加载图片。 Ala支持更广泛的图像格式,它还会加载图像并发,并在出现问题时抛出有用的异常preferredSize
值。布局管理器使用它来决定如何最好地布局组件。但请记住,这只是提示,布局管理员完全有权忽略它们有关ImageIO
答案 1 :(得分:2)
..背景图片失去了原来的尺寸,变得非常小。
这是因为在放入组件之前,面板的首选大小为0x0。
至少有两种方法可以解决这个问题:
getPreferredSize()
以返回图片的Dimension
。第一个是最佳的,但我将展示如何做第二个(更少的代码)。
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();
}
}