먼저 paintComponent
메서드 내에서 상태를 업데이트하지 마십시오. 대부분의 경우 상호 작용없이 언제든지 페인트가 여러 가지 이유로 발생할 수 있습니다. 페인팅은 현재 상태를 단순 페인트해야합니다. ActionListener
에서 프레임을 앞당기 고 프레임 값 재설정과 같은 작업을 결정해야합니다.
두 번째로 결코 실제로는 second
을 아무 것도 추가하지 않으므로 결코 표시되지 않습니다. 레이아웃 관리자는 구성 요소가되어야하며, 단순히 0x0
할당됩니다 어떤 크기 아무 생각하지 않게 차이가 없습니다로
셋째, 당신은 보이지 않는 등이 좋은 만들기, second
에 getPreferredSize
를 오버라이드 (override)하지 않는
넷째, null
레이아웃을 사용하고 있습니다. 이것은 당신에게 삶을 엄청나게 어렵게 만들 것입니다. Swing은 레이아웃 관리자를 사용하여 설계되고 최적화되었으며 다양한 렌더링 시스템/파이프 라인에서 글꼴 메트릭의 차이를 가장 잘 처리하는 방법을 결정하는 데 중요한 역할을합니다. I 은 사용 방법을 배우는 데 시간이 걸릴 것을 권장합니다. 다섯째 그들
, 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");
이미지를로드 할 수없는 경우 오류를 생성하지 않습니다 어떤 이유로 (그리고 그것은 또 다른 이슈 인 백그라운드 스레드에 이미지를로드 할 것입니다).
대신 을 사용하는 것이 좋습니다. 어떤 이유로 이미지를 읽을 수없는 경우 IOException
이 표시되며, 이는 더 유용합니다. 자세한 내용은 Reading/Loading an Image을 참조하십시오.
코드를 검토해 주셔서 감사합니다.하지만 추가 한 후에 변경 사항을 적용해도 작동하지 않는다고 제안했습니다. 왜 내가 작동하지 않는 다른 이유를 제안 할 수 있습니까? –
여전히'null' 레이아웃을 의심합니다 – MadProgrammer
절대 layout.in 프로그램을 사용했습니다. 레이아웃이 null이고 올바른 경우 어떻게 올바르게 만들 수 있습니까? –