import java.awt.*;
import javax.swing.*;
import java.awt.Graphics;class Test extends JFrame{
public static void main(String args[]){
Test frame = new Test();
frame.setSize(400,300);
frame.setVisible(true);
}
public void paint(Graphics g){
g.drawString("abc",10,10);
System.out.println("paintint..");
}
public void paintComponent(Graphics g){
System.out.println("in paint component...");
g.drawString("bcd",20,20);
}
}paint()调用了 为什么abc却没显示,还有 什么时候调用paintComponent方法呢?
第一,如果要在JFrame上添加什么东西或者绘制图形,需要获得其contentPane在contentPane上面操作才行,直接操作add或者重绘是没有意义的
第二,重新paint方法的时候没有调用super.paint(g),导致图形界面实际什么也没有
第三,JFrame不是JComponent的子类,因此根本就不会有paintComponent(Graphics g)的调用,因此你的第二个问题根本不存在,什么时候都不调用paintComponent(Graphics g)方法,除非你程序里面主动调用下面给你一个能显示出来abc字符串的例子,你看看import java.awt.*;
import javax.swing.*;
import java.awt.Graphics;class Test extends JFrame{
public static void main(String args[]){
Test frame = new Test();
frame.setSize(400,300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void paint(Graphics g){
super.paint(g);
Container c=this.getContentPane();
Graphics gg=c.getGraphics();
gg.drawString("abc",10,10);
// this.repaint();
System.out.println("paintint..");
}
//这段代码除非显式地直接调用,否则什么时候都不会调用
// @Override 因为paintConponent方法没有在JFrame父类定义,@Override写在这里报错
public void paintComponent(Graphics g){
System.out.println("in paint component...");
g.drawString("bcd",20,20);
}
}
import javax.swing.*;
import java.awt.Graphics;class Test extends JFrame{
public static void main(String args[]){
Test frame = new Test();
frame.setSize(400,300);
frame.setVisible(true);
frame.add(new Panel());
Panel pp = new Panel();
}
public void paint(Graphics g){
//g = this.getContentPane().getGraphics();
// g = this.pp.getContentPane.getGraphics();
g.drawString("abc",10,10);
System.out.println("paintint..");
}
public void paintComponent(Graphics g){
System.out.println("in paint component...");
g.drawString("bcd",20,20);
}
}
import javax.swing.*;
import java.awt.Graphics;class Test extends JFrame{
public static void main(String args[]){
Test frame = new Test();
JPanel board = new PaintBoard();
board.setOpaque(false);
frame.add(board);
frame.setSize(400,300);
frame.setVisible(true);
} @Override
public void paint(Graphics g){
super.paint(g);
g.drawString("abc",10,10); System.out.println("paintint..");
} private static class PaintBoard extends JPanel{
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
System.out.println("in paint component...");
g.drawString("bcd",20,20);
}
}
}
add方法已经被修改了,可以用来添加组件。
import javax.swing.*;
import java.awt.Graphics;class Test extends JPanel{
public static void main(String args[]){
Frame frame = new Frame();
frame.setSize(400,300);
frame.setVisible(true);
Test test = new Test();
test.setSize(100,100);
test.setBackground(Color.black);
test.setVisible(true);
frame.add(test);
}
public void paint(Graphics g){
//super.paint(g);
//g = this.getGraphics();
g.drawString("abc",10,10);
System.out.println("paintint..");
}
public void paintComponent(Graphics g){
System.out.println("in paint component...");
g.drawString("bcd",20,20);
}
}有继承jpanel类的对象生成 为什么没有调用paintComponent方法,还有 paint()怎么也
对照你的代码,看看我改了哪里import java.awt.*;
import javax.swing.*;
import java.awt.Graphics;class Test extends JPanel{
public static void main(String args[]){
JFrame frame = new JFrame();
frame.setSize(400,300);
frame.setVisible(true);
Test test = new Test();
test.setSize(100,100);
test.setBackground(Color.black);
// test.setVisible(true);
frame.add(test);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
} @Override
public void paint(Graphics g){
super.paint(g);
//g = this.getGraphics();
g.drawString("abc",10,10);
System.out.println("paintint..");
} @Override
public void paintComponent(Graphics g){
System.out.println("in paint component...");
g.drawString("bcd",20,20);
}
}