繁体   English   中英

动画构造函数无法在Java GUI中使用

[英]Animation Constructor not working in Java GUI

您好,我是Java GUI的新手,我创建了second.java,如下所示:

package theproject;
import java.awt.event.*;
import java.awt.*;

import javax.swing.*;

public class second extends JPanel implements ActionListener {
private Timer animator;
private ImageIcon imageArray[];
private int delay=50, totalFrames=8, currentFreames=1;

public second()
{
  imageArray= new ImageIcon[totalFrames];
  System.out.println(imageArray.length);
  for(int i=0; i<imageArray.length;i++)
  {
      imageArray[i]=new ImageIcon(i+1+".png");
      System.out.println(i+1);

  }
  animator= new Timer(delay, this);
  animator.start();

   }

  public void paintComponent(Graphics g )
  {
  super.paintComponent(g);
   if(currentFreames<8)
   {

  imageArray[currentFreames].paintIcon(this, g, 0, 0);
  currentFreames++;
  System.out.println(currentFreames);
}
else{
    currentFreames=0;
}
  }

@Override
public void actionPerformed(ActionEvent arg0) {

    repaint();
}

 }

一个Gui调用构造函数,然后输出的Gui没有显示。 您能指导我该怎么办,GUI如下:

   package theproject;

 import java.awt.EventQueue;

 import javax.swing.JFrame;
 import javax.swing.JButton;
 import java.awt.BorderLayout;
 import java.awt.event.ActionListener;
 import java.awt.event.ActionEvent;
 import javax.swing.SwingConstants;
 import javax.swing.JTextField;

  public class Sav {

private JFrame frame;
private JTextField textField;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Sav window = new Sav();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public Sav() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 450, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);

    textField = new JTextField();
    textField.setBounds(10, 0, 261, 20);
    frame.getContentPane().add(textField);
    textField.setColumns(10);

    JButton btnNewButton = new JButton("Submit");
    btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
        second s= new second();
         frame.add(s);
        }
    });
    btnNewButton.setBounds(273, -1, 89, 23);
    frame.getContentPane().add(btnNewButton);

}
}

该gui必须基本上调用构造器,并且该构造器将在屏幕上展示动画。如果有人我做错了或者需要做些什么,请告诉我。

首先,不要在paintComponent方法中更新状态,绘制可能会由于多种原因而随时发生,大多数情况下是无需您进行交互的。 绘画应该简单地绘制当前状态。 ActionListener ,您应该前进框架并决定应该发生的情况(例如重置框架值)

其次,您永远不会在任何东西上添加second ,因此它永远不会显示。

第三,您不会在second重写getPreferredSize ,因此布局管理器将不知道组件的大小,而只是将其分配为0x0 ,使其与不可见一样好,没有区别

第四,您正在使用null布局。 这将使您的生活变得异常艰难。 Swing是根据布局管理器的使用进行设计和优化的,它们在确定如何最好地处理不同渲染系统/管道之间的字体指标差异方面做着重要的工作,我强烈建议您花时间学习如何使用它们

第五, paintComponent没有public业务,没有人可以直接调用它

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Timer;

public class Sav {

    private JFrame frame;
    private JTextField textField;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Sav window = new Sav();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public Sav() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridwidth = GridBagConstraints.REMAINDER;

        textField = new JTextField(20);
        frame.getContentPane().add(textField, gbc);

        JButton btnNewButton = new JButton("Submit");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                second s = new second();
                frame.add(s, gbc);
                frame.getContentPane().revalidate();
                frame.pack();
                frame.setLocationRelativeTo(null);
            }
        });
        frame.getContentPane().add(btnNewButton, gbc);

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public class second extends JPanel implements ActionListener {

        private Timer animator;
        private ImageIcon imageArray[];
        private int delay = 50, totalFrames = 8, currentFreames = 1;

        public second() {
            imageArray = new ImageIcon[totalFrames];
            for (int i = 0; i < imageArray.length; i++) {
                imageArray[i] = new ImageIcon(getImage(i));

            }
            animator = new Timer(delay, this);
            animator.start();

        }

        protected Image getImage(int index) {
            BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2d = img.createGraphics();
            FontMetrics fm = g2d.getFontMetrics();
            g2d.dispose();
            String text = Integer.toString(index);
            int height = fm.getHeight();
            int width = fm.stringWidth(text);

            img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
            g2d = img.createGraphics();
            g2d.setColor(getForeground());
            g2d.drawString(text, 0, fm.getAscent());
            g2d.dispose();
            return img;
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(imageArray[0].getIconWidth(), imageArray[1].getIconHeight());
        }

        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            imageArray[currentFreames].paintIcon(this, g, 0, 0);
        }

        @Override
        public void actionPerformed(ActionEvent arg0) {
            currentFreames++;
            if (currentFreames >= imageArray.length) {
                currentFreames = 0;
            }
            repaint();
        }

    }
}

您的代码也不起作用。 它增加图像集的值,但不显示图像

对我来说效果很好...

例

imageArray[i]=new ImageIcon(i+1+".png"); 如果由于某种原因而无法加载图像,则不会生成任何错误(并且它将在后台线程中加载图像,这是另一个问题)。

相反,我建议改用ImageIO.read ,如果由于某种原因无法读取图像,它将抛出IOException ,这将更加有用。 有关更多详细信息,请参见读取/加载图像

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM