2016-05-03 15 views
0

SwingでJLabelsを使用してカスタムリストを作成したいとします。 (VLCプレイリストのように)。 JTableやListの代わりにJLabelsを選択したのは、imageIconのようなカスタマイズを容易にするためです。Swing Javaでカスタムリストを作成する

今は問題があります。ドラッグすることでラベルを上下に移動できます(行の順序を変更する)。 JLableはボックスレイアウトでリストとして表示されます。誰かがこれで私を助けることができますか? Jabelの位置を設定した後に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); 
    } 
} 
} 
+2

コード...コードを投稿してください! –

+4

'" JTableやListの代わりにJLabelsを選んだのは、imageIconのようなカスタマイズを簡単にできるからです。 "これがJLabelsを選択しない理由です。 JTables、特にJListsはImageIconを非常にうまく処理でき、ハンドコードJLabelの構造を実装するのがずっと簡単です。 –

+0

@HovercraftFullOfEelsありがとうございます。私はJListをチェックして、A CellRendererを使ってイメージを使用することに気付きましたか?とにかく私はそれを実装し、これまでのところうまくいきました。 –

答えて

1

あなたはそうsetLocation()があなたのために動作しませんBoxLayoutを使用しています。 @HovercraftFullOfEelsが言ったように。 JListは画像アイコンをサポートしています。あなたはListCellRendererと書いて非常にカスタムのリストをデザインすることができます。 Hereは、カスタムレンダラと&のドロップサポートを持つJListの良い例です。それはあなたのためのガイドになることができます。

関連する問題