2

以下は私がこれまでに持っているコードです: すべてのインポートは正しいです。私は確信しています。:D

プログラムを実行すると、画像のない空白のフレームしか表示されません。表示されるはずです。

public class WindowPractice extends JFrame {

   final static int width= 800;
   final static int height= 400;
   int x;
   int y;
   Image steve;
   Dimension gamesize= new Dimension (width, height);
    public WindowPractice(){
        setTitle ("Hangman");
        setSize (gamesize);
        setVisible (true);
        setResizable (false);
        setLocationRelativeTo (null);
        setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);


    }
    public static void main (String[] args) {
        new WindowPractice();
        ImageIcon steve= new ImageIcon ("Libraries/Pictures/ba190cd951302bcebdf216239e156a4.jpg");
        JLabel imageLabel = new JLabel(steve);

    }
    public void paint(Graphics g){

        g.setColor(Color.red);
        //g.fillRect(  x, y, 100, 20);
        g.drawImage(steve, x, y,this);


        x= 150;
        y= 250;
    }

}
4

1 に答える 1

7

これには非常に多くの問題があり、どこから始めればよいかわかりません...

最初から始めましょう...

問題#1

クラスで呼び出されるインスタンスフィールドを宣言しますsteveWindowPractice、これは問題ありませんが、メインメソッドで、ロードされた画像への参照を使用している呼び出される別の変数を宣言します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);

            }

        }
    }
}

読んでみる

詳細については。

于 2012-12-14T01:55:43.907 に答える