2010-11-14 28 views
1

J'essaie de créer un composant JScrollPane qui peut être réutilisé en fonction du paramètre de chaîne transmis. J'ai créé le code suivant, cela fonctionne si j'utilise JFrame pour incorporer le JScrollPane à l'intérieur, mais quand j'essaye de réutiliser le code en créant le différent JScrollPane le scrollPane n'est pas affiché du tout. Je l'implémente dans un projet de java swing. S'il vous plaît laissez-moi savoir ce qui devrait être fait dans ce..toutes les suggestions sont très appréciées.Problème avec la réutilisation du JScrollPane pour différentes listes personnalisées

Le même problème que j'ai en ce qui concerne la JComboBox, il ne montre pas ...

public class ListComponent extends JScrollPane { 

    private String[] selectedNames; 
    private String[] listNames; 
    private JButton submit, reset; 
    private JPanel subPanel = new JPanel(); 
    private JList list; 
    private JScrollPane scroll; 

    public String getFirstSelectionInList() { 
     return selectedNames[0]; 
    } 

    ListComponent() { 

     /*submit = new JButton("Submit"); 
     reset = new JButton("Reset");*/ 
     subPanel.setLayout(new FlowLayout()); 
     /*subPanel.add(submit); 
     subPanel.add(reset);*/ 
    } 

    ListComponent(String[] listNames) { 
     this(); 
     /*JFrame frame = new JFrame("Creating a JList Component");*/ 

     this.listNames = new String[listNames.length]; 
     this.listNames = listNames; 
     //this.setLayout(new BorderLayout()); 
     //this.setLayout(new ScrollPaneLayout()); 
     JPanel panel = new JPanel(); 
     list = new JList(listNames); 
     scroll = new JScrollPane(list); 
     scroll.setVerticalScrollBarPolicy(
      JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
     /*panel.add(scroll); 
     panel.add(subPanel,BorderLayout.SOUTH);*/ 

     /*frame.add(panel); 
     frame.pack(); 
     frame.setVisible(true);*/ 

     this.setVisible(true); 
     list.addListSelectionListener(listSelectionListener); 
    } 

    ListSelectionListener listSelectionListener = new ListSelectionListener() { 

     public void valueChanged(ListSelectionEvent listSelectionEvent) { 

      boolean adjust = listSelectionEvent.getValueIsAdjusting(); 
      //System.out.println(", Adjusting? " + adjust); 
      if (!adjust) { 
       JList list = (JList) listSelectionEvent.getSource(); 
       int selections[] = list.getSelectedIndices(); 
       Object selectionValues[] = list.getSelectedValues(); 
       int n = selections.length; 
       selectedNames = new String[n]; 
       for (int i = 0; i < n; i++) { 
        if (i == 0) { 
         System.out.print(" Selections: "); 
        } 
        selectedNames[i] = (String) selectionValues[i]; 
        System.out.print(selectedNames[i] 
         + "/" + selectionValues[i]); 
       } 
      } 
     } 
    }; 

    /** @return the selectedNames */ 
    public String[] getSelectedNames() { 
     return selectedNames; 
    } 

    /** @param selectedNames the selectedNames to set */ 
    public void setSelectedNames(String[] selectedNames) { 
     this.selectedNames = selectedNames; 
    } 

    public static void main(String args[]) { 
     String subject[] = {"Math", "Computer", "Phisics", "Chemestry"}; 
     new ListComponent(subject); 
    } 
} 

Répondre

1

public class ListComponent étend JScrollPane

Quoi? Vous ne devriez pas étendre un JScrollPane. Vous n'ajoutez pas de nouvelle fonctionnalité au volet de défilement. Si vous essayez d'ajouter un JList à un JScrollPane, alors je vous suggère de lire l'API JList et de suivre le lien vers le tutoriel Swing sur "Comment utiliser les listes" pour un exemple de travail.

+0

Merci beaucoup .. –

4

@camickr est correct; JPanel est un meilleur "conteneur polyvalent pour les composants légers." Vous pouvez ajouter des composants supplémentaires aux autres zones du BorderLayout utilisées dans l'exemple ci-dessous. C'est aussi une bonne habitude de créer votre interface graphique sur le event dispatch thread.

import java.awt.*; 
import java.util.Arrays; 
import javax.swing.*; 
import javax.swing.event.*; 

/** @see http://stackoverflow.com/questions/4176343 */ 
public class ListPanel extends JPanel { 

    private JList list; 

    public ListPanel(String[] data) { 
     super(new BorderLayout()); 
     list = new JList(data); 
     list.addListSelectionListener(new SelectionHandler()); 
     JScrollPane jsp = new JScrollPane(list); 
     this.add(jsp, BorderLayout.CENTER); 
    } 

    private class SelectionHandler implements ListSelectionListener { 

     @Override 
     public void valueChanged(ListSelectionEvent e) { 
      if (!e.getValueIsAdjusting()) { 
       System.out.println(Arrays.toString(list.getSelectedValues())); 
      } 
     } 
    } 

    private void display() { 
     JFrame f = new JFrame("ListPanel"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

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

      @Override 
      public void run() { 
       String[] data = {"Math", "Computer", "Physics", "Chemistry"}; 
       new ListPanel(data).display(); 
      } 
     }); 
    } 
}