如何调用Paint(g)?

时间:2015-11-10 16:00:04

标签: java swing

我想调用我的第一种方法,但它不起作用。更多,我没有印刷品。但是我想画画而且什么也没画。

我根据你的答案编辑了它......

import javax.swing.*;
import java.awt.*;

public class Main extends JPanel {

    private static JPanel pan = new JPanel();
    private static JButton valider = new JButton("Valider");

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g); 
        System.out.println("ok"); //It doesn't display ok
        g.drawRect(10, 10, 50, 50);
        g.setColor(Color.GREEN);
    }


    public static void fenetre() {
        JFrame fenetre = new JFrame("Fenetre");
        fenetre.setVisible(true);
        fenetre.setSize(480,272);
        fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pan.add(valider);
        fenetre.add(pan);
        fenetre.revalidate();
        //fenetre.repaint();
        fenetre.setContentPane(pan);
        fenetre.getContentPane().setBackground(Color.BLUE);

    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("Lancement du programme");
        fenetre();

    }

}

6 个答案:

答案 0 :(得分:3)

  

我有“公共课主要扩展JPanel”,但没有发生。

好吧,你永远不会将面板添加到框架中。

有关自定义绘画的工作示例,请首先阅读Custom Painting上的Swing教程中的部分。它将向您展示如何覆盖paintComponent()方法,如何覆盖getPreferredSize()方法以及如何将面板添加到框架中。

本教程中的示例还将向您展示如何更好地构建代码。因此,基本上摆脱当前的代码并从教程中下载示例并对该代码进行更改。我将从第3个例子开始,因为它是最完整的。

答案 1 :(得分:2)

问题是在添加面板之前调用setVisible 。这会使组件层次结构无效。

来自invalidate()的API文档:

  

任何与布局相关的信息发生变化时自动调用此方法(例如,设置组件的边界,或将组件添加到容器)。

添加面板后,只需致电setVisible ,或致电revalidate()(我建议在添加所有内容后致电setVisible

pan应声明为:

JPanel pan = new Main();

不像您现在拥有的那样JPanel pan = new JPanel()

目前,您正在使用普通JPanel,而不是Main的实例,它是包含您的绘图代码的类。

答案 2 :(得分:2)

您在paintComponent类中定义了Main方法,但是您没有向帧中添加Main的任何实例。使用自定义paintComponent方法编写JPanel的子类不会导致所有普通JPanel(如JPanel pan = new JPanel())拥有该方法。只有Main类的实例才能拥有它。

简而言之,改变一下:

private static JPanel pan = new JPanel();

到此:

private static JPanel pan = new Main();

答案 3 :(得分:1)

我不明白你要做什么,但你根本不需要自己打电话给paintComponent。当您显示方法所在的组件时,会自动调用它。

您需要创建JFrame,将Component放在其上,然后显示JFrame。尝试一些Swing入门教程。

答案 4 :(得分:0)

您不能直接致电paint - 请参阅this answer

您需要@Override paintComponent方法(看起来您的方法并未将您的方法标记为已覆盖),然后每当您的组件(在这种情况下,您的框架的内容窗格)由Swing重新绘制,它会自动调用paintComponent

要自己触发,无论出于何种原因(例如,如果您要渲染动画),只需在组件上调用repaint()即可。但是,我不会过度。

编辑:忘记了paintComponent()的一个关键部分。

public void paintComponent(Graphics g) {
    super.paintComponent(g); // you need to be calling this to ensure the hierarchy is respected
    System.out.println("ok");
    g.drawRect(10, 10, 50, 50);
    g.setColor(Color.GREEN);
}

答案 5 :(得分:-1)

所以,我会告诉你我的编辑



package proj1;

import javax.swing.*;
import java.awt.*;

public class Main extends JPanel {
	
	private static JPanel pan = new JPanel();
	private static JButton valider = new JButton("Valider");
	
	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g); 
		System.out.println("ok"); //It doesn't display ok
		g.drawRect(10, 10, 50, 50);
		g.setColor(Color.GREEN);
	}
	
	
	public static void fenetre() {
		JFrame fenetre = new JFrame("Fenetre");
		fenetre.setVisible(true);
		fenetre.setSize(480,272);
		fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pan.add(valider);
		fenetre.add(pan);
		fenetre.revalidate();
		//fenetre.repaint();
		fenetre.setContentPane(pan);
		fenetre.getContentPane().setBackground(Color.BLUE);
		
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("Lancement du programme");
		fenetre();
		
	}

}