我不重写paint方法,在其他方法里面使用
Graphics g = getGraphics();
g.setColor(Color.BLUE);
g.fillRect(0, 0, width, height);
为什么就显示不出来,因为需要所以不能用paint,求解决方法

解决方案 »

  1.   

    那要看你是怎么调用这个“其他方法”的了。很有可能是被paint()给覆盖掉了。
      

  2.   

    其实并不复杂,但不知道你问题卡在哪里了,所以只好给你个例子你自己看看了
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;import javax.swing.JButton;
    import javax.swing.JDialog;public class TestDialog extends JDialog implements ActionListener {    JButton btnFillRect;    public TestDialog() {
            this.setSize(640, 480);
            btnFillRect = new JButton("Fill Rect");
            btnFillRect.addActionListener(this);
            this.add(btnFillRect, BorderLayout.SOUTH);
            this.getGraphics(); 
        }    public void actionPerformed(ActionEvent e) {
            Graphics g = this.getGraphics();
            g.setColor(Color.RED);
            g.fillRect(50, 50, 200, 200);
        }    public static void main(String[] args) {
            TestDialog dialog = new TestDialog();
            dialog.setVisible(true);
        }
    }
      

  3.   

    我不知你是为什么不能覆盖paint() ,java一般是把JFrame或者JPanel 做为画布来绘制图形的,JFrame布一般会调用自己的paint()绘图,而JPanel调用paintComponent(),除非覆盖这些方法。
      

  4.   

    我知道你这个意思,我想弄一个JFileChooser然后不管你打开什么文件背景色都会改变,你说这个应该怎么弄呢
      

  5.   

    没太弄明白你的意思,简单点处理就是你写个类,直接继承JFileChooser,然后想干啥就干啥吧。
      

  6.   

    系统会在需要刷新的时候调用paint(), 比如窗口被部分挡住然后又重现。
    而你写的那部分绘制代码不会被系统调用到。
      

  7.   

    最安全的就是重写paint()函数,否则处理你这种问题会很麻烦,相当于你要捕捉所有可能覆盖你图形的情况,然后重绘图形;或者定时重绘图形;反正都不是好办法。如果实在不想重写JDialog的paint()函数,也可以重写Panel的paint()函数。
      

  8.   

    一闪一闪说明重绘没写好,否则不会出现这种情况,两种做法:1、尽量避免重复绘制,也就是所有绘制都输出到某BufferImage上,然后再一次性输出到主界面的Graphics上;也就是所谓绘制缓冲。
    2、不要直接重写JDialog的paint()函数,而是仅重写你自定义(或继承)的一个JPanel的paint();也就是缩小影响范围。
    关于双缓冲参见这里:
    http://developer.51cto.com/art/201105/259587.htm
      

  9.   


    JComponent 类在其 paint() 方法中实现了双缓冲,一般不建议重写 paint() 方法,除非你有特别的效果需求。建议的方式是重写 paintComponent() 方法:public void paintComponent(Graphics g) { 
      
      // super.paintComponent(g);
      // ...
    }除了双缓冲的问题之外,重写 paintComponent() 方法还保证了你不会影响到此控件内的子控件的绘製。