2013-11-15 1 views
0

메신저가 멈췄다. 화살표 키를 클릭 할 때 사진이로드되지 않는다. 첫 번째 사진 만 나타납니다. 그리고 더 이상 아무것도 일어나지 않습니다. 나는 화살표 키를 클릭하여 내 폴더에서 사진을 변경할 수 있기를 원합니다. 여기에 코드가 있습니다.화살표 키를 클릭했을 때 사진이 상쾌하지 않음

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.io.File; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 


class MyPanel extends JPanel implements KeyListener { 
//public Image [] walkable; 

    public Image walkable; 
    int i = 0; 
    public char c = 'e'; 
    public String p = "no"; 
    public ImageIcon icon; 
//for (int s=0;s<3;s++){ 
// ImageIcon p[s] = ImageIcon("002.jpg"); 
// } 
//ImageIcon icon = new ImageIcon(p); 

//ImageIcon icon = ImageIcon("001.jpg"); 
    //ImageIcon icon = new ImageIcon(); 
    public MyPanel() { 
     this.setPreferredSize(new Dimension(500, 500)); 

     String path = "."; 
     String files; 
     File folder = new File(path); 
     File[] listOfFiles = folder.listFiles(); 

     if (i < listOfFiles.length) { 
      if (listOfFiles[i].isFile()) { 
       files = listOfFiles[i].getName(); 
       if (files.endsWith(".jpg") || files.endsWith(".JPG") || files.endsWith(".png") || files.endsWith(".PNG")) { 
        ImageIcon icon = new ImageIcon(files); 
        walkable = icon.getImage(); 
     // return icon; 
       } 
      } 
     } 
     addKeyListener(this); 
    } 

    public void addNotify() { 
     super.addNotify(); 
     requestFocus(); 
    } 

    public void paintComponent(Graphics g) { 
    //g.clearRect(0, 0, getWidth(), getHeight()); 
     //g.drawString("the key that pressed is " + c, 250, 250); 
     //g.drawString("the key that pressed is " + p, 400, 250); 
     g.drawImage(walkable, 0, 0, this); 
    } 

    public void keyTyped(KeyEvent e) { 
    } 

    public void keyReleased(KeyEvent e) { 
    } 

    public void keyPressed(KeyEvent e) { 
     c = e.getKeyChar(); 

     int keyCode = e.getKeyCode(); 
     switch (keyCode) { 
      case KeyEvent.VK_UP: 
       // handle up 
       break; 
      case KeyEvent.VK_DOWN: 
       // handle down 
       break; 
      case KeyEvent.VK_LEFT: 
       i = i - 1; 
       //walkable = icon.getImage(); 
       break; 
      case KeyEvent.VK_RIGHT: 
       i = i + 1; 
       //walkable = icon.getImage(); 
       break; 

     } 
     repaint(); 
    } 

    public static void main(String[] s) { 

     JFrame f = new JFrame(); 
     f.getContentPane().add(new MyPanel()); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.pack(); 
     f.setVisible(true); 
    } 
} 
+1

당신이 paintComponent' 정말'공개 할 필요가 없다'super.paintComponent' 최초의'호출하고 있는지 확인합니다 ...이 올를 통해하는 방법에 대한 제안 특히 Concurrency in SwingSwingWorker를 살펴 보자 ' – MadProgrammer

답변

2

당신은 i의 상태를 변경하고 있지만, 그것으로 아무것도하지 않는, walkable 나는 또한 이상 Key Bindings를 사용하는 것이 좋습니다

...이 생성자에서로드 된 경우에서 절대 변경 KeyListener로는 KeyListener

이 권장 업데이트 수행하는 것과 같은 초점 문제에서 고통을하지 않습니다

먼저, 유효한 이미지 파일 만 목록에 존재하도록 파일 목록을 필터링합니다. File#listFiles(FileFilter)을보고 파일 목록이 생성 될 때 필터를 적용 할 수 있습니다.

두 번째로 클래스에 사용할 수있는 파일 목록을 인스턴스 변수로 만들면 필요할 때 액세스 할 수 있습니다.

셋째, ImageIO.read을 사용하여 이미지를 읽습니다. 다양한 파일 형식을 지원하고 이미지를 즉시로드하고 무언가가 잘못되었을 때 IOException을 던졌습니다. 대신에 ImageIcon처럼 자동으로 실패합니다. 자세한 내용은 http://docs.oracle.com/javase/tutorial/2d/images/loadimage.html을 참조하십시오.

다음은 언급 된 아이디어의 아주 간단한 예입니다. Event Dispatching Thread 컨텍스트 내에서 이미지를로드하므로 큰 이미지의 경우 프로그램이 멈추게됩니다.

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import java.io.File; 
import java.io.FileFilter; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.AbstractAction; 
import javax.swing.ActionMap; 
import javax.swing.InputMap; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class ImageWalker extends JPanel { 

    public static void main(String[] args) { 
     new ImageWalker(); 
    } 

    public ImageWalker() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new MyPanel()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class MyPanel extends JPanel { 

     public Image walkable; 
     private int i = 0; 
     private File[] listOfFiles; 

     public MyPanel() { 

      String path = "."; 
      File folder = new File(path); 
      listOfFiles = folder.listFiles(new FileFilter() { 
       @Override 
       public boolean accept(File pathname) { 
        String name = pathname.getName().toLowerCase(); 
        return name.endsWith("png") || name.endsWith("jpg"); 
       } 
      }); 

      if (listOfFiles != null && listOfFiles.length > 0) { 
       loadCurrent(); 
      } 

      InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW); 
      ActionMap am = getActionMap(); 

      im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "next"); 
      im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "right"); 

      am.put("next", new AbstractAction() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        if (listOfFiles != null && listOfFiles.length > 0) { 
         i--; 
         if (i < 0) { 
          i = listOfFiles.length - 1; 
         } 
         loadCurrent(); 
        } 
       } 
      }); 
      am.put("right", new AbstractAction() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        if (listOfFiles != null && listOfFiles.length > 0) { 
         i++; 
         if (i >= listOfFiles.length) { 
          i = 0; 
         } 
         loadCurrent(); 
        } 
       } 
      }); 

     } 

     protected void loadCurrent() { 

      if (listOfFiles != null && listOfFiles.length > 0) { 
       File file = listOfFiles[i]; 
       try { 
        walkable = ImageIO.read(file); 
        repaint(); 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
       } 
      } 

     } 

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

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawImage(walkable, 0, 0, this); 
     } 
    } 
} 
+0

와우 이것이 꽤 좋았습니다. 팁 덕분에 코드가 아름답게 작동합니다 :) btw는 사진 스크롤을 추가 할 수 있는지 알고 있습니까? 그림이 화면에서 너무 큰 경우를 의미합니다. walkable.getWidth (null), walkable.getHeight (null), 내가 이것을 치수에서 사용하면 이미지가 너무 커서 이미지를 스크롤 할 수 있기를 원합니다. –

+0

네, 두 가지 옵션이 있습니다. 1- 이미지 그리기를 담당하는 사용자 정의 구성 요소를 만들 수 있습니다. getPreferredWidth 메서드를 재정의하고 이미지 크기 또는 2- JLabel 사용을 반환합니다. 이 중 하나를 사용하면 내 기본 컨테이너에 추가 될 스크롤 창에 추가됩니다. – MadProgrammer

관련 문제