程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Java Animate JLabel大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Java Animate JLabel?

开发过程中遇到Java Animate JLabel的问题如何解决?下面主要结合日常开发的经验,给出你关于Java Animate JLabel的解决方法建议,希望对你解决Java Animate JLabel有所启发或帮助;

15

对于Swing应用程序,线程的使用是完全错误的。你不应尝试在后台线程中添加或删除组件,而应使用Swing计时器在Swing事件线程上执行此操作。

另外,你的意思是:

我想在屏幕底部有一个滚动的JLabel

请阐明你要达到的效果。

另外,

我也了解到,我很可能将无法使用FlowLayout,因为我了解它不允许你设置组件的位置。我尝试使用Null布局,但是使用Null布局时,不会显示带有边框的空JLabel。我几乎无法辨认出边框底部的边框顶部,但是即使使用setLOCATIOn,我也无法将其显示在想要的位置。

不,在这种情况下请不要使用空布局。有更好的布局管理器,可以帮助你以更清洁,更独立于平台的方式构建应用程序。

编辑3 关于:

为了明确起见,在屏幕底部,我需要在最右上角有一个JLabel,然后在摆动计时器中,JLabel将逐渐向左移动,直到离开屏幕为止。如果我可以使setLOCATIOn正常工作,则基本前提是将变量x设置为600,然后每秒将x递减50,然后在屏幕上的新位置重新绘制JLabel。基本动画。

我将在屏幕底部创建一个JPanel,以保留你的JLabel或通过覆盖JLabel的paintComponent(…)方法来显示没有JLabel的图像。如果将其用作容器,则可以,其布局应为null,但GUI的其余部分不应使用Null布局。Swing计时器只需更改JLabel的位置,然后调用repaint()其JPanel /容器。如果走后一条路线,则可以paintComponent(…)使用JPanel的方法绘制图像,g.drawImage(myImage, x, y)计时器将更改x和/或y并调用repaint()绘制的JPanel。

另外,你可能不想在计时器中继续添加JLabel,而只是移动已经在GUI中显示的JLabel。

另外,为避免出现焦点问题,请不要使用KeyListener来捕获击键输入,而应使用键绑定。Google会指导你找到有关此结构的出色教程。

编辑4 例如:

import java.awt.color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.*;
import java.awt.image.bufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.EnumMap;

import javax.imageio.ImageIO;
import javax.swing.*;

@SuppressWarnings("serial")
public class AnimateExample extends JPanel {
   public static final String DUKE_img_PATH = 
         "https://duke.kenai.com/iconSized/duke.gif";
   private static final int PREF_W = 800;
   private static final int PREF_H = 800;
   private static final int TIMER_DELAY = 20;
   private static final String KEY_DOWN = "key down";
   private static final String KEY_RELEASE = "key release";
   public static final int TRANSLATE_SCALE = 3;
   private static final String BACKGROUND_StriNG = "Use Arrow Keys to Move Image";
   private static final Font BG_StriNG_Font = new Font(Font.SANS_serif,
         Font.bolD, 32);
   private EnumMap<Direction, Boolean> dirMap = 
         new EnumMap<AnimateExample.Direction, Boolean>(Direction.class);
   private BufferedImage image = null;
   privatE int imgX = 0;
   privatE int imgY = 0;
   privatE int bgStringX; 
   privatE int bgStringY; 

   public AnimateExample() {
      for (Direction dir : Direction.values()) {
         dirMap.put(dir, Boolean.falSE);
      }
      try {
         URL imgurl = new URL(DUKE_img_PATH);
         image = ImageIO.read(imgurl);
      } catch (MalformedURLException E) {
         e.printstacktrace();
      } catch (IOException E) {
         e.printstacktrace();
      }

      new Timer(TIMER_DELAY, new TimerListener()).start();

      // here we set up our key bindings
      int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
      inputMap inputMap = geTinputMap(condition);
      ActionMap actionMap = getActionMap();
      for (final Direction dir : Direction.values()) {

         // for the key down key stroke
         Keystroke keystroke = Keystroke.getKeystroke(dir.getKeyCode(), 0,
               falsE);
         inputMap.put(keystroke, dir.name() + KEY_DOWN);
         actionMap.put(dir.name() + KEY_DOWN, new AbstractAction() {

            @OverrIDe
            public voID actionPerformed(ActionEvent arg0) {
               dirMap.put(dir, truE);
            }
         });

         // for the key release key stroke
         keystroke = Keystroke.getKeystroke(dir.getKeyCode(), 0, truE);
         inputMap.put(keystroke, dir.name() + KEY_RELEASE);
         actionMap.put(dir.name() + KEY_RELEASE, new AbstractAction() {

            @OverrIDe
            public voID actionPerformed(ActionEvent arg0) {
               dirMap.put(dir, falsE);
            }
         });
      }

      FontMetrics FontMetrics = getFontMetrics(BG_StriNG_Font);
      int w = FontMetrics.StringWIDth(BACKGROUND_StriNG);
      int h = FontMetrics.getHeight();

      bgStringX = (PREF_W - w) / 2;
      bgStringY = (PREF_H - h) / 2;
   }

   @OverrIDe
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   @OverrIDe
   protected voID paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g;
      g.setFont(BG_StriNG_Font);
      g.setcolor(color.liGHT_GRAY);
      g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIAliASING,
            RenderingHints.VALUE_TEXT_ANTIAliAS_ON);
      g.drawString(BACKGROUND_StriNG, bgStringX, bgStringY);

      if (image != null) {
         g.drawImage(image, imgX, imgY, this);
      }
   }

   private class TimerListener implements ActionListener {
      public voID actionPerformed(java.awt.event.ActionEvent E) {
         for (Direction dir : Direction.values()) {
            if (dirMap.get(dir)) {
               imgX += dir.getX() * TRANSLATE_SCALE;
               imgY += dir.getY() * TRANSLATE_SCALE;
            }
         }
         repaint();
      };
   }

   enum Direction {
      Up(KeyEvent.VK_UP, 0, -1), Down(KeyEvent.VK_DOWN, 0, 1), left(
            KeyEvent.VK_left, -1, 0), Right(KeyEvent.VK_RIGHT, 1, 0);

      privatE int keyCode;
      privatE int x;
      privatE int y;

      private Direction(int keyCode, int x, int y) {
         this.keyCode = keyCode;
         this.x = x;
         this.y = y;
      }

      public int getKeyCode() {
         return keyCode;
      }

      public int getX() {
         return x;
      }

      public int getY() {
         return y;
      }

   }

   private static voID createAndShowGui() {
      AnimateExample mainPanel = new AnimateExample();

      JFrame frame = new JFrame("Animate Example");
      frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLOCATIOnByPlatform(true);
      frame.setVisible(true);
   }

   public static voID main(String[] args) {
      SwingUtilitIEs.invokelater(new Runnable() {
         public voID run() {
            createAndShowGui();
         }
      });
   }
}

解决方法

因此,我正在创建一个基本应用程序,我希望在屏幕底部具有一个JLabel,该JLabel从左下角开始,然后在设置的时间内将动画样式移动到右下角,并在中心放置一个静态图像。为此,我使用BorderLayout用JPanel创建了一个JFrame。有一个JLabel,其中ImageIcon已添加到BorderLayout.CENTER,而JPanel位于BorderLayout.SOUTH。我的代码然草率编写,而且远非美观,但它是:

import java.awt.borderLayout;
import java.awt.Color;
import java.awt.Dimension; 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.borderFactory;

public class GameWindow extends JPanel{

private static JLabel mainWindow,arrowLabel,arrowBox;
protected static JFrame frame;
protected static JPanel arrows;

public static int x = 600;

public GameWindow(){
    mainWindow = new JLabel("Center");
    arrowLabel = new JLabel("Moving");
    arrows = new JPanel();
    arrows.setSize(600,100);
    arrows.setLayout(null);
    arrowBox = new JLabel("");
    arrowBox.setBounds(0,150,100);
    arrowBox.setPreferredSize(new Dimension(150,100));
    arrowBox.setBorder(BorderFactory.createLineBorder(Color.black));
    arrows.add(arrowBoX);
    this.setSize(600,600);
    this.setLayout(new BorderLayout());
    this.add(mainWindow,BorderLayout.CENTER);
    this.add(arrows,BorderLayout.SOUTH);
}

public static void main(String[] args)
{
    GameWindow g = new GameWindow();
    frame = new JFrame("Sword Sword Revolution");
    frame.add(g);
    frame.setSize(600,600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

    Timer t = new Timer(1000,new ActionListener(){

        @Override
        public void actionPerformed(ActionEvent E) {
            arrows.add(arrowLabel);
            arrowLabel.setBounds(x,100,100);
            x-=50;
            arrows.repaint();
            frame.repaint();
        }

    });
    t.start();
}
}

中心JLabel中的ImageIcon看起来很好,底部带有边框的空JLabel出现,但是我无法在屏幕上显示带有箭头图像的第二个JLabel。最终,我将更改为scheduleAtFixedRate以连续移动JLabel,但是现在我什至无法将图像显示在屏幕上。

我也了解到,我很可能将无法使用FlowLayout,因为我了解它不允许您设置组件的位置。我尝试使用Null布局,但是使用Null布局时,不会显示带有边框的空JLabel。我几乎无法辨认出边框底部的边框顶部,但是即使使用setLOCATIOn,我也无法将其显示在想要的位置。

显然,我的思过程存在缺陷,因此可以提供任何帮助。

大佬总结

以上是大佬教程为你收集整理的Java Animate JLabel全部内容,希望文章能够帮你解决Java Animate JLabel所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:Java