2011-05-12 5 views
1

프로그램 실행 중에 여러 번 이미지를 다시로드해야하는 응용 프로그램을 만들었습니다. 아마 그것은 어색하지만, 구현은 하위 클래스에서 Component 클래스를 확장하고 fileName 인수를 통해 이미지를 생성자로 다시로드하는 것입니다. 아래 코드는 포함되어Java의 시각적 구성 요소 구성 중 포커스 방지

import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.WindowConstants; 

public class Grapher { 

    private static JFrame frame = new JFrame("Test Frame"); 
    private static Graph graph = null; 
    private static JScrollPane jsp = null; 
public Grapher(){ 
    frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 
} 

public void display(String fileName) { 
    if(jsp != null) 
     frame.getContentPane().remove(jsp); 
    graph = new Graph(fileName); 
    jsp = new JScrollPane(graph); 
    frame.getContentPane().add(jsp); 
    frame.setSize(graph.getPreferredSize()); 
    frame.setVisible(true); 
} 

private class Graph extends Component{ 
    BufferedImage img; 
    @Override 
    public void paint(Graphics g) { 
     g.drawImage(img, 0, 0, null); 
    } 
    public Graph(String fileName) { 
     setFocusable(false); 
     try { 
      img = ImageIO.read(new File(fileName)); 
     } catch (IOException e) {System.err.println("Error reading " + fileName);e.printStackTrace();} 
    } 
} 
} 

어쨌든, 내 문제는 내가 display 명령을 호출 할 때마다이 창 정말 agravating 수있는 일식을 포함한 모든 자바의 초점을 훔치는 것입니다. 심지어 생성자에 setFocusable(false)을 추가하려고 시도했지만 여전히 포커스를 훔쳐 관리합니다. 초점을 맞추지 만 건설에 자동으로 초점을 맞추지 않는 방법은 무엇입니까?

답변

2

는 아마도 서투른,하지만 내 구현은 하위 클래스에서 구성 요소 클래스를 확장하고 사용자 정의 구성 요소에 대한 필요가 없습니다 생성자

의에 파일 이름 인수를 통해 이미지를 다시로드하는 것이 었습니다. 이미지를 변경하려면 JLabel과 setIcon (...) 메서드를 사용하십시오.

컴포넌트를 확장하지 않을 사용자 정의 컴포넌트가 필요한 경우에도 Swing 애플리케이션에서 JComponent 또는 JPanel을 확장 할 수 있습니다.

프레임이 자동으로 표시되도록 설정하면 프레임이 포커스됩니다. 다음을 사용해보십시오 :

frame.setWindowFocusableState(false); 

그런 다음 프레임에 WindowListener를 추가해야 할 수도 있습니다. 창이 열리면 포커스 가능 상태를 true로 재설정 할 수 있습니다.

+0

두 가지 유용한 정보를 보내 주셔서 감사합니다. 1. setVisible (true)가 포커스를 훔치고, 2. JFrame이 더 좋습니다. –