【问题标题】:repaint method after add custom JPanel to JFrame将自定义 JPanel 添加到 JFrame 后重绘方法
【发布时间】:2013-05-07 04:42:37
【问题描述】:

我有这个代码,但是JPanel repaint 方法不起作用。如果我在将它添加到 JFrame 类之后执行此操作,我会对其进行调试,但它不记得 paintComponent

为什么会这样?

package trial;

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;


class jp extends JPanel
{
     int i=0;

     {
        setBackground(Color.RED);
     }

     @Override
     protected void paintComponent(Graphics g)
     { 
        super.paintComponent(g);
        Color[] c={Color.red,Color.green};
        //To change body of generated methods, choose Tools | Templates.
        g.drawLine(i, i, i+100, i+100);
        i+=50;
     }
}

public class Trial extends JFrame{

   public static void main(String[] args) {
       Trial f=new Trial();
       jp a;
       a=new jp(); 
       System.out.println(a.i);
       f.add(a);
       f.setVisible(true);
       f.setSize(500, 500);
       f.setDefaultCloseOperation(3);

       a.repaint();

   }
}

【问题讨论】:

  • 为什么在受保护的 void paintComponent(Graphics g) {{ ... }} 中有两个 {{
  • 对代码块使用一致且符合逻辑的缩进。代码的缩进是为了帮助人们理解程序流程。
  • 我刚刚在我的机器上测试了它,在paintComponent(Graphics g)方法中设置了一个调试点,程序按预期进入了调试模式。
  • 它进入了它,但不是通过方法“repaint”我的笔记是关于方法 repaint 为什么它没有任何意义

标签: java swing user-interface jpanel


【解决方案1】:

[UPDATE] 更好地适应问题: 对repaint() 的调用会将PaintEvent 放入事件队列。这个PaintEvent 将由另一个线程处理,事件调度线程

简而言之:paintComponent() 作为您的主要方法在另一个线程中被调用。

[/UPDATE]

我不确定您要达到什么目的,但请在您的 main 方法结束时尝试此操作:

    try {
        while (true) {
            Thread.sleep(1000);
            a.repaint();
        }
    } catch (InterruptedException e) {
    }

这样的移动线是您所期待的吗?这样做的原因:据我所知,Java Swing 可能会将在 Event Dispatching Thread 中排队的多个重绘请求折叠成一个单独的绘制请求——这可能是您所经历的。在我上面的示例中,等待 1 秒就足以获得不同的重绘。

但我强烈建议您不要使用我的(或您的)代码。原因:i 的值取决于对 paintComponent 的调用次数 - 这可能会有所不同。例如,拉动一个角落来调整窗口的大小 - repaint 可能会被调用数十次!

也许您希望javax.swing.Timer 定期更新i 的值,然后触发重绘?

【讨论】:

  • 我的问题是“为什么我的 main 代码最后一行中的“a.repaint”不记得“paintComponent”方法?
  • 看来你需要对Java Swing有一些基本的了解。请参阅上面的更新。
猜你喜欢
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多