【发布时间】:2016-08-28 23:12:35
【问题描述】:
我想在 Swing 中使用 JLabels 创建一个自定义列表。 (很像 VLC 播放列表)。我选择 JLabels 而不是 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);
}
}
}
【问题讨论】:
-
代码...发布代码!!
-
"The reason I chose JLabels instead of a JTable or List is that it allows more customizing like imageIcons easily."-- 这就是我不选择 JLabels 的原因。 JTables,尤其是 JLists 可以很好地处理 ImageIcons,并且比您手动编写 JLabel 构造更容易实现。 -
@HovercraftFullOfEels 谢谢。我检查了JList,发现它会使用A CellRenderer来使用图像?无论如何,我实现了它,到目前为止效果很好。
-
使用
JList实现这一目标会容易得多
标签: java swing media-player jlabel