背景图片随窗口大小进行缩放的问题

时间:2022-11-17 19:04:00
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.ImageIcon;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class TestJDesktopPane
{
JFrame frame;
JDesktopPane desktopPane;
JLabel backLabel;
ImageIcon  icon;
public TestJDesktopPane()
{
frame = new JFrame("主面板");
desktopPane = new JDesktopPane(); //虚拟桌面
backLabel = new JLabel(); //背景图标
icon = new ImageIcon("e:/Tulips.jpg");
frame.setBounds(0,0,800,600);
backLabel.setIcon(icon);
frame.addComponentListener(new ComponentAdapter(){ //为主面板添加窗口监听器
@Override
public void componentResized(ComponentEvent e)
{
//System.out.println(frame.getWidth());
backLabel.setSize(frame.getWidth(),frame.getHeight());
System.out.println("-----------");
System.out.println(backLabel.getWidth() + "  " +icon.getIconWidth());
}
});
desktopPane.add(backLabel,new Integer(Integer.MIN_VALUE));
frame.add(desktopPane);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);

}

public static void main(String[] args)
{
new TestJDesktopPane();
}
}


对于JLabel背景图标的问题,该添加的监听器也做了,可图片就是不能自动缩放,求解释!!!(背景重绘的不需要)

4 个解决方案

#1


JLabel是一个容器,其功能只是显示这张图片。
如果要图片尺寸改变,那么显示的本身就不是原图,而是做了修改后的图。那么就应该都这样图片的流然后按比例输出,背景重绘就是实现的这个功能,而该这功能你没添加。

#2


引用 1 楼 AA5279AA 的回复:
JLabel是一个容器,其功能只是显示这张图片。
如果要图片尺寸改变,那么显示的本身就不是原图,而是做了修改后的图。那么就应该都这样图片的流然后按比例输出,背景重绘就是实现的这个功能,而该这功能你没添加。

也就是说背景图片随窗体的伸缩,其实是图片大小的改变,我用嵌套html完成了,可java怎么改变啊!求赐教!!

#3



package org.zhangming.swing;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.ImageIcon;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class TestJDesktopPane
{
JFrame frame;
JDesktopPane desktopPane;
JLabel backLabel;
ImageIcon  icon;
Graphics g;
Image image;
public TestJDesktopPane()
{
frame = new JFrame("主面板");
desktopPane = new JDesktopPane(); //虚拟桌面
backLabel = new JLabel(); //背景图标
// icon = new ImageIcon("e:/Tulips.jpg");

frame.setBounds(0,0,800,600);
// backLabel.setIcon(icon);
frame.addComponentListener(new ComponentAdapter(){ //为主面板添加窗口监听器
@Override
public void componentResized(ComponentEvent e)
{
//
//// g = backLabel.getGraphics();
//// g.drawImage(icon.getImage(),0,0,frame.getWidth(),frame.getHeight(),frame);
backLabel.setSize(frame.getWidth(),frame.getHeight());
backLabel.setText("<html><body><image width='" + frame.getWidth() + "'height='" + frame.getHeight() + "'src='" + getClass().getResource("Tulips.jpg") + "'></img></body></html>");
// System.out.println(icon.getIconWidth());
//
}
});
desktopPane.add(backLabel,new Integer(Integer.MIN_VALUE));
frame.add(desktopPane);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);

}

public static void main(String[] args)
{
new TestJDesktopPane();
}
}

#4


看来还是得靠自己啊
分享一下我的方法(在事件监听器中的代码)

icon.setImage(icon.getImage().getScaledInstance(frame.getWidth(),frame.getHeight(),Image.SCALE_DEFAULT)); 
backLabel.setIcon(icon);
backLabel.setSize(frame.getWidth(),frame.getHeight());



#1


JLabel是一个容器,其功能只是显示这张图片。
如果要图片尺寸改变,那么显示的本身就不是原图,而是做了修改后的图。那么就应该都这样图片的流然后按比例输出,背景重绘就是实现的这个功能,而该这功能你没添加。

#2


引用 1 楼 AA5279AA 的回复:
JLabel是一个容器,其功能只是显示这张图片。
如果要图片尺寸改变,那么显示的本身就不是原图,而是做了修改后的图。那么就应该都这样图片的流然后按比例输出,背景重绘就是实现的这个功能,而该这功能你没添加。

也就是说背景图片随窗体的伸缩,其实是图片大小的改变,我用嵌套html完成了,可java怎么改变啊!求赐教!!

#3



package org.zhangming.swing;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.ImageIcon;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class TestJDesktopPane
{
JFrame frame;
JDesktopPane desktopPane;
JLabel backLabel;
ImageIcon  icon;
Graphics g;
Image image;
public TestJDesktopPane()
{
frame = new JFrame("主面板");
desktopPane = new JDesktopPane(); //虚拟桌面
backLabel = new JLabel(); //背景图标
// icon = new ImageIcon("e:/Tulips.jpg");

frame.setBounds(0,0,800,600);
// backLabel.setIcon(icon);
frame.addComponentListener(new ComponentAdapter(){ //为主面板添加窗口监听器
@Override
public void componentResized(ComponentEvent e)
{
//
//// g = backLabel.getGraphics();
//// g.drawImage(icon.getImage(),0,0,frame.getWidth(),frame.getHeight(),frame);
backLabel.setSize(frame.getWidth(),frame.getHeight());
backLabel.setText("<html><body><image width='" + frame.getWidth() + "'height='" + frame.getHeight() + "'src='" + getClass().getResource("Tulips.jpg") + "'></img></body></html>");
// System.out.println(icon.getIconWidth());
//
}
});
desktopPane.add(backLabel,new Integer(Integer.MIN_VALUE));
frame.add(desktopPane);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);

}

public static void main(String[] args)
{
new TestJDesktopPane();
}
}

#4


看来还是得靠自己啊
分享一下我的方法(在事件监听器中的代码)

icon.setImage(icon.getImage().getScaledInstance(frame.getWidth(),frame.getHeight(),Image.SCALE_DEFAULT)); 
backLabel.setIcon(icon);
backLabel.setSize(frame.getWidth(),frame.getHeight());