我想在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);
}
}
}
答案 0 :(得分:1)
您正在使用BoxLayout
,因此setLocation()
不适合您。正如@HovercraftFullOfEels所说; JList
支持图片图标。您可以编写ListCellRenderer
来设计非常自定义的列表。 Here是使用自定义渲染器和拖放支持的JList
的一个很好的示例。它可以作为您的指南。