2012-11-19 14 views
6

मेरे वर्तमान स्विंग प्रोजेक्ट में मेरे पास JList सभी सक्रिय सॉकेट प्रदर्शित कर रहा है, और प्रत्येक सेल में उस सॉकेट को बंद करने के लिए JButton है। लेकिन सेल में 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 में रेंडर का केवल एक उदाहरण होगा और इसका उपयोग सूची मॉडल से प्रत्येक आइटम को "स्टैंप" करने के लिए किया जाता है।

बॉक्स के बाहर, 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; 
    } 
    } 
} 

वैकल्पिक रूप से, आप हमेशा अपने JButtons एक JPanel पर लंबवत (एक नई GridLayout (0,1 का प्रयोग करके) शायद) लेआउट सकते हैं और फिर, एक jScrollPane में अपने JPanel डाल इस प्रकार JButtons की एक JList मजाक।

अपने JList_ संभव नहीं के साथ एक ही _Do
+0

'ButtonItem आइटम = (ButtonItem) jlist.getModel() getElementAt (सूचकांक);' देता त्रुटि:। स्ट्रिंग ButtonItem में परिवर्तित नहीं किया जा सकता है :( – Dohab

+0

@ डोहाब - फिर आपने कुछ तरीकों से उदाहरण बदल दिया है। मैंने अभी उपरोक्त कोड को आजमाया है, और यह ठीक काम करता है। – splungebob

संबंधित मुद्दे