gpt4 book ai didi

java - 在 Swing Java 中创建自定义列表

转载 作者:行者123 更新时间:2023-12-01 09:58:20 26 4
gpt4 key购买 nike

我想在 Swing 中使用 JLabels 创建自定义列表。 (很像 VLC 播放列表)。我选择 JLabels 而不是 JTable 或 List 的原因是它允许轻松进行更多自定义,例如 imageIcons。

但是现在我遇到了一个问题。我希望能够通过拖动(更改行顺序)来上下移动标签。 JLable 位于盒式布局中,可作为列表查看。有人可以帮我弄这个吗?设置 Jlabel 位置后可以重新绘制 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);
}
}
}

最佳答案

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

关于java - 在 Swing Java 中创建自定义列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37012068/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com