自己的一个Java Application中,对JLabel进行了一下扩展(其中关联了一个JTextArea,以利用JTextArea灵活的文本显示方式),但是如果我不将label add到主窗体上,什么也看不到,如果add到主窗体上则可以达到预期效果,这是为什么呢?
以下是我的code:import java.awt.*;
import javax.swing.*;public class TestLabel extends JFrame {
JLabel label = new XLabel(); public void paint(Graphics g) {
super.paint(g);

label.paint(g);
}

public static void main(String[] args) {
JFrame frame = new TestLabel();
frame.setTitle("Test");
frame.setBounds(100, 100, 100, 100);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.show();
}
}class XLabel extends JLabel {
JTextArea ta = new JTextArea("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); public XLabel() {
ta.setOpaque(false);
ta.setLineWrap(true);
ta.setEditable(false);

this.setOpaque(false);
} public void paint(Graphics g) {
Color oldC = g.getColor(); Rectangle rec = this.getBounds();
ta.setBounds(rec);
g.setColor(Color.RED);
g.fillRect(rec.x, rec.y, rec.width, rec.height); g.setColor(oldC); super.paint(g);
ta.paint(g);
}
}以上代码运行结果什么也看不到,但如果将TestLabel中的paint方法去掉,改成下面的代码,即将其add到主窗体上,则可以达到预期效果:
public TestLabel() {
this.getContentPane().add(label);
}
可是,按照我的需求,我不能将label add到主窗体上。
为什么前面的paint方法不能按预期工作,显示XLabel关联的JTextArea的内容?我的逻辑有什么错误吗?

解决方案 »

  1.   

    你原来的程序没有这句,this.getContentPane().add(label);就没有向ContentPane添加你的label,所以无法Pain,
      

  2.   

    JLabel label = new XLabel();
    XLable label = new XLabel();
      

  3.   

    to mofeir(莫飞):
    个人认为:虽然我原来的代码中没有this.getContentPane().add(label);这一句,但是,当frame调用paint函数的时候,会调用label.paint(g),跟有上面这一句并通过JComponent.paintChildren来绘制各被包容Component应该是一样的。
    顺便请教:除了用this.getContentPane().add(label);将label添加到ContentPane上以外,难道不能在主窗体更新时更新label?to Kala_Yang(卡拉*杨):
    不明白你的意思,由于接口一致,你给出的两行代码是完全等效的。