Java 调整图像大小窗口上的图标调整大小
这件事困扰了我一段时间,但我似乎不知道我做错了什么。因此,我设置了一个带有图像图标的窗格的背景,但当我调整窗口大小时,它会使背景保持相同的大小,并且在暴露的边缘周围有一个巨大的白色墙,我想随着窗口的变化拉伸背景 这是我的相关代码Java 调整图像大小窗口上的图标调整大小,java,swing,paintcomponent,imageicon,Java,Swing,Paintcomponent,Imageicon,这件事困扰了我一段时间,但我似乎不知道我做错了什么。因此,我设置了一个带有图像图标的窗格的背景,但当我调整窗口大小时,它会使背景保持相同的大小,并且在暴露的边缘周围有一个巨大的白色墙,我想随着窗口的变化拉伸背景 这是我的相关代码 protected JPanel createRightPane() { final ImageIcon BGiconSM = ScaledImageIcon("parchmentTall.jpg", "BG Plate", initalWidt
protected JPanel createRightPane() {
final ImageIcon BGiconSM = ScaledImageIcon("parchmentTall.jpg", "BG Plate", initalWidth/2, initalHeight);
final ImageIcon iconSM = ScaledImageIcon("titlebar.png", "Title Bar BG", (initalWidth/3), 40);
//TODO Parchment image resize
final JPanel content = new JPanel(new GridBagLayout());
content.setOpaque(false);
final JPanel panel = new JPanel(new BorderLayout()) {
protected void paintComponent(Graphics g)
{
// Dispaly image at full size
Image BGicon = BGiconSM.getImage();
g.drawImage(BGicon, 0, 0, null);
super.paintComponent(g);
}
};
panel.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e){
Rectangle r = frame.getBounds();
int h = r.height;
int w = r.width;
if (h >= initalHeight){h = initalHeight-30;}
//System.out.println(h);
//System.out.println(w);
/* protected paintComponent(Graphics g)
{
// Dispaly image at full size
Image BGicon = BGiconSM.getImage();
g.drawImage(BGicon, 0, 0, null);
super.paintComponent(g);
}
*/
}
});
问题是,为什么要(调整大小)?您只告诉
图形
上下文它应该在组件的左上角(0x0)绘制图像
你应该看一看
您还应该看看:
super.paintComponent
当重写一个容器,如<代码> jPuth<代码>或<代码> jCube >为自定义绘制的目的时,您还应该考虑重写<代码> GETAPYRESD Stime方法,这将为布局管理器提供将组件大小调整为适当默认大小的方法,而不是使用通常为默认大小的
0x0
。问题是,为什么要(调整大小)?您只告诉图形
上下文它应该在组件的左上角(0x0)绘制图像
你应该看一看
您还应该看看:
super.paintComponent
当重写一个容器,如<代码> jPuth<代码>或<代码> jCube >为自定义绘制的目的时,您还应该考虑重写<代码> GETAPYRESD Stime方法,这将为布局管理器提供将组件大小设置为适当默认大小的方法,而不是使用通常为默认大小的
0x0
。您可以将侦听器添加到面板中
有一个按钮上的解决方案,但你可以很容易地更换这些组件
(复制/粘贴)
那么如何测量纽扣的尺寸呢
final JPanel panel = new JPanel(); //create it on your custom way...
panel.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e){
int w = b.getWidth();
int h = b.getHeight();
setIconSize(w,h); //TODO by yourself (sorry, if more help required please say so)
}
});
您可以使用以下代码简单地缩放图像:
/**
* Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
* Resizes an image using a Graphics2D object backed by a BufferedImage.
* @param srcImg - source image to scale
* @param w - desired width
* @param h - desired height
* @return - the new resized image
*/
private Image getScaledImage(Image srcImg, int w, int h){
BufferedImage resizedImg = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = resizedImg.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2.drawImage(srcImg, 0, 0, w, h, null);
g2.dispose();
return resizedImg;
}
您可以将侦听器添加到面板 有一个按钮上的解决方案,但你可以很容易地更换这些组件 (复制/粘贴) 那么如何测量纽扣的尺寸呢
final JPanel panel = new JPanel(); //create it on your custom way...
panel.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e){
int w = b.getWidth();
int h = b.getHeight();
setIconSize(w,h); //TODO by yourself (sorry, if more help required please say so)
}
});
您可以使用以下代码简单地缩放图像:
/**
* Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
* Resizes an image using a Graphics2D object backed by a BufferedImage.
* @param srcImg - source image to scale
* @param w - desired width
* @param h - desired height
* @return - the new resized image
*/
private Image getScaledImage(Image srcImg, int w, int h){
BufferedImage resizedImg = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = resizedImg.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2.drawImage(srcImg, 0, 0, w, h, null);
g2.dispose();
return resizedImg;
}
哇-我一直对你的回答速度和准确度印象深刻!我添加解决方案只是为了演示如何添加componentListener@MartinFrank我认为这家伙在Stack Overflow有一个联谊会,在其他人得到问题前30分钟向他提问。对这种奇怪行为的唯一解释:-哈哈-我很高兴我不是唯一一个意识到^^^。。。但真的-我很高兴这里有如此雄心勃勃的人@疯狂的程序员当你做你喜欢的事情时,你怎么会感到无聊呢@peeskillet这是因为我在一家公司工作,他毫不犹豫地忽略了30多年来的用户界面设计原则和心理学、用户体验指导原则以及几乎所有主要的软件开发范例……过了一段时间,你就有点恼火了……哇——我总是对你能够回答的速度和准确度印象深刻!我添加解决方案只是为了演示如何添加componentListener@MartinFrank我认为这家伙在Stack Overflow有一个联谊会,在其他人得到问题前30分钟向他提问。对这种奇怪行为的唯一解释:-哈哈-我很高兴我不是唯一一个意识到^^^。。。但真的-我很高兴这里有如此雄心勃勃的人@疯狂的程序员当你做你喜欢的事情时,你怎么会感到无聊呢@peeskillet那是因为我在一家公司工作,他毫不犹豫地忽略了30多年的用户界面设计原则和心理学,用户体验指南和几乎所有主要的软件开发范例……过了一段时间后,您会感到有些困惑……这个解决方案唯一的问题是组件重新发布了,可能会连续多次调用,调整大小不会太费力。我可能会考虑有一个“低质量”的图像,它可以快速调整大小并绘制,并有一个Swing <代码>定时器< /Case>安装(设置为125-250毫秒),每次重新启动“代码>组件大小,这意味着在最后一次调用<代码> 125毫秒之后,组件大小< /代码>我可以执行“质量”。一步调整大小并重新绘制组件-但这只是我;)感谢Martin让我走上了正确的道路,最后我对它进行了修补,并使它90%正常工作,除了一件事,我可以找到大小并将其设置为图像,但当我试图调用resize组件内的paint组件时,它断开了Eclise,这在cury括号上给了我一个错误,意味着它无法重新识别子函数的结尾,意味着我的函数调用中一定有错误,将使用代码更新OP。我很高兴我能提供帮助,但也许你有时会考虑看看那些来自McDealther-Studio的提示——这真的值得考虑^ ^但是对我来说,我很高兴能帮你一点忙,祝你的项目好运!!!我确实看了提示,问题不在于代码,因为它是我初始图像绘制的复制粘贴,我很确定这是一个语法错误,一个放错了位置的simicolor或parem,但不确定是哪个,因为我知道实际的可执行代码可以工作,我只是看不到语法错误。这个解决方案唯一的问题是
componentreised
可能会被快速连续调用多次,调整大小不太容易