2017-03-20 2 views
0

Ich habe eine JList, mit der Sie auswählen können, welche Optionen Sie "abbrechen" möchten. Wenn Sie auf die Abbrechen-Schaltfläche klicken, druckt ein JLabel, welche Optionen abgebrochen wurden. Wenn ich jedoch versuche, den Code zu testen und die Optionen auswähle und auf "Abbrechen" klicke, druckt JLabel nichts. Also nehme ich an, dass der ActionListener für die Abbrechen-Schaltfläche nicht funktioniert. Ich habe den entsprechenden Code unten enthalten:Java Swing - Jlabel ActionListener druckt keine ausgewählte Checkbox

public class WarehouseInterface extends JFrame{ 
private JFrame frame; 

public WarehouseInterface(){ 

    frame = new JFrame("Warehouse Interface"); 


    DefaultListModel demoList = new DefaultListModel(); 
    HashMap<String, Job> jobHashMap = SharedInformation.jobs; 

    int i = 0; 
    ArrayList<String> jobIDs = new ArrayList<>(); 
    Iterator it = jobHashMap.entrySet().iterator(); 

    while (it.hasNext() && i < 10) { 
     Map.Entry pair = (Map.Entry)it.next(); 
     Job job = (Job) pair.getValue();  
     String jobID = job.getID(); 
     demoList.add(i, jobID); 
     jobIDs.add(jobID); 
     i++; 
    } 

    JList list = new JList(demoList); 
    list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); 
    list.setCellRenderer(new CheckList()); 

    JButton cancel = new JButton("Cancel"); 
    cancel.setFont(new Font("Serif", Font.PLAIN, 14)); 

    JPanel panel2 = new JPanel(); 
    panel2.setLayout(new GridLayout(2,0)); 
    panel2.add(list); 
    panel2.add(cancel); 

    JPanel panel3 = new JPanel(); 
    panel3.setLayout(new GridLayout(3,0)); 
    panel3.add(label3); 

    ActionListener cancelListener = new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e){ 

      for(int index : list.getSelectedIndices()) { 
       String jobID = (String) demoList.get(index); 
       JLabel cancelledJobLabel = new JLabel(jobID); 
       cancelledJobLabel.setPreferredSize(new Dimension(50, 20)); 
       cancelledJobLabel.setFont(new Font("Serif", Font.PLAIN, 18)); 
       cancelledJobLabel.setOpaque(true); 
       panel3.add(cancelledJobLabel); 
       //ERROR HERE :(
      } 

     } 
    }; 
    cancel.addActionListener(cancelListener); 

    frame.add(panel2, BorderLayout.CENTER); 
    frame.add(panel3, BorderLayout.SOUTH); 

    frame.pack(); 
    frame.setVisible(true);  


} 
    class CheckList extends JLabel implements ListCellRenderer { 

     @Override 
     public Component getListCellRendererComponent(JList list, Object value, 
         int index, boolean isSelected, boolean hasFocus) { 

      setComponentOrientation(list.getComponentOrientation()); 

      if (isSelected) { 
       setBackground(Color.RED); 
       setForeground(Color.WHITE); 

      // unselected, and not the DnD drop location 
      } else { 
       setBackground(Color.WHITE); 
       setForeground(Color.BLACK); 
      }; 

      setOpaque(true); 
      setEnabled(list.isEnabled()); 
      setFont(list.getFont()); 
      setText(value.toString()); 
      return this; 
     } 


    } 
+1

'Also ich nehme an, dass der ActionListener für den Abbrechen-Button nicht funktioniert. - - Übernehmen Sie nicht. Teste deine Theorie. Fügen Sie dem ActionLIstener einige System.out.println (...) Anweisungen hinzu, um zu sehen, ob sie jemals ausgeführt werden. – camickr

+0

@camickr Hinzugefügt einige Drucke und sie erschienen, so dass ich denke, das ist nicht das Problem. Die JobID-Zeichenfolge ist keine leere Zeichenfolge, da der ActionListener diese ebenfalls ausgibt. Das einzige Problem, das es sein kann, ist, dass das JLabel cancelledJobLabel es nicht anzeigen möchte. – assassinweed2

+0

@Berger Entschuldigung, das ist nur ein Fehler beim Kopieren und Einfügen. Ich habe den Code oben editiert, um ihn einzuschließen. – assassinweed2

Antwort

3
panel3.add(cancelledJobLabel); 

Wenn Sie Komponenten hinzufügen/entfernen zu einem sichtbaren GUI der Basiscode ist:

panel.add(...); 
panel.revalidate(); 
panel.repaint(); 

Die revalidate() ruft den Layout-Manager. Ansonsten hat die Komponente eine Größe von (0, 0), also gibt es nichts zu malen.

+0

Das hat funktioniert! Ich war mir der Revalidate- oder Repaint-Methode nicht bewusst. Aber wird sie in zukünftigen Code verwenden. Vielen Dank nochmal :) – assassinweed2

+0

@ assassinweed2, froh, dass der Vorschlag geholfen hat. Vergessen Sie nicht, die Antwort zu akzeptieren, indem Sie auf das Häkchen klicken, damit die Leute wissen, dass das Problem gelöst wurde. – camickr