所以我想在單擊相應的按鈕后更改我作為 JComponent 實作的影像的位置,但是,單擊時它沒有做任何事情。
我認為問題可能出在我的paintComponent 方法中,因為我希望一開始就將影像繪制在面板的中心。
面板本身有一個 GridBagLayout,盡管我認為將其錨定在中心也無濟于事,因為我想在單擊按鈕時移動影像并且只希望它在我打開時顯示在面板的中心框架...
特別是對于這個按鈕,我希望我的 JComponent/image 向右移動 50 個像素。
無論如何,這就是我所做的:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int x = (this.getWidth() - img.getWidth(null))/2;
int y = (this.getHeight() - img.getHeight(null))/2;
g.drawImage(img, x, y, null);
}
@Override
public void actionPerformed(ActionEvent e) {
img.repaint(img.getX() 50, img.getY(), img.getHeight(), img.getWidth());
}
uj5u.com熱心網友回復:
x目前,您的 paintComponent 方法始終對and使用相同的值y,因此影像不會移動也就不足為奇了。
x并且y是需要記住的狀態。這是通過定義實體欄位來完成的:
private int x;
private int y;
您不能在構造時初始化它們,因為組件在創建時(通常)的寬度和高度為零。幸運的是,有一種方法可以告訴您何時為組件指定了寬度和高度;該方法是addNotify,您可以并且應該覆寫它:
@Override
public void addNotify() {
super.addNotify();
x = (this.getWidth() - img.getWidth(this)) / 2;
y = (this.getHeight() - img.getHeight(this)) / 2;
}
請注意,您應該將this(您的組件實體)傳遞給任何需要 ImageObserver 引數的方法,而不是 null。
現在paintComponent 不需要做任何計算。它只是在任何地方繪制影像,x并且y恰好是:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, x, y, this);
}
現在您的坐標是實體欄位,您可以直接更改它們:
@Override
public void actionPerformed(ActionEvent event) {
x = 50;
repaint();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/468944.html
