2012-11-19 39 views
6

Trong dự án xoay hiện tại của tôi, tôi có JList hiển thị tất cả các ổ cắm hoạt động và mỗi ô có JButton để đóng ổ cắm đó. Nhưng số JButton trong ô không thể nhấp được: người nghe không bị sa thải.JButton trong ô JList không thể nhấp vào

Tôi đã sửa đổi mã thành mức tối thiểu như sau.

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()); 

Danh sách có vẻ ổn nhưng nút không thể nhấp vào được. Tôi có sai hay JList không hỗ trợ JButton khi bị sa thải?

Trả lời

3

Render không phải là thành phần "thực", chúng là "tem cao su" được vẽ lên bề mặt của thành phần gốc. Họ không có sự hiện diện "thể chất".

A JList sẽ chỉ có một phiên bản kết xuất và được sử dụng để "đóng dấu" từng mục trong mô hình danh sách vào chế độ xem.

Hết hộp, JList không thể chỉnh sửa được.

5

Dưới đây là một ví dụ mà dường như để làm việc, mặc dù bạn không nhận được hiệu ứng hình ảnh cùng một nút nhấp chuột bình thường. Có lẽ ai đó với kỹ năng vẽ tốt hơn tôi có thể cải thiện điều này để mô phỏng hiệu ứng nút bấm trực quan.

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; 
    } 
    } 
} 

Ngoài ra, bạn luôn có thể bố trí JButtons bạn theo chiều dọc trên một JPanel (sử dụng một GridLayout mới (0,1) có lẽ) và sau đó đặt JPanel của bạn trong một JScrollPane, do đó chế giễu một JList của JButtons.

+0

'ButtonItem item = (ButtonItem) jlist.getModel(). GetElementAt (index);' cho lỗi: Chuỗi không thể được chuyển đổi thành ButtonItem: ( – Dohab

+0

@ Dohab - Sau đó, bạn đã thay đổi ví dụ trong một số cách.Tôi chỉ cố gắng mã ở trên như-là, và nó hoạt động tốt. – splungebob

Các vấn đề liên quan