1

プログラムの実行中に画像を数回リロードする必要があるアプリケーションを作成しました。おそらくそれは不器用ですが、私の実装は、サブクラスのComponentクラスを拡張し、そのコンストラクターへのfileName引数を介してイメージを再ロードすることでした。コードは以下に含まれています:

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コマンドを呼び出すたびに、このウィンドウがEclipseを含むすべてのJavaのフォーカスを奪うことです。これは、実際に悪化する可能性があります。コンストラクターを追加しようとしsetFocusable(false)ましたが、それでもフォーカスを奪うことができます。焦点を合わせることができるが、建設時に自動的に焦点を合わせないようにするにはどうすればよいですか?

4

1 に答える 1

2

おそらくそれは不器用ですが、私の実装は、サブクラスのComponentクラスを拡張し、そのコンストラクターへのfileName引数を介してイメージを再ロードすることでした。

カスタムコンポーネントは必要ありません。画像を変更する場合は、JLabelとsetIcon(...)メソッドを使用するだけです。

Componentを拡張しないカスタムコンポーネントが必要な場合でも、SwingアプリケーションでJComponentまたはJPanelを拡張します。

フレームを自動的に表示するように設定すると、フレームにフォーカスが移ります。あなたは使用してみることができます:

frame.setWindowFocusableState( false );

次に、WindowListenerをフレームに追加する必要がある場合があります。ウィンドウが開いたら、フォーカス可能な状態をtrueにリセットできます。

于 2011-05-12T04:50:12.220 に答える