当我使用paint()方法时,框架变为白色

时间:2013-12-23 03:53:31

标签: java swing paint

当我加入paint()方法时,它只会在背景上显示一个白色屏幕。 第一张图片是paint()的输出,第二张图片没有paint()

With paint method

without paint method

代码:

import javax.swing.*;
import java.io.*;
import java.awt.*;
import java.util.*;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.BorderLayout;
import java.awt.event.*;

public class Board2 extends JFrame
{
    static JPanel p1
    static JButton b1
    public Board2(){
        setSize(1000, 800);
        setResizable(false);
        b1 = new JButton("Button");
        p1.add(b1);
        add(p1, BorderLayout.CENTER);
        setVisible(true);
    }


    public void paint(Graphics g)
    {
        g.setColor(Color.BLUE);
        g.fillRect(50,50,20,20);
    }

    public static void main(String args[]){
        new Board2();

    }
}

在我的其他程序中,按钮是隐形的,直到我将鼠标悬停在它们上面。怎么解决这个问题?

1 个答案:

答案 0 :(得分:3)

问题的可能原因可能是因为你没有调用super.paint,但由于你没有提供油漆代码,所以这只是一个有根据的猜测......

其他一些有根据的猜测......

  • 当你应该覆盖paintJFrame之类的paintComponent时,你会覆盖JComponent(可能是JPanel等顶级容器) }(并调用super.paintComponent

请查看Performing Custom PaintingPainting in AWT and Swing了解详情

根据更新的代码更新

你有两个基本问题......

public class Board2 extends JFrame
{

    //...

    public void paint(Graphics g)
    {
        g.setColor(Color.BLUE);
        g.fillRect(50,50,20,20);
    }

你正在覆盖顶级容器的paint而你正在破坏油漆链。

Swing中的绘画是通过一系列链式方法调用完成的,它们一起工作以产生最终结果,达到特定工作,当你无法调用super.paint时,你停止这些方法的工作。

当您在顶级容器上执行此操作时,您可以阻止它对其子项进行绘制......

此外,顶级容器不是双缓冲的,这使得它们在涂漆时会闪烁。

相反,创建一个自定义组件,覆盖它的paintComponent并在那里进行自定义绘画

例如......

public class Board2 extends JFrame
{
    static JPanel p1
    static JButton b1
    public Board2(){
        setSize(1000, 800);
        setResizable(false);
        b1 = new JButton("Button");
        p1 = new JPanel() {
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.setColor(Color.BLUE);
                g.fillRect(50,50,20,20);
            }
        }
        p1.add(b1);
        add(p1, BorderLayout.CENTER);
        setVisible(true);
    }

    public static void main(String args[]){
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Board2();
            }
        });
    }
}