2

jPanelに問題が1つあります。文字列入力(数式)から画像をPNGするボタンがあり、jPanelで古い画像を再描画します。そして問題があります。画像が変更されましたが、アプリウィンドウのサイズを手動で変更するまでjPanelは再描画されません。

そのサイズ変更まで、パネルは再描画されないようです。しかし、私はそのボタンでそれを行う方法がわかりません。

私はこれこれを試しましたが、変更はありません。

ところで。NetBeansでGUIビルダーを使用しています。

私のコード...最初の試み:

public class ImagePanel extends JPanel {

   private String path;
   Image img;
   public ImagePanel() {
        try {
            //save path
            path = "Example5.png";
            //load image
            img = ImageIO.read(new File(path));
        } catch (IOException ex) {
        }
    }
   @Override
   public void paint(Graphics g) {
      //draw the image
      if (show) {
        try {
            if (img != null) {
                img = ImageIO.read(new File(path));
                g.drawImage(img, 0, 0, this);
            }
        } catch (IOException ex) {
        }
     } else {
        show = true;
     }
   }
}

およびWindowクラス/ボタンメソッド:

   imagePanel = new ImagePanel();
   imagePanel.repaint();
   imagePanel.updateUI();

2回目の試行:

public class ImagePanel extends JPanel {

   private String path;
   Image img;
   ImagePanel(Image img) {
        this.img = img;
   }

   public void setImg(Image img) {
       this.img = img;
   }

   @Override
   public void paintComponent(Graphics g) {
       super.paintComponent(g);

       // Draw image centered in the middle of the panel
       g.drawImage(img, 0, 0, this);
   }

}

およびボタン:

imagePanel.setImg(new ImageIcon("2.png").getImage());
imagePanel.repaint();
4

2 に答える 2

4

バックラウンドリペイントスレッドでこれを処理できます。これは、JPanelサブクラスのコンストラクターに配置できます。

Thread repainter = new Thread(new Runnable() {
    @Override
    public void run() {
        while (true) { // I recommend setting a condition for your panel being open/visible
            repaint();
            try {
                Thread.sleep(30);
            } catch (InterruptedException ignored) {
            }
        }
    }
});
repainter.setName("Panel repaint");
repainter.setPriority(Thread.MIN_PRIORITY);
repainter.start();
于 2012-05-10T13:49:09.380 に答える