2017-12-12 35 views
0

안녕하세요 나는 새로운 오전 자바 GUI에서 작동하지 않습니다.애니메이션의 생성자 나는 아래있는 second.java을 만들어 자바 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는 기본적으로 생성자를 호출하고 누군가가 내가 잘못된 경우 또는 일을하고 무엇을하면 어떤 화면에 애니메이션을 선보일 예정이있다 : 당신은 어떻게해야하고, GUI는 아래에 주어진 어떤 나를 인도시겠습니까 그게 끝나면 알려줘.

답변

1

먼저 paintComponent 메서드 내에서 상태를 업데이트하지 마십시오. 대부분의 경우 상호 작용없이 언제든지 페인트가 여러 가지 이유로 발생할 수 있습니다. 페인팅은 현재 상태를 단순 페인트해야합니다. ActionListener에서 프레임을 앞당기 고 프레임 값 재설정과 같은 작업을 결정해야합니다.

두 번째로 결코 실제로는 second을 아무 것도 추가하지 않으므로 결코 표시되지 않습니다. 레이아웃 관리자는 구성 요소가되어야하며, 단순히 0x0 할당됩니다 어떤 크기 아무 생각하지 않게 차이가 없습니다로

셋째, 당신은 보이지 않는 등이 좋은 만들기, secondgetPreferredSize를 오버라이드 (override)하지 않는

넷째, null 레이아웃을 사용하고 있습니다. 이것은 당신에게 삶을 엄청나게 어렵게 만들 것입니다. Swing은 레이아웃 관리자를 사용하여 설계되고 최적화되었으며 다양한 렌더링 시스템/파이프 라인에서 글꼴 메트릭의 차이를 가장 잘 처리하는 방법을 결정하는 데 중요한 역할을합니다. I 은 사용 방법을 배우는 데 시간이 걸릴 것을 권장합니다. 다섯째 그들

, 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(); 
     } 

    } 
} 

긁어 모으다. 그것은

Example

... 이미지 설정의 값을 증가하지만 나를 위해 잘 이미지

작품을 표시 할

imageArray[i]=new ImageIcon(i+1+".png"); 이미지를로드 할 수없는 경우 오류를 생성하지 않습니다 어떤 이유로 (그리고 그것은 또 다른 이슈 인 백그라운드 스레드에 이미지를로드 할 것입니다).

대신 을 사용하는 것이 좋습니다. 어떤 이유로 이미지를 읽을 수없는 경우 IOException이 표시되며, 이는 더 유용합니다. 자세한 내용은 Reading/Loading an Image을 참조하십시오.

+0

코드를 검토해 주셔서 감사합니다.하지만 추가 한 후에 변경 사항을 적용해도 작동하지 않는다고 제안했습니다. 왜 내가 작동하지 않는 다른 이유를 제안 할 수 있습니까? –

+0

여전히'null' 레이아웃을 의심합니다 – MadProgrammer

+0

절대 layout.in 프로그램을 사용했습니다. 레이아웃이 null이고 올바른 경우 어떻게 올바르게 만들 수 있습니까? –