2012-03-27 209 views
2

我正在處理的應用程序需要使用JList,其中每個ListItem是一個標籤,後跟一個按鈕。JButton沒有響應點擊事件

我所做的是我創建了一個具有字符串成員的文本字段的類,並將類對象添加到Jlist。

現在的按鈕,我實現了一個自定義列單元格渲染這是因爲:

public renderer() 
{ 
    text=new JLabel(); 
    button=new JButton("Track"); 
    button.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      // TODO Auto-generated method stub 
      System.out.println("Hey"); 

     } 
}); 
} 

public Component getListCellRendererComponent(JList list, Object value, int index,boolean isSelected, boolean cellHasFocus) 
{ 
    it=(item)list.getModel().getElementAt(index); 
    text.setText(it.tex); 
    return this; 
} 

public void paintComponent(Graphics g) 
{ 
    this.add(text); 
    this.add(button); 
    this.setVisible(true); 
} 

public Dimension getpreferredSize(){ 
    Font font=UIManager.getDefaults().getFont("JLabel.Font"); 
    Graphics g=getGraphics(); 
    FontMetrics fm=g.getFontMetrics(font); 
    return new Dimension(fm.stringWidth(it.tex)+button.getWidth(),fm.getHeight()>button.getWidth()?fm.getHeight():button.getWidth()); 
} 
} 

但按鈕無響應,當我點擊it.What我錯過?

感謝

+2

爲了更快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。另外,使用代碼格式時請注意查看輸出。最後一個'}'不是代碼格式。 – 2012-03-27 09:26:45

+0

請學習java命名約定並堅持使用它們。 – kleopatra 2012-04-06 09:58:18

回答

1

您應該創建一個自定義列表單元格編輯器也至極從ListCellRenderer重用代碼外觀精美,而且按鈕實現動作偵聽器。 單元格渲染器僅用於在列表中標記圖形圖像。要在JList中使用控件,您應該使用單元格編輯器。

+0

用於解釋渲染器,編輯器爲-1:核心JList沒有可編輯性的概念 – kleopatra 2012-04-06 09:52:54

1
  • Renderer只有即將dispaying和JComponetsJListJComboBoxJTable,基本上一切都在JListJTable教程描述,格式化然後使用JList就可以就可以只

enter image description hereenter image description hereenter image description here

  • 也許我錯了,但我覺得比沒有別的,從JList你不能返回JButtons被點擊或另一JButton's events,只有通過在JList選擇,肯定通過這個事件,你可以產生等待事件的GUI,但僅從JList選擇,而不是從JButton

代碼

import java.awt.*; 
import javax.swing.*; 

public class ListPanel extends JFrame { 

    private static final long serialVersionUID = 1L; 

    public ListPanel() { 
     DefaultListModel model = new DefaultListModel(); 
     model.addElement(createPanel("one")); 
     model.addElement(createPanel("two")); 
     model.addElement(createPanel("three")); 
     model.addElement(createPanel("four")); 
     JList list = new JList(model); 
     list.setCellRenderer(new PanelRenderer()); 
     add(list); 
    } 

    public static JButton createPanel(String text) { 
     JButton panel = new JButton(text); 
     return panel; 
    } 

    public static void main(String[] args) { 
     ListPanel frame = new ListPanel(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    class PanelRenderer implements ListCellRenderer { 

     public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
      JButton renderer = (JButton) value; 
      renderer.setBackground(isSelected ? Color.red : list.getBackground()); 
      return renderer; 
     } 
    } 
} 
  • 你有農具自己Editor,從來沒有試過JList,是因爲有未接importand方法比較JTable

  • JTable取代JList,沒有TableHeader並且只有一個Column

  • follows only!!! with code by @camickr創建JTable

EDIT(@Jakub Zaverka)

enter image description here

import java.awt.*; 
import javax.swing.*; 

public class ListPanel extends JFrame { 

    private static final long serialVersionUID = 1L; 

    public ListPanel() { 
     setLayout(new GridLayout(0, 2, 10, 10)); 
     DefaultListModel model = new DefaultListModel(); 
     model.addElement(createButtons("one")); 
     model.addElement(createButtons("two")); 
     model.addElement(createButtons("three")); 
     model.addElement(createButtons("four")); 
     model.addElement(createButtons("five")); 
     model.addElement(createButtons("six")); 
     model.addElement(createButtons("seven")); 
     model.addElement(createButtons("eight")); 
     model.addElement(createButtons("nine")); 
     model.addElement(createButtons("ten")); 
     model.addElement(createButtons("eleven")); 
     model.addElement(createButtons("twelwe")); 
     JList list = new JList(model); 
     list.setCellRenderer(new PanelRenderer()); 
     add(new JScrollPane(list)); 
     add(new JScrollPane(createPanel())); 
    } 

    public static JPanel createPanel() { 
     JPanel panel = new JPanel(); 
     panel.setLayout(new GridLayout(0, 1, 1, 1)); 
     panel.add(createButtons("one")); 
     panel.add(createButtons("two")); 
     panel.add(createButtons("three")); 
     panel.add(createButtons("four")); 
     panel.add(createButtons("five")); 
     panel.add(createButtons("six")); 
     panel.add(createButtons("seven")); 
     panel.add(createButtons("eight")); 
     panel.add(createButtons("nine")); 
     panel.add(createButtons("ten")); 
     panel.add(createButtons("eleven")); 
     panel.add(createButtons("twelwe")); 
     return panel; 
    } 

    public static JButton createButtons(String text) { 
     JButton button = new JButton(text); 
     return button; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 
       ListPanel frame = new ListPanel(); 
       frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
       //frame.pack(); 
       frame.setSize(270, 200); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    class PanelRenderer implements ListCellRenderer { 

     public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
      JButton renderer = (JButton) value; 
      renderer.setBackground(isSelected ? Color.red : list.getBackground()); 
      return renderer; 
     } 
    } 
} 
2

爲什麼去與JList中,渲染器和編輯器這麼大的麻煩,當你可以簡單地用箱佈局創建一個JPanel,把所有的標籤和按鈕內,然後顯示此面板中一個滾動窗格。代碼會很短,不會有任何行爲上的麻煩。

一般來說,放置其他組件是JTable等組件,JList幾乎總是比它更值得的麻煩。

+0

但滾動與JList或JTable相比不自然,需要定製scrollIncrement +1 – mKorbel 2012-03-27 11:28:29

+0

@mKorbel我不同意。 JPanel的滾動方式與JTable或JList中的相同。 – 2012-03-27 11:46:06

+0

JList/JTable返回與JPanel返回值相比較的行:-) – mKorbel 2012-03-27 12:13:02

0

@Jakub Zaverka我同意,我已經使用這個,它工作正常。 @nikel我建議你使用GridBagLayout和GridBagConstraint來管理你的組件。

+0

好吧,我用JTable解決了:) – nikel 2012-03-27 12:21:10