解决方案 »

  1.   

    界面上那四个功能组件是player类里面自己带的吗?
      

  2.   

    是因为你是在frame显示之后才把组件加上去,
    当改变窗口大小的时候窗口要重绘,这时组件才显示出来
    把你加组件的代码放到JF1.setVisible(true);后面就行了这是我改的代码:import javax.swing.JFrame ;
    import javax.swing.JPanel ;import javax.media.ControllerEvent;
    import javax.media.ControllerListener;
    import javax.media.Manager;
    import javax.media.NoPlayerException;
    import javax.media.Player ;
    import javax.media.PrefetchCompleteEvent;
    import javax.media.RealizeCompleteEvent;import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component ;
    import java.awt.Dimension;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;import java.io.IOException;
    import java.net.URL;public class mymp3
    {
    private JFrame JF1 ;
    // private JPanel JP1 ;
    private Player player ;
    private Component com_contrl ;//java中的一个组件
    private ControllerListener conLis ;
    private Dimension dim ;//Java的一个类,封装了一个构件的高度和宽度
    //初始化播放器
    private void ini_player(URL url) throws IOException
    {
    try
    {
    player = Manager.createPlayer(url) ;
    }
    catch(NoPlayerException noE)
    {
    System.out.println("没有发现播放器存在");
    noE.printStackTrace() ;
    }
    }
    //初始化参数
    private void ini_Field()
    {
    JF1 = new JFrame("播放器") ;
    //  JP1 = new JPanel() ;
    dim = new Dimension() ;
    }
    //注册controllerListener
    private void register()
    {
    conLis = new ControllerListener()
    {
    @Override
    public void controllerUpdate(ControllerEvent ce)
    {
    if(ce instanceof RealizeCompleteEvent)
    {
    player.prefetch() ; 
    }
    if(ce instanceof PrefetchCompleteEvent)
    {
    if(com_contrl != null)
    {
    return ;
    }
    else if( (com_contrl = player.getControlPanelComponent())!= null )
    {
    //  JP1.add(com_contrl , BorderLayout.EAST) ;
    JF1.setSize(300 + dim.width , 320+dim.height) ;
    //JF1.validate();
    //JF1.repaint();
    JF1.setVisible(true) ;    JF1.add(com_contrl , BorderLayout.SOUTH) ;//com_contrl.setVisible(true);
    dim = com_contrl.getPreferredSize();}
    else
    {
    System.out.println("添加组件失败");
    }
    }
    }
    } ;
    player.addControllerListener(conLis) ;
    }
    //播放设置
    private void player(URL url) throws IOException
    {
    ini_Field() ;
    ini_player(url) ;
    JF1.addWindowListener(new WindowAdapter()
            {
                public void windowClosing(WindowEvent we)
                {
                    if(player != null)
                    {
                        player.close();
                    }
                    System.exit(0);
                }
            });
    register() ;//  JP1.setPreferredSize(new Dimension(300+dim.width, 50+dim.height)) ;
    //  JP1.setBackground(Color.BLUE) ;
    //JF1.pack();//  JF1.add(JP1 , BorderLayout.SOUTH) ;
    //JF1.add(com_contrl , BorderLayout.SOUTH) ;player.realize() ;
    player.start() ;}
    //构造函数
    public mymp3(URL url) throws IOException
    {
    player(url) ;
    }
    //main函数
    public static void main(String[] args) 
    {
    try
    {
    URL url = new URL("file:///D:\\Music\\My music\\meiyouqing_106015_m.mp3") ;
    if(url.getFile() == null)
    {
    throw new IOException("未找到文件") ;
    }
    else
    {
    new mymp3(url) ;
    }
    }
    catch(IOException ioe)
    {
    ioe.printStackTrace() ;
    }
    }
    }你可以试一试!
      

  3.   

     我是先添加的组件后设置可见的呀,我的107行"JF1.setVisible(true) ;"是在注册完事件监听器之后才写的啊
      

  4.   

    这个确实成立,而且如果我把"JF1.setVisible(true) ;"放在我的第72行也行 , 您能解释一下吗,这是为什么呢?
      

  5.   

    我改的就是把"JF1.setVisible(true) ;"放在你的72行,只要放在  JF1.add(com_contrl , BorderLayout.SOUTH) ;这段代码之前就行了。
      

  6.   

    再麻烦您一下,您能仔细说说这是为什么呢?我实在是想不通,放在"JF1.add(com_contrl , BorderLayout.SOUTH) ;"之前,不是先进行显示,后添加组件吗?  可是您说  "是因为你是在frame显示之后才把组件加上去,
    当改变窗口大小的时候窗口要重绘,这时组件才显示出来"我理解不了,您能再给我解释一下吗?
      

  7.   

    不知道你下来有没有试过,就是把JF1.setVisible(true) ;这句代码放在JF1.add(com_contrl , BorderLayout.SOUTH) ;之前或之后都可以,但两个必须在一块,你若改回你原来的位置就又不行了,这可能和执行顺序有关;执行顺序应该是先添加组件,然后再显示窗口。这样就没问题了。我其实也不太懂,就是发现这个题很有意思,就复制下来调试,解决方法我也是在网上找的!哈哈!希望可以帮到你!
      

  8.   

    嗯嗯,确实是,在构造器里面放在注册代码的前面就不行,不管怎样,解决了,谢谢您,再问您一句,怎么把这个问题的得分给您呢?我之前没有怎么上过CSDN,一直在百度知道里面问问题