[英]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.