【问题标题】:Create a custom list in Swing Java在 Swing Java 中创建自定义列表
【发布时间】: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


【解决方案1】:

您正在使用BoxLayout,所以setLocation() 对您不起作用。正如@HovercraftFullOfEels 所说; JList 支持图片图标。您可以通过编写ListCellRenderer 来设计非常自定义的列表。 Here 是具有自定义渲染器和拖放支持的 JList 的一个很好的例子。它可以为您提供指导。

【讨论】:

    猜你喜欢
    • 2012-02-24
    • 1970-01-01
    • 2013-03-29
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多