加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 使用JLabels更新图像的正确方法

发布时间:2020-12-15 07:36:34 所属栏目:Java 来源:网络整理
导读:我正在创建一个GUI,并且是一个相当新的摇摆和awt.我正在尝试创建一个gui,在启动时,将背景设置为图像,然后使用方法创建各种幻灯片.我已经尝试过了,而且我没有附加到代码中,所以我能够同时修改和/或全新的概念. 编辑(2013年9月15日):我在幻灯片中遇到问题,似
我正在创建一个GUI,并且是一个相当新的摇摆和awt.我正在尝试创建一个gui,在启动时,将背景设置为图像,然后使用方法创建各种幻灯片.我已经尝试过了,而且我没有附加到代码中,所以我能够同时修改和/或全新的概念.

编辑(2013年9月15日):我在幻灯片中遇到问题,似乎无法让它发挥作用.

这是我目前的代码.

public class MainFrame extends JFrame{

JLabel backgroundL = null;
private JLabel bakckgroundL;
BufferedImage backimg;
Boolean busy;
double width;
double height;

public MainFrame() throws IOException {
    initMainframe();
}



public void initMainframe() throws IOException { 

//misc setup code,loads a default jpg as background

    setTitle("Pemin's Aura");
    busy = true;
    String backgroundDir = "resources/frame/background.jpg";

    backimg = ImageIO.read(new File(backgroundDir));
    backgroundL = new JLabel(new ImageIcon(backimg));
setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
    refreshframe();
    setVisible(true);
    busy = false;
}
public void adjSize() { // the attempted start of a fullscreen mode
        GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(this);
    width = this.getWidth();
    height = this.getHeight();
    setVisible(true);
}

public void setmastheadText() {//unfinished code
busy = true;

busy = false;
}
public void setbackground() {
    add(backgroundL);
}
public void refreshframe() { //should refresh image?
    setSize(2049,2049);
    setSize(2048,2048);
}
public void loadingscreen() throws IOException,InterruptedException {

 //this is the code in question that is faulty.

    if (busy == false) {
    busy = true;

    String backgroundDir1 = "resources/frame/background.jpg";
    String backgroundDir2 = "resources/frame/scr1.jpg";
    String backgroundDir3 = "resources/frame/scr2.jpg";

    BufferedImage backimg1 = ImageIO.read(new File(backgroundDir1));
    BufferedImage backimg2 = ImageIO.read(new File(backgroundDir2));
    BufferedImage backimg3 = ImageIO.read(new File(backgroundDir3));

    backgroundL = new JLabel(new ImageIcon(backimg1));
    Thread.sleep(2000);
    setbackground();
    setVisible(true);
    backgroundL = new JLabel(new ImageIcon(backimg2));
    setbackground();
    setVisible(true);
    Thread.sleep(2000);
    bakckgroundL = new JLabel(new ImageIcon(backimg3));
    setbackground();
    setVisible(true);

    if(backimg != null) {
         backgroundL = new JLabel(new ImageIcon(backimg));;
        }
    }
    busy = false;
}//end of loading screen

解决方法

有关使用基于Swing的 Timer显示图像的工作示例,请参阅 ImageViewer.

另见How to use Swing Timers.

虽然我在这里,另一个(更漂亮)动画图像的例子.它使用了墨卡托土地质量图.图像可以水平平铺,因此可以根据需要向左/向右滚动.

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;
import javax.swing.*;

import java.net.URL;
import javax.imageio.ImageIO;

public class WorldView {

    public static void main(String[] args) throws Exception {
        URL url = new URL("http://i.stack.imgur.com/P59NF.png");
        final BufferedImage bi = ImageIO.read(url);
        Runnable r = new Runnable() {

            @Override
            public void run() {
                int width = 640;
                int height = 316;
                Graphics2D g = bi.createGraphics();

                float[] floats = new float[]{0f,.4f,.55f,1f};
                Color[] colors = new Color[]{
                    new Color(20,20,0),new Color(0,10,41),207),230),};
                final LinearGradientPaint gp2 = new LinearGradientPaint(
                        new Point2D.Double(320f,0f),new Point2D.Double(0f,floats,colors,MultipleGradientPaint.CycleMethod.REFLECT);

                final BufferedImage canvas = new BufferedImage(
                        bi.getWidth(),bi.getHeight() + 60,BufferedImage.TYPE_INT_RGB);

                final JLabel animationLabel = new JLabel(new ImageIcon(canvas));
                ActionListener animator = new ActionListener() {

                    int x = 0;
                    int y = 30;

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        Graphics2D g = canvas.createGraphics();
                        g.setColor(new Color(55,75,125));

                        g.fillRect(0,canvas.getWidth(),canvas.getHeight());

                        int offset = (x % bi.getWidth());
                        g.drawImage(bi,offset,y,null);
                        g.drawImage(bi,offset - bi.getWidth(),null);

                        g.setPaint(gp2);
                        g.fillRect(0,canvas.getHeight());

                        g.dispose();

                        animationLabel.repaint();

                        x++;
                    }
                };
                Timer timer = new Timer(40,animator);
                timer.start();
                JOptionPane.showMessageDialog(null,animationLabel);
                timer.stop();
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
        SwingUtilities.invokeLater(r);
    }
}

这是添加了赤道的图像的一个版本(它是图像中心的“南”44像素).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读