java – JPanel的宽度和高度为0(具体情况)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – JPanel的宽度和高度为0(具体情况),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3293字,纯文字阅读大概需要5分钟。
内容图文
![java – JPanel的宽度和高度为0(具体情况)](/upload/InfoBanner/zyjiaocheng/703/dff09529a54c4d2db02c8fdc95954080.jpg)
请原谅我,如果这很难遵循,但我有一个特定的问题,我需要帮助解决.我已经做了大量的研究,我尝试了很多解决方案,但没有一个能够正常工作.
我的问题是我有一个扩展JPanel的ImagePanel类(下面的代码),这个类需要使用宽度和高度来缩放图像(我正在创建一个程序,用户可以创建自定义教程,包括图像).当我实例化这个时,我得到一个错误,说宽度和高度必须非零.我知道这是因为布局管理器尚未将ImagePanel传递给首选大小,但我不知道如何将该大小传递给面板. ImagePanel位于JPanel内部,该Jalit内部位于JFrame内JSplitPane内部的JTabbedPane内部的JPanel内部的JScrollPane内部的JSplitPane内部.递减容器顺序的图形表示如下:
> JFrame(GridLayout)
> JSplitPane(默认SplitPane布局)
> JTabbedPane(Deault JTabbedPane布局)
> JPanel(GridLayout)
> JScrollPane(默认ScrollPane布局)
> JSplitPane(默认SplitPane布局)
> JPanel(GridLayout);
> ImagePanel
ImagePanel的代码如下:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
public class ImagePanel extends JPanel{
private BufferedImage i;
private ImageIcon miniature;
private Image paint = null;
public void createImage(String path){
try {
i = ImageIO.read(new File(path));
} catch (IOException ex) {
ex.printStackTrace();
}
if(i != null){
int width = (int)((double)i.getWidth() * ((double)getWidth()/i.getWidth()));
int height = (int)((double)i.getHeight()*i.getHeight()/i.getWidth()*((double)this.getHeight()/i.getHeight()));
miniature = new ImageIcon(i.getScaledInstance(width, height, Image.SCALE_SMOOTH));
paint = miniature.getImage();
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (paint!=null){
g.drawImage(paint, 0, 0, null);}
}
}
如何获得ImagePanel的正确大小.我希望图像改变大小与JFrame的大小,这就是为什么我不只是使用setPreferedSize();.
解决方法:
至少有两种方法可以实现,第一种方法是允许paintComponent检查paint的状态,并在它为null时适当地重新缩放图像
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (i != null && paint == null){
generateScaledInstance();
}
if (paint != null) {
g.drawImage(paint, 0, 0, this);
}
}
这将起作用,因为除非组件的大小大于0并且连接到本机对等体(在屏幕上),否则永远不应该调用paintComponent.
这不是一个好主意,因为缩放可能需要一些时间,如果你可以避免它,你不想放慢绘制过程.
您可以使用附加到ImagePanel的ComponentListener并监视componentResized事件
addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
if (i != null) {
generateScaledInstance();
}
}
});
这可能会连续多次调用,所以要小心.
在这种情况下,我倾向于使用javax.swing.Timer设置为小延迟,以便将更新减少到尽可能少的调用,例如……
private Timer resizeTimer;
//...
// Probably in you classes constructor
resizeTimer = new Timer(250, new ActionListener() {
public void actionPerformed(ActionEvent evt) {
// Actually perform the resizing of the image...
generateScaledInstance();
}
});
// Don't want a repeating event...
resizeTimer.setRepeats(false);
//...
public void componentResized(ComponentEvent evt) {
resizeTimer.restart();
}
这允许在快速连续中多次调用componentResized,但如果时间间隔超过250毫秒,则可以调用generateScaledInstance,作为示例……
您还应该默认提供非0大小的preferredSize值(请记住,面板的默认首选大小是0x0).根据布局管理器的不同,这可以忽略,但通常用作大多数布局管理器的基础……
内容总结
以上是互联网集市为您收集整理的java – JPanel的宽度和高度为0(具体情况)全部内容,希望文章能够帮你解决java – JPanel的宽度和高度为0(具体情况)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。