0

ユーザーがボタンを押したときに90度回転させたいJlabel内の画像があります。私も自分でやってみましたが、いろいろとエラーが出ました。それを行う最善の方法はGraphics2Dを使用することだと言われましたか?

メインクラス:

private void SearchButtonActionPerformed(java.awt.event.ActionEvent evt) {        
BufferedImage image;
        try {
            image = ImageIO.read(file);
            Image scaled = image.getScaledInstance(Jlabel1.getWidth(), Jlabel1.getHeight(), 5);
            Jlabel1.setIcon(new ImageIcon(scaled));

ボタン:

 private void rotateButtonActionPerformed(java.awt.event.ActionEvent evt) {
        Graphics2D userImage = (Graphics2D)JLabel1.getGraphics();
    userImage.rotate(Math.toRadians(90));
    userImage.drawImage(JLabel1, JLabel1.getHeight(), JLabel1.getWidth());
    }
4

1 に答える 1

2

コンポーネントの描画に Component.getGraphics() を使用しないでください。代わりに、常に paintComponent を上書きし、それに渡される Graphics オブジェクトを操作する必要があります。

Component.getGraphics() は単に機能しません。Java は、グラフィックスの描画にコールバック メカニズムを使用します。getGraphics() を使用してグラフィック情報をコンポーネントに「プッシュ」することは想定されていません。代わりに、Java が paint()/paintComponent() メソッドを呼び出すまで待つ必要があります。その時点で、実行したい描画をコンポーネントに提供することになっています。

このメカニズムは、ウィンドウが隠れている (別のウィンドウが重なっているなど) 場合にウィンドウの内容を記憶しないグラフィックス システムを Java がサポートできるようにするために必要です。ウィンドウが再び表示されると、そのようなグラフィックス システムはアプリケーションにウィンドウの内容を再構築するように要求する必要があります。したがって、paint()/paintComponent() はコンポーネントのメモリであると想定されます。ただし、getGraphics() には、以前の描画操作の記憶がありません。そのため、getGraphics() を介して行われた描画が失われると、再構築することはできません。そこには古い描画データを格納するものは何もありません。また、AWT/Swing には、再描画を行うように getGraphics() に通知するものは何もありません。

さらに、Component.getGraphics() が単純に null を返す場合もあります。これは、メソッドの定義済みの動作です。最後に、 getGraphics() のほとんどのユーザーは、使用後に Graphics オブジェクトを破棄するのを忘れています。

http://www.pscode.org/guifaq.html

于 2012-06-08T17:02:11.920 に答える