我想调用我的第一种方法,但它不起作用。更多,我没有印刷品。但是我想画画而且什么也没画。
我根据你的答案编辑了它......
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();
}
}
答案 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();
}
}