哪位兄弟能帮我看看啊,为什么我的paintComponent()没有被调用?
[Java code]
package fistTest;import javax.swing.*;
import java.awt.*;
import java.awt.event.*; 
public class MainFace extends JFrame implements ActionListener, MouseListener,MouseMotionListener{
int xStart=0,yStart=0,xEnd=0,yEnd=0;
Container c = this.getContentPane();
JMenuBar jmb = new JMenuBar();  JMenu jm1 = new JMenu("第一次实验"); 
JMenu jm2 = new JMenu("说明"); 
JMenu jm3 = new JMenu("帮助"); JMenuItem jmi1 = new JMenuItem("ADD算法画线(A)"); 
JMenuItem jmi2 = new JMenuItem("中点算法画线(M)"); 
JMenuItem jmi3 = new JMenuItem("Bresenham算法画线(B)"); 
JMenuItem jmi4 = new JMenuItem("退出(X)");
JMenu jm4 = new JMenu("演示画线(Y)"); JMenuItem jmiy1 = new JMenuItem("ADD画线演示(U)"); 
JMenuItem jmiy2 = new JMenuItem("中点画线演示(C)"); 
JMenuItem jmiy3 = new JMenuItem("Bresenham画线演示(P)"); 
JMenuItem jmi5 = new JMenuItem("作者(T)"); 
JMenuItem jmi6 = new JMenuItem("日期和时间");  JMenuItem jmi7 = new JMenuItem("help(E)"); 

MainFace(){
setLocation(250,150);
setSize(550, 500);
setTitle("第一次实验");
setVisible(true);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addMouseListener(this);
addMouseMotionListener(this);

c.setLayout(new BorderLayout());
c.add(jmb,BorderLayout.NORTH); jmb.add(jm1);
jm1.setMnemonic('f'); 
jm1.addActionListener(this); 
jmb.add(jm2);
jm2.setMnemonic('s');
jmb.add(jm3);
jm3.setMnemonic('h');

jm1.add(jmi1);
jmi1.addActionListener(this); 
jmi1.setAccelerator(KeyStroke.getKeyStroke('A',Event.CTRL_MASK,false));
jm1.add(jmi2);
jmi2.addActionListener(this); 
jmi2.setAccelerator(KeyStroke.getKeyStroke('M',Event.CTRL_MASK,false));
jm1.add(jmi3);
jmi3.addActionListener(this); 
jmi3.setAccelerator(KeyStroke.getKeyStroke('B',Event.CTRL_MASK,false)); 
jm1.addSeparator();
jm1.add(jm4);
jm1.addSeparator();
jm1.add(jmi4);
jmi4.addActionListener(this); 
jmi4.setAccelerator(KeyStroke.getKeyStroke('X',Event.CTRL_MASK,false)); 

jm2.add(jmi5);
jmi5.addActionListener(this);
jm2.add(jmi6);
jmi6.addActionListener(this);

jm3.add(jmi7);
jmi7.addActionListener(this);

jm4.add(jmiy1);
jmiy1.setAccelerator(KeyStroke.getKeyStroke('U',Event.CTRL_MASK,false)); 
jmiy1.addActionListener(this); 
jm4.add(jmiy2);
jmiy2.setAccelerator(KeyStroke.getKeyStroke('C',Event.CTRL_MASK,false)); 
jmiy2.addActionListener(this); 
jm4.add(jmiy3);
jmiy3.setAccelerator(KeyStroke.getKeyStroke('P',Event.CTRL_MASK,false)); 
jmiy3.addActionListener(this);

//new Thread(this).start();

}
public static void main(String[] args){
try{
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
}catch(UnsupportedLookAndFeelException e){
System.out.print("UnsupportedLookAndFeelException");
}catch(IllegalAccessException e){}catch(InstantiationException e){}catch(ClassNotFoundException e){}
new MainFace();
}

public void actionPerformed(ActionEvent e){ 
Cursor cu = new Cursor(Cursor.CROSSHAIR_CURSOR);        
setCursor(cu);

}
public void mouseClicked(MouseEvent arg0) { 
//  TODO Auto-generated method stub  } 
public void mousePressed(MouseEvent arg0) { 
xStart=arg0.getX();
yStart=arg0.getY();
repaint();

public void mouseReleased(MouseEvent arg0) { 
//  TODO Auto-generated method stub 

public void mouseExited(MouseEvent arg0){
//  TODO Auto-generated method stub 
}
public void mouseEntered(MouseEvent arg0){
//  TODO Auto-generated method stub 
}
public void mouseMoved(MouseEvent arg0){
//  TODO Auto-generated method stub 
}
public void mouseDragged(MouseEvent arg0){
xEnd=arg0.getX();
yEnd=arg0.getY();
repaint();
}
public void paintComponent(Graphics g){
System.out.println("start已赋值"+"xStart="+xStart+" yStart="+yStart);
System.out.println("End已赋值"+"xEnd="+xEnd+" yEnd="+yEnd);
g.drawLine(xStart, yStart, xEnd, yEnd);
}
}
[/code]

解决方案 »

  1.   

    一句话,把paintComponent改成paint.
      

  2.   

    可是改成paint后,我的菜单就没了~
      

  3.   

    你的main函数里没实例化啊
      

  4.   

    谁能告诉我paint和paintComponent的区别,谢谢啦。
      

  5.   


    import javax.swing.*;import java.awt.*;
    import java.awt.event.*;public class MainFace extends JFrame implements ActionListener, MouseListener,
    MouseMotionListener {
    int xStart = 0, yStart = 0, xEnd = 0, yEnd = 0;
    Container c = this.getContentPane();
    JMenuBar jmb = new JMenuBar(); JMenu jm1 = new JMenu("第一次实验");
    JMenu jm2 = new JMenu("说明");
    JMenu jm3 = new JMenu("帮助"); JMenuItem jmi1 = new JMenuItem("ADD算法画线(A)");
    JMenuItem jmi2 = new JMenuItem("中点算法画线(M)");
    JMenuItem jmi3 = new JMenuItem("Bresenham算法画线(B)");
    JMenuItem jmi4 = new JMenuItem("退出(X)");
    JMenu jm4 = new JMenu("演示画线(Y)"); JMenuItem jmiy1 = new JMenuItem("ADD画线演示(U)");
    JMenuItem jmiy2 = new JMenuItem("中点画线演示(C)");
    JMenuItem jmiy3 = new JMenuItem("Bresenham画线演示(P)");
    JMenuItem jmi5 = new JMenuItem("作者(T)");
    JMenuItem jmi6 = new JMenuItem("日期和时间"); JMenuItem jmi7 = new JMenuItem("help(E)"); MainFace() {
    setLocation(250, 150);
    setSize(550, 500);
    setTitle("第一次实验");
    setVisible(true);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    addMouseListener(this);
    addMouseMotionListener(this); c.setLayout(new BorderLayout());
    c.add(jmb, BorderLayout.NORTH); jmb.add(jm1);
    jm1.setMnemonic('f');
    jm1.addActionListener(this);
    jmb.add(jm2);
    jm2.setMnemonic('s');
    jmb.add(jm3);
    jm3.setMnemonic('h'); jm1.add(jmi1);
    jmi1.addActionListener(this);
    jmi1
    .setAccelerator(KeyStroke.getKeyStroke('A', Event.CTRL_MASK,
    false));
    jm1.add(jmi2);
    jmi2.addActionListener(this);
    jmi2
    .setAccelerator(KeyStroke.getKeyStroke('M', Event.CTRL_MASK,
    false));
    jm1.add(jmi3);
    jmi3.addActionListener(this);
    jmi3
    .setAccelerator(KeyStroke.getKeyStroke('B', Event.CTRL_MASK,
    false));
    jm1.addSeparator();
    jm1.add(jm4);
    jm1.addSeparator();
    jm1.add(jmi4);
    jmi4.addActionListener(this);
    jmi4
    .setAccelerator(KeyStroke.getKeyStroke('X', Event.CTRL_MASK,
    false)); jm2.add(jmi5);
    jmi5.addActionListener(this);
    jm2.add(jmi6);
    jmi6.addActionListener(this); jm3.add(jmi7);
    jmi7.addActionListener(this); jm4.add(jmiy1);
    jmiy1.setAccelerator(KeyStroke
    .getKeyStroke('U', Event.CTRL_MASK, false));
    jmiy1.addActionListener(this);
    jm4.add(jmiy2);
    jmiy2.setAccelerator(KeyStroke
    .getKeyStroke('C', Event.CTRL_MASK, false));
    jmiy2.addActionListener(this);
    jm4.add(jmiy3);
    jmiy3.setAccelerator(KeyStroke
    .getKeyStroke('P', Event.CTRL_MASK, false));
    jmiy3.addActionListener(this); // new Thread(this).start(); } public static void main(String[] args) {
    try {
    UIManager
    .setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
    } catch (UnsupportedLookAndFeelException e) {
    System.out.print("UnsupportedLookAndFeelException");
    } catch (IllegalAccessException e) {
    } catch (InstantiationException e) {
    } catch (ClassNotFoundException e) {
    }
    new MainFace();
    } public void actionPerformed(ActionEvent e) {
    Cursor cu = new Cursor(Cursor.CROSSHAIR_CURSOR);
    setCursor(cu); } public void mouseClicked(MouseEvent arg0) {
    // TODO Auto-generated method stub } public void mousePressed(MouseEvent arg0) {
    xStart = arg0.getX();
    yStart = arg0.getY();
    repaint();
    } public void mouseReleased(MouseEvent arg0) {
    // TODO Auto-generated method stub
    } public void mouseExited(MouseEvent arg0) {
    // TODO Auto-generated method stub
    } public void mouseEntered(MouseEvent arg0) {
    // TODO Auto-generated method stub
    } public void mouseMoved(MouseEvent arg0) {
    // TODO Auto-generated method stub
    } public void mouseDragged(MouseEvent arg0) {
    xEnd = arg0.getX();
    yEnd = arg0.getY();
    repaint();
    } //加入这个方法就好了,因为调用repaint,是调用update,然后调用paint方法,所以
    //你的方法就没调用,所以覆盖父类的paint方法,在里面调用你的方法,就行了
    @Override
    public void paint(Graphics g) {
    super.paint(g);
    paintComponent(g);
    }

    public void paintComponent(Graphics g) {
    System.out.println("start已赋值" + "xStart=" + xStart + " yStart="
    + yStart);
    System.out.println("End已赋值" + "xEnd=" + xEnd + " yEnd=" + yEnd);
    g.drawLine(xStart, yStart, xEnd, yEnd);
    }
    }这样就好了,具体说明见代码中的注释!
      

  6.   

    还有一种改法,覆盖父类的paint方法,把你paintComponet中的代码放到paint方法中,注意在子类paint方法的开始加上:super.paint(g);否则菜单等会画不出来!
      

  7.   

    MainFace face=new MainFace();
    face.show(0;
      

  8.   

    有啊,这个不是吗?
    new MainFace();
      

  9.   

    你可以另外定义一个Panel,在Panel中划线然后把Panel加到顶层容器Frame中