繁体   English   中英

如何称油漆(g)?

[英]How to call Paint(g)?

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

我根据您的回答进行了编辑...

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();

    }

}

我有“公共类Main扩展JPanel”,但是什么也没发生。

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

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

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

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

从API文档获取invalidate()

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

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


pan应该声明为:

JPanel pan = new Main();

不像您当前拥有的JPanel pan = new JPanel()那样。

现在,您当前使用的是普通的JPanel ,而不是Main的实例, Main的实例包含绘画代码。

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

简而言之,更改此:

private static JPanel pan = new JPanel();

对此:

private static JPanel pan = new Main();

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

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

您不会直接打电话给paint请看这个答案

您需要@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);
}

所以,我将向您展示我的修改

 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(); } } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM