我創建了 JPanel 的子類來顯示影像。我在 JFrame 的建構式中實體化它并將其添加到該 JFrame。這完美地作業。然后我添加了一個帶有 ActionListener 的按鈕來更改該影像。我的問題是 JFrame 不會更新,盡管我已經嘗試重新繪制等。
JPanel的子類:
public class ImagePanel extends JPanel {
BufferedImage bf;
public ImagePanel(String dateiname)
{
try {
bf = ImageIO.read(new File(dateiname));
} catch (IOException e) {
e.printStackTrace();
}
}
public void paint(Graphics g)
{
g.drawImage(bf.getScaledInstance(300,200,1),0,0,null );
}
}
JFrame 基本上是這樣的
public class Hauptfenster extends JFrame {
private JButton changeImage;
private JPanel buttonPanel;
private ImagePanel ip;
public Hauptfenster {
ip = new ImagePanel("first_image.jpg");
buttonPanel = new JPanel();
buttonPanel.add(changeImage);
changeImage.addActionListener((e) -> {
ip = new ImagePanel("new_image.jpg");
ip.setVisible(true);
});
this.add(buttonPanel);
this.add(ip);
this.setVisible(true);
}
}
為什么 ActionListener 中的方法不更新 JFrame Hauptfenster 中的 ip 組件?
uj5u.com熱心網友回復:
當您這樣做時,ip = new ImagePanel("new_image.jpg");您正在創建一個全新的 ImagePanel,它與您當前的布局無關。你可以。
remove(ip);
ip = new ImagePanel("new_image.jpg");
add(ip);
repaint();
另一種方法是更改??緩沖影像。
將以下方法添加到您的影像面板。
public void loadImage(String dateiname) {
try {
bf = ImageIO.read(new File(dateiname));
} catch (IOException e) {
e.printStackTrace();
}
}
然后在你的動作監聽器中。
ip.loadNewImage("new_image.jpg");
ip.repaint();
但是,您的代碼中有很多壞習慣。
例如,覆寫paintComponent而不是paint,它應該看起來像。
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(bf.getScaledInstance(300,200,1),0,0,null );
}
這樣透明度將得到正確處理。
您不應該擴展 JFrame,而應該創建一個 JFrame。
當您添加組件時,就會涉及到一個布局管理器。意識到這一點并相應地處理事情是很好的。我會將您的建構式更改為。
public Hauptfenster() {
JFrame frame = new JFrame();
ip = new ImagePanel("first_image.jpg");
buttonPanel = new JPanel();
changeImage = new JButton("change image");
buttonPanel.add(changeImage);
changeImage.addActionListener((e) -> {
frame.remove(ip);
ip = new ImagePanel("new_image.jpg");
frame.add(ip, BorderLayout.CENTER);
frame.repaint();
});
frame.add(buttonPanel, BorderLayout.SOUTH);
frame.add(ip, BorderLayout.CENTER);
frame.setVisible(true);
}
如果您需要更多幫助,您需要實際使您的示例可編譯。現在錯誤太多了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/343763.html
