为什么在使用repaint()而不是与getParent()。repaint()一起使用时会发生此Swing错误?

绿头鸭

这个问题是基于我前一段时间使用一个简单的Swing骰子程序遇到的一个问题。我最初发布的问题在这里,并且得到了公认的答案,但是我想确切地了解正在发生的事情,为什么会出现问题以及为什么解决方案会起作用。

我设法缩减了原始代码以找到问题的核心,现在看起来很不一样:

  • 我有两个ColorPanel,每个都画一个彩色的正方形
  • 当您单击面板时,该框应按以下顺序更改颜色:从黑色开始,然后是>红色>绿色>蓝色>红色>绿色>蓝色>等
  • 一旦盒子改变了颜色,它就永远不会再变成黑色

但是,当我仅调用repaint()MouseListener,程序的行为非常奇怪:

  • 我单击一个面板,正方形的颜色就会改变
  • 然后单击另一个,它的正方形会更改颜色,但第一个正方形也会更改,变回黑色
  • 您可以在下面的gif中看到此行为:

越野车程序

如果getParent().repaint()改为使用此行为,则程序将按预期方式运行:

在此处输入图片说明

  • 仅当面板/正方形开始“重叠”时才出现此问题。
  • 如果您使用的布局停止了此操作,或者未将其设置为小尺寸,则似乎不会出现此问题。
  • 这个问题并非每次都会发生,这最初使我认为可能涉及并发问题。
  • 我在原始问题中遇到的代码似乎并没有对每个人造成问题,因此我的IDE,jdk等也可能相关:Windows 7,Eclipse Kepler,jdk1.7.0_03

减去导入等的代码如下:

public class ColorPanelsWindow extends JFrame{

    static class ColorPanel extends JPanel {

        //color starts off black
        //once it is changed should never be 
        //black again
        private Color color = Color.BLACK;

        ColorPanel(){
            //add listener
            addMouseListener(new MouseAdapter(){
                @Override
                public void mousePressed(MouseEvent arg0) {
                    color = rotateColor();
                    repaint();
                    //using getParent().repaint() instead of repaint() solves the problem
                    //getParent().repaint();
                }
            });
        }
        //rotates the color black/blue > red > green > blue
        private Color rotateColor(){
            if (color==Color.BLACK || color == Color.BLUE)
                return Color.RED;
            if (color==Color.RED)
                return Color.GREEN;
            else return Color.BLUE;
        }

        @Override
        public void paintComponent(Graphics g){
            g.setColor(color);
            g.fillRect(0, 0, 100, 100);
        }
    }

    ColorPanelsWindow(){
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setLayout(new GridLayout(1,0));
        add(new ColorPanel());
        add(new ColorPanel());
        //the size must be set so that the window is too small
        // and the two ColorPanels are overlapping
        setSize(40, 40);
//      setSize(300, 200);

        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){

            @Override
            public void run() {
                new ColorPanelsWindow();
            }

        });
    }
}

所以我的问题是,这到底是怎么回事?

卡米克尔

但我想确切地知道正在发生什么,

我在Windows 7上使用JDK7u60时遇到了同样的问题。

我最好的猜测是双缓冲是一个问题。

我在paintComponent()方法中添加了调试代码

1)当您单击正确的组件时,只会paintComponent()调用方法,并且面板将被涂上适当的颜色。

2)单击左侧组件时,仅paintComponent()会调用方法,并且面板将被涂上适当的颜色,但是右侧的面板将恢复为黑色,而不会调用paintComonent()右侧面板方法。这使我相信以某种方式使用了旧缓冲区(这将是错误,并且我不知道如何修复它)。

getParent().repaint()起作用的原因是因为无论您单击哪个面板,这都将强制重涂两个组件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在使用repaint()而不是与getParent()。repaint()一起使用时会发生此Swing错误?

来自分类Dev

当我将 System.Threading.Timer 与 TimerTrigger 一起使用时会发生什么?

来自分类Dev

将NetworkTransform与RigidBody一起使用时会发生NullReferenceException

来自分类Dev

将NetworkTransform与RigidBody一起使用时会发生NullReferenceException

来自分类Dev

当Selenium与BrowserMob一起使用时,会发生TooLongFrameException

来自分类Dev

将SDL_ttf与SDL和SDL2一起使用时会发生C ++访问冲突

来自分类Dev

与PowerShell一起使用时发生Logparser错误

来自分类Dev

将KCL与AWS Kinesis流一起使用时,如果工作程序的数量>碎片的数量会发生什么?

来自分类Dev

当标准位置服务和重要位置更改一起使用时,会发生什么?

来自分类Dev

以管理员身份使用时会发生什么?

来自分类Dev

与bin一起使用时,为什么此代码会崩溃?

来自分类Dev

与ViewPager Fragments一起使用时,Animate Toolbar徽标/标题会发生变化

来自分类Dev

将gedit与sudo一起使用时,会发生哪些特定的不良情况?

来自分类Dev

将gedit与sudo一起使用时,会发生哪些特定的不良情况?

来自分类Dev

与ViewPager Fragments一起使用时,Animate Toolbar徽标/标题会发生变化

来自分类Dev

为什么将std :: bind与lambda一起使用时会产生如此大的对象?

来自分类Dev

为什么Vim与Ctrl + v一起使用时会吞噬Ctrl,以及如何解决它?

来自分类Dev

在Laravel中将Sass与AgGrid一起使用时,为什么会出现错误?

来自分类Dev

与||一起使用时,为什么此复合命令{...}不会错误退出?

来自分类Dev

为什么将SparkSql与Hive一起使用时找不到此表错误?

来自分类Dev

在OWIN中将Simple Injector与WebApi自托管一起使用时,为什么会出现此ActivationException?

来自分类Dev

MatToolbar与Angular 9一起使用时会引发错误

来自分类Dev

与Netwire一起使用时会误解ArrowLoop

来自分类Dev

为什么此RewriteRule与[R]一起使用而不与[QSA,L]一起使用?

来自分类Dev

为什么此RewriteRule与[R]一起使用而不与[QSA,L]一起使用?

来自分类Dev

为什么在尝试设置Windows 8设置时会发生此无关的错误?

来自分类Dev

无限本地错误:为什么在函数中重新定义全局变量而不是仅引用全局变量时会发生此错误?

来自分类Dev

如果将ViewBinding和GoogleMap一起使用,则会发生错误

来自分类Dev

如果我将extern“ C ++”与C工具链一起使用会发生什么?

Related 相关文章

  1. 1

    为什么在使用repaint()而不是与getParent()。repaint()一起使用时会发生此Swing错误?

  2. 2

    当我将 System.Threading.Timer 与 TimerTrigger 一起使用时会发生什么?

  3. 3

    将NetworkTransform与RigidBody一起使用时会发生NullReferenceException

  4. 4

    将NetworkTransform与RigidBody一起使用时会发生NullReferenceException

  5. 5

    当Selenium与BrowserMob一起使用时,会发生TooLongFrameException

  6. 6

    将SDL_ttf与SDL和SDL2一起使用时会发生C ++访问冲突

  7. 7

    与PowerShell一起使用时发生Logparser错误

  8. 8

    将KCL与AWS Kinesis流一起使用时,如果工作程序的数量>碎片的数量会发生什么?

  9. 9

    当标准位置服务和重要位置更改一起使用时,会发生什么?

  10. 10

    以管理员身份使用时会发生什么?

  11. 11

    与bin一起使用时,为什么此代码会崩溃?

  12. 12

    与ViewPager Fragments一起使用时,Animate Toolbar徽标/标题会发生变化

  13. 13

    将gedit与sudo一起使用时,会发生哪些特定的不良情况?

  14. 14

    将gedit与sudo一起使用时,会发生哪些特定的不良情况?

  15. 15

    与ViewPager Fragments一起使用时,Animate Toolbar徽标/标题会发生变化

  16. 16

    为什么将std :: bind与lambda一起使用时会产生如此大的对象?

  17. 17

    为什么Vim与Ctrl + v一起使用时会吞噬Ctrl,以及如何解决它?

  18. 18

    在Laravel中将Sass与AgGrid一起使用时,为什么会出现错误?

  19. 19

    与||一起使用时,为什么此复合命令{...}不会错误退出?

  20. 20

    为什么将SparkSql与Hive一起使用时找不到此表错误?

  21. 21

    在OWIN中将Simple Injector与WebApi自托管一起使用时,为什么会出现此ActivationException?

  22. 22

    MatToolbar与Angular 9一起使用时会引发错误

  23. 23

    与Netwire一起使用时会误解ArrowLoop

  24. 24

    为什么此RewriteRule与[R]一起使用而不与[QSA,L]一起使用?

  25. 25

    为什么此RewriteRule与[R]一起使用而不与[QSA,L]一起使用?

  26. 26

    为什么在尝试设置Windows 8设置时会发生此无关的错误?

  27. 27

    无限本地错误:为什么在函数中重新定义全局变量而不是仅引用全局变量时会发生此错误?

  28. 28

    如果将ViewBinding和GoogleMap一起使用,则会发生错误

  29. 29

    如果我将extern“ C ++”与C工具链一起使用会发生什么?

热门标签

归档