当前位置: 首页 > 知识库问答 >
问题:

创建一个可以持续更新变量的java方法

董意蕴
2023-03-14
    import java.awt.FlowLayout;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;

    public class GFXScreen extends JFrame
    {
        /**
         * @param screenHeigth 
         * @param screenHeigth 
         * @param The file name of the image. Make sure to include the extension type also
         * @param The title at the top of the running screen
         * @param The height of the screen
         * @param The width of the screen
         */
        public GFXScreen(String fileName, String screenTitle, int screenHeight, int screenWidth)
        {
            setLayout(new FlowLayout());

            image1 = new ImageIcon(getClass().getResource(fileName));
            label1 = new JLabel(image1);
            this.add(label1);

            //Set up JFrame
            this.setDefaultCloseOperation(EXIT_ON_CLOSE);
            this.setVisible(true);
            this.setTitle(screenTitle);
            this.setSize(screenWidth, screenHeight);

        }

        /**
         * @param desired amount to move picture
         */
        public void updatePic(int increment)
        {
            //update pos
            label1.setBounds(label1.bounds().x, label1.bounds().y - increment, 
                    label1.bounds().width, label1.bounds().height);
        }

        private ImageIcon image1;
        private JLabel label1;
    }
public class MainClass implements Runnable {

    public static void main(String[] args) 
    {
        (new Thread(new MainClass())).start();
        GFXScreen gfx = new GFXScreen("pixel_man.png", "pixel_Man", 1000, 1000);

    }

    public void run()
    {
        gfx.updatePic(1);
    }

}

共有1个答案

令狐灿
2023-03-14

建议:

  • 同样,一个Swing计时器对于简单的Swing动画或简单的游戏循环很有效。对于复杂或严格的驯服循环来说,它可能不是最好的选择,因为它的时间不精确。
  • 大多数游戏循环都不是绝对精确的时间片
  • 因此,您的游戏模型应该考虑到这一点,并且应该注意到绝对时间片,并在其物理引擎或动画中使用这些信息。
  • 如果必须使用后台线程,请注意大多数Swing调用都是在Swing事件线程上进行的。否则,将招致有害的、罕见的和难以调试的程序结束异常。有关这方面的更多详细信息,请阅读Swing中的并发性。
  • 我避免使用空布局,除非是在动画组件时,因为这将允许我的动画引擎绝对放置组件。
  • 在这里发布代码供我们测试时,最好避免使用本地映像的代码。要么让代码使用所有人都可以轻松获得的图像作为URL,要么在代码中创建自己的图像(请参见下面的简单示例)。
  • 编译器应该向您抱怨使用了不推荐的方法,例如bound(...),更重要的是,您应该注意这些抱怨,因为它们是有原因的,并建议使用它们会增加风险和危险。所以不要使用这些方法,而是检查Java API以寻找更好的替代品。
  • 只是我个人的一个小问题--请指出你至少读过我们的评论。没有人喜欢付出努力和考虑试图帮助,结果却被忽视。因为这个我差点没发这个答案。

例如:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;

import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

@SuppressWarnings("serial")
public class GfxPanel extends JPanel {

   private static final int BI_WIDTH = 26;
   private static final int BI_HEIGHT = BI_WIDTH;
   private static final int GAP = 6;
   private static final Point INITIAL_LOCATION = new Point(0, 0);
   private static final int TIMER_DELAY = 40;
   public static final int STEP = 1;
   private ImageIcon image1;
   private JLabel label1;
   private Point labelLocation = INITIAL_LOCATION;
   private int prefW;
   private int prefH;
   private Timer timer;

   public GfxPanel(int width, int height) {
      // the only time I use null layouts is for component animation.
      setLayout(null);
      this.prefW = width;
      this.prefH = height;

      // My program creates its image so you can run it without an image file
      image1 = new ImageIcon(createMyImage());
      label1 = new JLabel(image1);
      label1.setSize(label1.getPreferredSize());
      label1.setLocation(labelLocation);
      this.add(label1);
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(prefW, prefH);
   }

   public void startAnimation() {
      if (timer != null && timer.isRunning()) {
         timer.stop();
      }
      labelLocation = INITIAL_LOCATION;
      timer = new Timer(TIMER_DELAY, new TimerListener());
      timer.start();
   }

   // My program creates its image so you can run it without an image file
   private Image createMyImage() {
      BufferedImage bi = new BufferedImage(BI_WIDTH, BI_HEIGHT,
            BufferedImage.TYPE_INT_ARGB);
      Graphics2D g2 = bi.createGraphics();
      g2.setColor(Color.red);
      g2.fillRect(0, 0, BI_WIDTH, BI_HEIGHT);
      g2.setColor(Color.blue);
      int x = GAP;
      int y = x;
      int width = BI_WIDTH - 2 * GAP;
      int height = BI_HEIGHT - 2 * GAP;
      g2.fillRect(x, y, width, height);
      g2.dispose();
      return bi;
   }

   private class TimerListener implements ActionListener {
      @Override
      public void actionPerformed(ActionEvent e) {
         int x = labelLocation.x + STEP;
         int y = labelLocation.y + STEP;
         labelLocation = new Point(x, y);
         label1.setLocation(labelLocation);
         repaint();

         if (x + BI_WIDTH > getWidth() || y + BI_HEIGHT > getHeight()) {
            System.out.println("Stopping Timer");
            ((Timer) e.getSource()).stop();
         }
      }
   }

   private static void createAndShowGui() {
      final GfxPanel gfxPanel = new GfxPanel(900, 750);

      JButton button = new JButton(new AbstractAction("Animate") {

         @Override
         public void actionPerformed(ActionEvent arg0) {
            gfxPanel.startAnimation();
         }
      });
      JPanel buttonPanel = new JPanel();
      buttonPanel.add(button);

      JFrame frame = new JFrame("GFXScreen");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(gfxPanel);
      frame.getContentPane().add(buttonPanel, BorderLayout.PAGE_END);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }

}
 类似资料:
  • 我有一个国家和年份级别的面板数据集,我想根据现有的变量创建两个新变量。 我想做的是创建两个新变量集:(1)每年(跨国家)平均值的变量集和(2)国家/地区值相对于年平均值的变量集。例如,对于 var1(1) 将产生 mean_var1 和 (2) relmean_var1我希望这些变量用于所有其他变量。总的来说,数据集中有超过1000个变量,但我只将此函数应用于大约6个。 我有适用于第一部分的代码,

  • 问题内容: 众所周知,Java 是不可变的。自从成立以来,不可变字符串是Java的重要补充。不变性允许快速访问和大量优化,与C风格的字符串相比,不易出错,并有助于加强安全性模型。 无需使用骇客就可以创建一个可变的对象,即 引导类加载器中的类 JNI(或JNA,因为它需要JNI) 但是有可能仅使用普通Java,以便可以随时修改字符串吗?问题是 如何 ? 问题答案: 使用Charset构造函数创建一个

  • 我是一个新手程序员,非常新手… 我试图写一个程序来测试我们的网站,并正在使用Java和Selenium。 问题是我想创建一个“表”或“引用”,允许我存储变量,这些变量可以很容易地被回调并在不同的调用中使用。 我尝试使用HashMap但发现它不好,因为当我重新运行测试代码时,每次都有一个新的HashMap。我想要一些东西,可以存储值,并记住他们,当我下一次运行代码。 我研究了如何创建一个mysql表

  • 有没有一种方法让JSF支持bean导致页面上组件的更新?我不希望使用带有update属性的ajax组件来更新页面上的组件。我需要从JSF backing bean方法中触发更新。注页面上的更新可能发生在此方法完成之后或完成之前。我正在使用PrimeFaces,如果使用PrimeFaces有一个解决方案的话。

  • 问题内容: 例如,假设我想“提取” 为三个单独的变量,例如: 我该怎么做,而忽略了 “为什么要这么做呢?” 您可能会被问到这个问题。 之前已经多次问过类似的问题,但是从未给出真正的答案,因为OP真正需要的是使用不同的方法。很好,但这有可能吗? 我看过反射,似乎没有任何方法可以使我甚至向实例添加额外的字段,更不用说动态创建本地了。 问题答案: 是否可以在Java运行时创建变量? 简单回答是不。 Ja

  • 我想以编程方式创建一个带有两个新变量属性的变量产品(“父”产品)——所有这些都来自WordPress插件(因此没有对API的HTTP请求)。 这两个变量属性也应该动态创建。 这怎么能做到呢? (适用于WooCommerce第3版) 更新:我已经写了更多我希望的代码,并尝试了很多方法来解决它,使用wooCommerce对象,并使用WordPress数据库对象在数据库中添加了关于术语、termmeta