【问题标题】:Weird JPanel behavior when calling repaint()调用 repaint() 时出现奇怪的 JPanel 行为
【发布时间】:2012-02-09 23:01:02
【问题描述】:

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

我的一个按钮应该在应该有图形的地方调用 JPanel 的 repaint 方法。在我的主窗口构造函数中,我这样做:

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);
}            
}

我想我给了你所有相关的信息。 我的问题是,当我尝试使用按钮 buttonGetForme 绘制图形时,我不仅得到了图形,而且还得到了我刚刚按下的那个按钮的一些奇怪的截图副本,它粘贴在我的 JPanel 的左上角,我真的很想知道怎么... 如果我尝试通过直接调用 ajoutForme 来绘制图形,它工作得很好。 ActionListener 一定有什么东西,但我不明白是什么...... 我是Java新手,任何帮助将不胜感激。 谢谢

【问题讨论】:

  • 另见answer
  • 我添加了 this.setOpaque(true);在我的 FormePanel 构造函数中,问题仍然存在。

标签: java swing jpanel actionlistener


【解决方案1】:

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

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

【讨论】:

  • 我如何知道我是否完全渲染了组件绑定定义的区域?无论如何我都会尝试 setOpaque(false) ;) 把它放在我的 JPanel 构造函数中对吗?
  • 好的,它可以与 setOpaque(false) 一起使用! :D 非常感谢垃圾神...但是,你能解释一下这个魔法吗??
  • @CTZStef:我在上面添加了一个链接;例如,在ScrollPanePaint 中,MyPanel 只绘制交替的瓷砖,所以opaque 必须是false
猜你喜欢
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 1970-01-01
  • 2020-01-19
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多