调用repaint()时出现奇怪的JPanel行为

时间:2012-02-09 23:01:03

标签: java swing jpanel actionlistener

我有一个扩展JPanel的PanelFormes类,我将其用作容器。我还有另外两个JPanel,一个用于绘制一些图形,第二个包含按钮。这两个JPanel包含在第一个中,使用BorderLayout。

我的按钮应该调用JPanel的重绘方法,其中应该有数字。在我的主窗口构造函数中,我这样做:

boutonGetForme.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {

        ajoutForme(rect);
    }
});

方法ajoutForme,在我的主窗口类中:

// Methode ajout de forme, normalement appelee par le controleur
public void ajoutForme(Forme f) {

    //dire au jpanel quelle forme on veut dessiner et comment
    jpanel.definirForme(f);
    //mettre a jour le jpanel
    jpanel.repaint();  
}

最后是PanelFormes类:

package gui;

import java.awt.Graphics;
import javax.swing.JPanel;

public class PanelFormes extends JPanel {

private Forme f;
PanelFormes() {
    f = new Rectangle(1,1,1,1);
}
public void definirForme(Forme f) {
    this.f = f;
}
public void paintComponent(Graphics g) {
    //dessiner la forme
    f.dessine(g);
}            
}

我想我给了你所有相关的信息。 我的问题是,当我尝试使用按钮按钮GetForme绘制一个图形时,我不仅得到了图形,而且还有一些奇怪的屏幕截图 - 我刚按下的按钮的副本,它粘贴在我的JPanel的左上角,我真的很想知道...... 如果我试图通过直接调用ajoutForme来绘制图形,它就可以正常工作。 ActionListener必须有一些东西,但我无法理解... 我是Java的新手,任何帮助都将非常感谢。 感谢

1 个答案:

答案 0 :(得分:2)

如果您setOpaque(true),请验证您是否完全呈现了组件边界定义的区域;如果没有,请使用setOpaque(false)。如果问题仍然存在,请修改您的问题以包含展示该工件的sscce

附录:另见Painting in AWT and Swing: Opacity