これには非常に多くの問題があり、どこから始めればよいかわかりません...
最初から始めましょう...
問題#1
クラスで呼び出されるインスタンスフィールドを宣言しますsteve
がWindowPractice
、これは問題ありませんが、メインメソッドで、ロードされた画像への参照を使用している呼び出される別の変数を宣言しますsteve
...
public static void main(String[] args) {
new WindowPractice();
ImageIcon steve = new ImageIcon("C:/Users/shane/Dropbox/issue459.jpg");
JLabel imageLabel = new JLabel(steve);
}
これは、クラス インスタンス変数が初期化されず、そのままであることを意味しますnull
。
問題#2
直接関係はありませんがsuper.paint
、メソッドから呼び出すことはありませんpaint
。これは大きなNO、NOです。ペイント チェーンを維持する義務があります。ペイント方法は複雑で、非常に重要です。
問題#3
最上位のコンテナー ( などJFrame
) をオーバーライドしたり、そのメソッドをオーバーライドしたりしないでくださいpaint
。これには多くの理由がありますが、上位 2 つの中では、ほとんどのトップ レベル コンテナには、実際には多くのコンポーネント (JRootPane
ガラス ペイン、コンテンツ ペイン、レイヤ ペイン、およびメニュー バーを収容する ) が含まれており、ペイント作業の上に置かれ、 、一般に、それらはダブルバッファリングされていません。つまり、ペイントの更新はちらつき、恐ろしいものになります;)
また、 の使用を避けるべきでありpaint
、代わりに、paintComponent
利用可能な場所での使用を検討する必要があります。
問題#4
ImageIcon
画像をロードするための最良の選択ではありません。私がそれらを使用しない主な理由は、読み込まれている画像が実際にいつ利用可能になるかがわからないためです (実際にはいくつかの方法がありますが、率直に言って、ImageIO
もっと簡単です)。これは、1999 年にダイヤルアップ速度が 14.4k 前後だったときの優れた機能でしたが、現在では...
ImageIO
より広い範囲の画像フォーマットをサポートし、画像の読み取りと書き込みをサポートし、メソッドが (正常に) 戻ったときに、画像ピクセル データがアプリケーションで使用できることを保証します。
例
これはより良い(IMHO)アプローチです...
public class BetterDrawing {
public static void main(String[] args) {
new BetterDrawing();
}
public BetterDrawing() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new PaintPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class PaintPane extends JPanel {
private BufferedImage background;
public PaintPane() {
try {
background = ImageIO.read(new File("/path/to/image"));
// Use this instead to load embedded resources instead
//background = ImageIO.read(getClass().getResource("/path/to/image"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
@Override
public Dimension getPreferredSize() {
return background == null ? super.getPreferredSize() : new Dimension(background.getWidth(), background.getHeight());
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (background != null) {
int x = (getWidth() - background.getWidth()) / 2;
int y = (getHeight() - background.getHeight()) / 2;
g.drawImage(background, x, y, this);
}
}
}
}
読んでみる
詳細については。