在Swing Java中创建自定义列表

时间:2016-05-03 18:46:37

标签: java swing media-player jlabel

我想在Swing中使用JLabel创建自定义列表。 (很像VLC播放列表)。我选择JLabel而不是JTable或List的原因是它允许更容易地像imageIcons那样进行自定义。

但现在我遇到了问题。我希望能够通过拖动来上下移动标签(更改行顺序)。 JLables在boxlayout中被视为列表。有人可以帮我弄这个吗? 我可以在设置Jlabels的位置后重新绘制jPanel吗?

public class playListPanel extends JPanel {
private mediaList mdList;
private JPanel base;
private JScrollPane scrollPane;
private boolean locked = false;
private JLabel lockedlb ;
public playListPanel(mediaList mdList){


    this.mdList = mdList;
    this.setLayout(new BorderLayout());
      init();  
     this.addMouseListener(new MouseAdapter(){
         public void mouseMoved(MouseEvent evt){
               if(locked){
                lockedlb.setLocation(evt.getPoint());
                base.repaint();
               }
            }
            public void mouseDragged(MouseEvent evt){
               lockedlb.setLocation(evt.getPoint());
               base.repaint();

            }
            public void mouseRelease(MouseEvent evt){
               if(locked){
               int y = evt.getY();
               int n = y%20;
               mediaList temp = (mediaList) mdList.copy();
               temp.remove(Integer.getInteger(lockedlb.getName())-1);
                 temp.insert(mdList.get(Integer.getInteger(lockedlb.getName())-1),n);
               mdList.set(temp);
               init();
               base.repaint();
               locked = true;
               }else{
               } 
            }

    });
}

public void init(){
     base = new JPanel();
    base.setPreferredSize(new Dimension(300,0));
    scrollPane = new JScrollPane(base);

    base.setLayout(new BoxLayout(base,BoxLayout.Y_AXIS));

    int i= 0;
    for(Object m : this.mdList){
        i = i+1;
        media temp = (media)m;
        JLabel label = new JLabel(" "+ temp.getMediaTitle());
        label.setName("" +i);
        label.setMaximumSize(new Dimension(label.getPreferredSize().width,label.getPreferredSize().height+4 ));
        label.addMouseListener(new MouseAdapter(){

            public void mousePressed(MouseEvent evt){
                locked =true;
                lockedlb = label;
                //label.setLocation(evt.getPoint());
            }

            public void mouseMoved(MouseEvent evt){
               if(locked){
                lockedlb.setLocation(evt.getPoint());
                base.repaint();
               }
            }
            public void mouseDragged(MouseEvent evt){
               lockedlb.setLocation(evt.getPoint());
               base.repaint();

            }
            public void mouseRelease(MouseEvent evt){
               if(locked){
               int y = evt.getY();
               int n = y%20;
               mediaList temp = (mediaList) mdList.copy();
               temp.remove(Integer.getInteger(lockedlb.getName())-1);
               temp.insert(mdList.get(Integer.getInteger(lockedlb.getName())-1),n);
               mdList = temp;
               init();
               base.repaint();
               locked = true;
               }else{
               }
               }

        }
        );
        base.add(label);
        this.add(base,BorderLayout.CENTER);
    }
}
}

1 个答案:

答案 0 :(得分:1)

您正在使用BoxLayout,因此setLocation()不适合您。正如@HovercraftFullOfEels所说; JList支持图片图标。您可以编写ListCellRenderer来设计非常自定义的列表。 Here是使用自定义渲染器和拖放支持的JList的一个很好的示例。它可以作为您的指南。