java setvisible_java – 在已经可见的帧上调用setVisible(true...

题:

在已经可见的JFrame上调用setVisible(true)有什么作用?我正在挖掘JFrame的源代码,最终,它归结为this function in Component,如果它已经可见,它对框架没有任何作用.为什么它像revalidate();重绘();? (见下面的SSCCE)

动机:

我正在开发一个java应用程序,我为此编写了一个类JImagePanel,它扩展了JPanel并允许用户将图像设置为背景(请参阅SSCCE).我发现在编辑了面板的背景后,我遇到了将背景重新绘制为正确尺寸的问题.在浏览互联网后,我发现以下工作:

if(frame.isVisible()) frame.setVisible(true);

最终,我使用了解决了这个问题

panel.revalidate();

panel.repaint();

我认为这是更好的解决方案,但它让我思考setVisible(true)在已经可见的帧上实际做了什么.从我的观点来看,它不应该起作用 – 但事实上确实如此.

SSCCE

这是一个说明我的问题的例子.如果没有别的,希望你将来发现这个课程非常有用.

注意:此文件的更新源可以在为其创建的项目的GitHub项目主页上找到.

请享用!

package com.dberm22.utils;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.Image;

import java.awt.RenderingHints;

import java.awt.Toolkit;

import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;

import javax.swing.JFrame;

import javax.swing.JPanel;

public class JImagePanel extends JPanel {

private static final long serialVersionUID = 6841876236948317038L;

private Image img = null;

private Position position = Position.CENTER;

public enum Position{

STRETCH,

CENTER,

FIT,

FILL,

NONE;

}

public JImagePanel() {

}

public JImagePanel(String img) {

this(new ImageIcon(img).getImage());

}

public JImagePanel(Image img) {

setBackgroundImage(img);

}

@Override

public void paintComponent(Graphics g)

{

super.paintComponent(g);

Graphics2D g2 = (Graphics2D) g;

g2.setColor(getBackground());

g2.fillRect(0, 0, getWidth(), getHeight());

if (this.position.equals(Position.STRETCH))

{

if(this.img != null) g2.drawImage(img, 0, 0, getWidth(), getHeight(), null);

}

else if (this.position.equals(Position.FILL) || this.position.equals(Position.FIT))

{

if(this.img != null)

{

double scaleFactor = getScaleFactor(new Dimension(img.getWidth(null), img.getHeight(null)), getSize());

int scaleWidth = (int) Math.round(img.getWidth(null) * scaleFactor);

int scaleHeight = (int) Math.round(img.getHeight(null) * scaleFactor);

//Image img_scaled = img.getScaledInstance(scaleWidth, scaleHeight, Image.SCALE_SMOOTH);

g2.drawImage(scaleImage(img, scaleWidth, scaleHeight, getBackground()), (getWidth() - scaleWidth)/2, (getHeight() - scaleHeight)/2, scaleWidth, scaleHeight, null);

}

}

else if (this.position.equals(Position.CENTER)) { if(this.img != null) g2.drawImage(img, (getWidth() - img.getWidth(null))/2, (getHeight() - img.getHeight(null))/2, null); }

}

public void setBackgroundImage(String img)

{

setBackgroundImage(new ImageIcon(img).getImage());

}

public void setBackgroundImage(Image img)

{

this.img = img;

Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));

setPreferredSize(size);

setMinimumSize(size);

setMaximumSize(size);

setSize(size);

repaint();

}

public static double getScaleFactor(int iMasterSize, int iTargetSize) {

double dScale = 1;

if (iMasterSize > iTargetSize) {

dScale = (double) iTargetSize / (double) iMasterSize;

} else {

dScale = (double) iTargetSize / (double) iMasterSize;

}

return dScale;

}

public double getScaleFactor(Dimension original, Dimension targetSize) {

double dScale = 1d;

if (original != null && targetSize != null) {

double dScaleWidth = getScaleFactor(original.width, targetSize.width);

double dScaleHeight = getScaleFactor(original.height, targetSize.height);

if (this.position.equals(Position.FIT)) dScale = Math.min(dScaleHeight, dScaleWidth);

else if(this.position.equals(Position.FILL)) dScale = Math.max(dScaleHeight, dScaleWidth);

}

return dScale;

}

public BufferedImage scaleImage(Image img, int width, int height, Color background) {

BufferedImage newImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

Graphics2D g = newImage.createGraphics();

try {

g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,

RenderingHints.VALUE_INTERPOLATION_BICUBIC);

g.setBackground(background);

g.clearRect(0, 0, width, height);

g.drawImage(img, 0, 0, width, height, null);

} finally {

g.dispose();

}

return newImage;

}

public void setBackgroundImagePosition(String pos)

{

if("Stretch".equals(pos)) setBackgroundImagePosition(Position.STRETCH);

else if("Center".equals(pos)) setBackgroundImagePosition(Position.CENTER);

else if("Fit".equals(pos)) setBackgroundImagePosition(Position.FIT);

else if("Fill".equals(pos)) setBackgroundImagePosition(Position.FILL);

else if("None".equals(pos)) setBackgroundImagePosition(Position.NONE);

}

public void setBackgroundImagePosition(Position pos)

{

this.position = pos;

repaint();

}

public static void main(String[] args)

{

JFrame frame = new JFrame("JImagePanel Test");

frame.setSize( Toolkit.getDefaultToolkit().getScreenSize());

frame.setPreferredSize( Toolkit.getDefaultToolkit().getScreenSize());

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); //sets appropriate size for frame

JImagePanel panel = new JImagePanel();

frame.add(panel);

frame.setVisible(true);

try {Thread.sleep(2000);} catch (InterruptedException e) {}

panel.setBackgroundImage("C:\Users\David\Pictures\Wood.jpg");

panel.setBackgroundImagePosition(JImagePanel.Position.STRETCH);

panel.revalidate(); // need to revalidate()

panel.repaint(); //doesnt work by itself

try {Thread.sleep(2000);} catch (InterruptedException e) {}

panel.setBackgroundImage("C:\Users\David\Pictures\Wood.jpg");

panel.setBackgroundImagePosition(JImagePanel.Position.FIT);

frame.setVisible(true); //also works --why?

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值