【问题标题】:Animation Constructor not working in Java GUI动画构造函数在 Java GUI 中不起作用
【发布时间】:2017-12-12 20:59:49
【问题描述】:

您好,我是 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:

   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 必须基本上调用构造函数,它将在屏幕上展示动画如果有人我做错了什么或必须做的事情,请告诉我。

【问题讨论】:

    标签: java swing timer jframe paintcomponent


    【解决方案1】:

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

    其次,您实际上从未将second 添加到任何内容中,因此它永远不会显示。

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

    第四,您正在使用null 布局。这会让你的生活变得无比艰难。 Swing 围绕布局管理器的使用进行了设计和优化,它们在决定如何最好地处理不同渲染系统/管道中字体指标的差异方面发挥了重要作用,我强烈建议您花时间学习如何使用它们

    第五,paintComponentpublic没有业务关系,任何人都不应该直接调用它

    示例

    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,这非常有用。详情请见Reading/Loading an Image

    【讨论】:

    • 感谢您浏览代码,但在添加之后以及您建议的更改后它不起作用。你能建议我其他一些为什么它不起作用
    • 我仍然怀疑null 布局
    • 我使用了绝对 layout.in 程序但是如果布局为空并且如果你是正确的,我怎样才能让它正确你能帮我吗?
    • Laying out components in a container 可能是一个不错的起点
    • 您的代码也不起作用。它增加图像集的值但不显示图像
    猜你喜欢
    • 2015-06-14
    • 2015-05-31
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多