2012-11-19 4 views
6

現在のスイングプロジェクトでは、すべてのアクティブなソケットを表示するJListがあり、各セルにはそのソケットを閉じるためにJButtonがあります。しかし、細胞内のJButtonはクリック可能ではありません:リスナーは解雇されません。JListセルのJButtonはクリックできません

次のように私は、最小限にコードを変更しました。

private class ConnectionListRenderer extends JButton implements ListCellRenderer { 

    public Component getListCellRendererComponent(JList jlist, Object o, int i, boolean bln, boolean bln1) { 

     addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
       //do something (close the socket in my project) 
      } 
     }); 
     return this; 
    } 
} 


jList.setCellRenderer(new ConnectionListRenderer()); 

リストはうまく見えますが、オンのボタンはクリックできません。私が間違っているかJList単に解雇でJButtonをサポートしていないだろうか?

答えて

3

はのレンダリング「本当の」コンポーネントではない、彼らは親コンポーネントの表面に塗ら「ゴムスタンプ」です。彼らには「肉体的」な存在はない。

JListは、レンダリングのインスタンスを1つだけ持つことになりますと、これは、リストのモデルからの項目の各ビューの上に「スタンプ」に使用されています。箱から出して

は、JListは編集できません。

5

を掲載例を試してみてくださいあなたは、通常のボタンのクリックと同じ視覚効果を得ることはありませんが、ここでは、動作しているようです例です。おそらく、私よりも優れた絵画技能を持つ人が、これを改善して視覚的に押されたボタン効果をシミュレートすることができました。

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 

/** 
* A JList of JButtons. 
*/ 
public class JButtonListDemo implements Runnable 
{ 
    private JList jlist; 

    public static void main(String args[]) 
    { 
    SwingUtilities.invokeLater(new JButtonListDemo()); 
    } 

    public void run() 
    { 
    Object[] items = new ButtonItem[] { 
     new ButtonItem("Apple"), 
     new ButtonItem("Banana"), 
     new ButtonItem("Carrot"), 
     new ButtonItem("Date"), 
     new ButtonItem("Eggplant"), 
     new ButtonItem("Fig"), 
     new ButtonItem("Guava"), 
    }; 

    jlist = new JList(items); 
    jlist.setCellRenderer(new ButtonListRenderer()); 
    jlist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    jlist.setVisibleRowCount(5); 
    jlist.addMouseListener(new MouseAdapter() 
    { 
     @Override 
     public void mouseClicked(MouseEvent event) 
     { 
     clickButtonAt(event.getPoint()); 
     } 
    }); 

    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add(new JScrollPane(jlist)); 
    frame.pack(); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
    } 

    private void clickButtonAt(Point point) 
    { 
    int index = jlist.locationToIndex(point); 
    ButtonItem item = (ButtonItem) jlist.getModel().getElementAt(index); 
    item.getButton().doClick(); 
// jlist.repaint(jlist.getCellBounds(index, index)); 
    } 

    public class ButtonItem 
    { 
    private JButton button; 

    public ButtonItem(String name) 
    { 
     this.button = new JButton(name); 
     button.addActionListener(new ActionListener() 
     { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      System.out.println(button.getText() + " was clicked."); 
     } 
     }); 
    } 

    public JButton getButton() 
    { 
     return button; 
    } 

    @Override 
    public String toString() 
    { 
     return button.getText(); 
    } 
    } 

    class ButtonListRenderer extends JButton implements ListCellRenderer 
    { 
    public Component getListCellRendererComponent(JList comp, Object value, int index, 
                boolean isSelected, boolean hasFocus) 
    { 
     setEnabled(comp.isEnabled()); 
     setFont(comp.getFont()); 
     setText(value.toString()); 

     if (isSelected) 
     { 
     setBackground(comp.getSelectionBackground()); 
     setForeground(comp.getSelectionForeground()); 
     } 
     else 
     { 
     setBackground(comp.getBackground()); 
     setForeground(comp.getForeground()); 
     } 

     return this; 
    } 
    } 
} 

また、あなたは常に(おそらく新しいのGridLayout(0,1)を使用して)JPanelの上に垂直あなたのJButtonがをレイアウトでき、その後、これJButtonがのJListのをからかっ、JScrollPaneの中であなたのJPanelを置きます。

+0

'ButtonItem item =(ButtonItem)jlist.getModel()。getElementAt(index);'エラー:StringをButtonItemに変換できません:( – Dohab

+0

@ DoHab - 次に、あなたは何らかの方法でサンプルを変更しました。私はちょうど上記のコードを試してみましたが、うまく動作します。 – splungebob

関連する問題