import javax.swing.JLabel;
import javax.swing.*;import java.awt.*;
import java.awt.event.*;
class ChessPiece extends JLabel{

String name;


public ChessPiece(String name){


super(name);

//System.out.println(this.getHeight());
//System.out.println(this.getWidth());

this.name=name;

}


}
public class ChessTest extends JFrame {
static int width;
public ChessTest(){

super("Test");
JPanel JP=new JPanel();
JP.setBorder(BorderFactory.createEmptyBorder(20,60,20,60));
this.getContentPane().add(JP);
ChessPiece CP=new ChessPiece("帅");
width=CP.getWidth();
JP.add(CP);
pack();
setVisible(true);

}




public static void main(String[] args){
ChessTest CT=new ChessTest();
System.out.println(width);
    }

}

解决方案 »

  1.   

    setVisible(true);之前swing还没有调用paint()方法来描绘组件,也没有给组件设置width值,所以getWidth() = 0。
      

  2.   

    是没有描绘也没设置,可是运行后可以显示字符“帅”,都显示字符了JLabel还没有width和height么,没有长和宽哪里来的空间显示字符呢,是不是我对长和宽的理解不对哦。其实我最想问的是下面这个问题,上面的也是由于这个问题搞不懂引起的,索性直接问下大家吧。import javax.swing.JLabel;
    import javax.swing.*;import java.awt.*;
    import java.awt.event.*;
    class ChessPiece extends JLabel{

    String name;


    public ChessPiece(String name){


     //super(name);

    //System.out.println(this.getHeight());
    //System.out.println(this.getWidth());

    this.name=name;
                               public void paint(Graphics g){
                 g.setColor(Color.red);
                 g.setFont(new Font("隶书",Font.BOLD,28));
                 g.drawString(name,20,20);
                 g.fillOval(50,50,20,20);

                 g.drawOval(50,50,20,20); }
    }


    }
    public class ChessTest extends JFrame {
    static int width;
    public ChessTest(){

    super("Test");
    JPanel JP=new JPanel();
    JP.setBorder(BorderFactory.createEmptyBorder(20,60,20,60));
    this.getContentPane().add(JP);
    ChessPiece CP=new ChessPiece("帅");
    width=CP.getWidth();
    JP.add(CP);
    pack();
    setVisible(true);

    }




    public static void main(String[] args){
    ChessTest CT=new ChessTest();
    System.out.println(width);
        }

    }这个程序我原意是想显示一个中国象棋棋子“帅”,但是实际上不显示,我觉得可能是Drawstring的参数中的坐标出了问题,有可能我写的坐标不是在JLabel中,所以我想看下JLabel的坐标范围,于是有了输出width,但是width显示为0,所以我也不知道到底哪里出了差错,大家帮下忙吧。
      

  3.   

    你取值是在描绘之前,窗口显示出来就是描绘好了,所以你能看到。
    你把width=CP.getWidth();放到setVisible(true);方法后面就可以了。
      

  4.   

    再请教下五斗米,这个DrawString为什么不显示
    import javax.swing.*;import java.awt.*;
    import java.awt.event.*; class ChessP extends JLabel{

    String name;


    public ChessP(String name){


    //super(name);
    this.name=name;


    }

    public void paint(Graphics g){
    g.drawString(name,70,35);

    }

    }public class ChessTest extends JFrame {
     int width;
    public ChessTest(){

    super("Test");
    JPanel JP=new JPanel();
    JP.setBorder(BorderFactory.createEmptyBorder(20,60,20,60));
    this.getContentPane().add(JP);
    ChessP CP=new ChessP("hello");

    JP.add(CP);
    setSize(300,300);
    pack();
    setVisible(true);

    System.out.println(CP.getBounds());
    }

    public static void main(String[] args){
    ChessTest CT=new ChessTest();
        }

    }