Java 如何使用image fill BorderLayout.CENTER制作JLabel
我得到了一个JFrame并将LayoutManager设置为BorderLayout,然后继续添加带有图像的JLabel。但是,当我调整帧的大小时,JLabel不会调整大小。我没有向North、S、E等添加任何组件。我只是想让标签里的图像填满整个画面,当然,让我的菜单保持得体。请原谅我的傲慢,但我没有别的事情要做 我做了一个快速样品 查看图像周围的红线,这是Java 如何使用image fill BorderLayout.CENTER制作JLabel,java,swing,Java,Swing,我得到了一个JFrame并将LayoutManager设置为BorderLayout,然后继续添加带有图像的JLabel。但是,当我调整帧的大小时,JLabel不会调整大小。我没有向North、S、E等添加任何组件。我只是想让标签里的图像填满整个画面,当然,让我的菜单保持得体。请原谅我的傲慢,但我没有别的事情要做 我做了一个快速样品 查看图像周围的红线,这是JLabel的边框。如您所见,标签已重新调整大小以填充整个区域 这是我用来生成示例的代码 public class LayoutFram
JLabel
的边框。如您所见,标签已重新调整大小以填充整个区域
这是我用来生成示例的代码
public class LayoutFrame extends JFrame {
public LayoutFrame() throws HeadlessException {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Image image = null;
URL url = getClass().getResource("/layout/issue78.jpg");
try {
image = ImageIO.read(url);
} catch (IOException ex) {
ex.printStackTrace();
}
JLabel label = new JLabel(new ImageIcon(image));
label.setHorizontalAlignment(JLabel.CENTER);
label.setVerticalAlignment(JLabel.CENTER);
label.setBorder(new LineBorder(Color.RED, 4));
setLayout(new BorderLayout());
add(label);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
LayoutFrame frame = new LayoutFrame();
frame.setSize(200, 200);
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
});
}
}
显然,您需要提供自己的映像;)
别忘了,标签不会为您扩展内容,如果这是您的目标,您需要实现自己的组件来实现这一点
如果您仍然有问题,我建议(在没有进一步证据的情况下)您的标签可能不在您认为的容器中,或者容器布局管理器不是您认为的那样
更新
我不知道您为什么会遇到组件丢失或菜单问题。是否混合了重量重和重量轻的成分
带有菜单栏的示例
在仔细阅读您的问题之后,我设计了一个简单的调整图像窗格大小的示例。为了提高速度,我依赖于我的库,但是实现自己的代码来代替我的调用应该相当容易
public class ImagePane extends JPanel {
protected static final Object RESIZE_LOCK = new Object();
private BufferedImage image;
private BufferedImage scaledImage;
private Timer resizeTimer;
public ImagePane() {
URL url = getClass().getResource("/layout/issue78.jpg");
try {
image = ImageIO.read(url);
} catch (IOException ex) {
ex.printStackTrace();
}
resizeTimer = new Timer(250, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Simple thread factory to start a slightly lower
// priority thread.
CoreThreadFactory.getUIInstance().execute(new ResizeTask());
}
});
resizeTimer.setCoalesce(true);
resizeTimer.setRepeats(false);
}
@Override
public void setBounds(int x, int y, int width, int height) {
super.setBounds(x, y, width, height);
resizeTimer.restart();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
if (scaledImage != null) {
// This simply returns a rectangle that takes into consideration
//the containers insets
Rectangle safeBounds = UIUtilities.getSafeBounds(this);
System.out.println("scaledImage = " + scaledImage.getWidth() + "x" + scaledImage.getWidth());
int x = ((safeBounds.width - scaledImage.getWidth()) / 2) + safeBounds.x;
int y = ((safeBounds.height - scaledImage.getHeight()) / 2) + safeBounds.y;
g2d.drawImage(scaledImage, x, y, this);
}
}
protected class ResizeTask implements Runnable {
@Override
public void run() {
synchronized (RESIZE_LOCK) {
if (image != null) {
int width = getWidth();
int height = getHeight();
System.out.println("width = " + width);
System.out.println("height = " + height);
// A simple divide and conquer resize implementation
// this will scale the image so that it will fit within
// the supplied bounds
scaledImage = ImageUtilities.getScaledInstanceToFit(image, new Dimension(width, height), ImageUtilities.RenderQuality.High);
System.out.println("scaledImage = " + scaledImage.getWidth() + "x" + scaledImage.getWidth());
repaint(); // this is one of the few thread safe calls
}
}
}
}
}
最好的选择是对ImageIcon进行子类化,并覆盖其paintIcon方法,以便使用Graphics.paint(x、y、width、height…)简单地绘制图像。我希望所讨论的图像足够大,能够占用空间。请看一看,是的,图像足够大,不是一个小图标或任何东西。标签的图标不调整大小;)thanx代表样品。它的问题是它接管了一切,其他组件丢失了,比如菜单。你是对的,我的问题是标签没有调整其中的图标大小。这不应该影响你的菜单:P@trashgod不知道OP的知识水平,我不想听起来像是居高临下,但我不知道尝试了什么,所以我别无选择,只能从基础开始:可以说图标的非法实现:getIconWidth/Height被记录为返回一个指定图标固定宽度的整数-动态调整大小是不可能的…我想你最好使用某种
工厂
可以采用基线图标
并生成所需尺寸的新图标
,或者代表您绘制一个。但是,如果缩放操作相当大(例如缩小到0.1%或超过几个100%,具体取决于原始图像的大小),则您可能会“暂停”EDT。正如我的示例所示,它使用“合并”方法来调整大小请求,而不是在每个请求上调整大小,我们尝试在尽可能少的请求上调整大小,通常是在达到“空闲”状态时。但那只是MHO@madProgrammer对不起,原版q的措辞很糟糕,我不想在图标内调整图像大小。我只希望拉伸图像以填充父组件。我知道这个糟糕的措辞可能会把你的回答搞砸,但我希望它能说明我为什么要尝试我所做的。@mP好的,那么伸展运动不是调整尺寸吗?tat Evan你不在乎保持纵横比吗