2010-12-01 15 views
1

Je dois faire un programme qui doit être capable de montrer une matrice sous forme de Jtextfields ou Jtextareas, afin que l'utilisateur puisse y écrire (un numéro de la matrice pour chaque Jtextfield). Le problème est que je n'ai aucune idée de comment créer un JPanel personnalisé avec la taille et la quantité de Jtextfields que l'utilisateur spécifie (un différent à chaque fois). J'ai déjà googlé la question, en vain.Créer une matrice en utilisant JTextFields ou JTextAreas

+0

Pouvez-vous fournir plus de détails sur la manière dont vous souhaitez que le JPanel personnalisé se comporte? Telle, JPanel p = new MyJPanel (lignes, cols) ?? – TechTravelThink

+0

Je prévoyais d'avoir un panneau principal, et ensuite ajouter le panneau contenant le TextFields. Ce panneau aurait un GridLayout en fonction de la taille de la matrice. (n lignes, n colonnes) – Crox

+0

Pourquoi pas un JTable? –

Répondre

1

Jetez un oeil à GridLayout. Il est assez simple de rassembler une grille avec quelques paramètres (ligne et nombre de colonnes). Pour paraphraser la JavaDoc:

public static void main (String[] args) { 


     JPanel panel = new JPanel();  
     panel.setLayout(new GridLayout(3,2)); 
     panel.add(new JTextField("1")); 
     panel.add(new JTextField("2")); 
     panel.add(new JTextField("3")); 
     panel.add(new JTextField("4")); 
     panel.add(new JTextField("5")); 
     panel.add(new JTextField("6")); 

se traduirait par une 3 ligne par 2 grille col de JTextFields

EDIT:

ici est un peu plus dans une classe nommée Demo:

public class Demo { 

public static void main(final String[] args) { 
    if (args.length < 2) { 
     System.out.print("please enter row and col on commandline"); 
    } 
    SwingUtilities.invokeLater(new Runnable(){ 
     public void run() { 
      new Demo(Integer.parseInt(args[0]), Integer.parseInt(args[1])); 

     } 
    }); 

} 


public Demo(int colCnt, int rowCnt) { 
    JFrame frame = new JFrame("Demo"); 
    frame.setSize(600, 600); 
    JPanel panel = new JPanel();  
    panel.setLayout(new GridLayout(colCnt,rowCnt)); 

    for (int i =0; i < rowCnt*colCnt; i++) { 
     panel.add(new JTextField(""+i)); 
    } 

    frame.setContentPane(panel); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
} 
} 
+0

Oui, c'est exactement ce que je prévoyais de faire, le problème est que je ne sais pas comment ajouter le nombre de JTextfields nécessaires après que l'utilisateur indique la taille de la matrice. Il serait nécessaire de les ajouter sur l'exécution, et je ne peux pas trouver un moyen de le faire. – Crox

+0

Essayait de compiler et exécuter votre code afin que je puisse l'examiner et essayer, mais j'ai obtenu l'erreur suivante: Erreur statique: Aucun constructeur dans Demo ne correspond à cette invocation Arguments:() Signatures candidates: Demo (int , int) – Crox

+0

essayez-vous de faire 'new Demo()' quelque part dans le code? – akf

0

Tout d'abord, je voudrais construire un tableau 2d des zones de texte \ areas. Lorsque vous obtenez l'entrée de l'utilisateur, vous pouvez ensuite initialiser les tableaux et "nouveau" tous les widgets. Après avoir ajouté tous les éléments au cadre parent \ frame, vous devrez peut-être faire un calcul en fonction de la taille utilisée et redimensionner votre fenêtre de niveau supérieur. En dehors de cela, comme déjà suggéré, GridLayout sera un bon choix pour le composant parent direct.

Espérons que cela aide.

0

Pour modifier l'apparence lors de l'exécution, tout ce que vous devez faire est de remplacer le contenu par de nouveaux composants. Donc, selon la façon dont vous obtenez votre entrée, vous remplacez les nombres donnés dans la réponse d'Akf avec l'entrée.

panel.setLayout(new GridLayout(rows, columns)); 

puis pour afficher le nouveau panneau vous ajoutez dans le JFrame pourrait cependant être quelque chose avec

add(panel); 

Votre mission le long des lignes de sous-classement un JPanel pour montrer une matrice. J'ai cette impression dans votre formulation. Alors c'est une solution complètement différente.

Si votre seul but est d'implémenter une matrice dans laquelle vous pouvez éditer des valeurs, un JTable est de loin le plus simple. Mettre le texte suivant dans une DFrame

DefaultTableModel data = new DefaultTableModel(3 , 3);// rows, cols 
    JTable table = new JTable(data); 
    add(table); 
    pack(); 
    setVisible(true); 

Cela permettrait également de simplifier la modification de la hauteur et la largeur de la matrice en utilisant data.setRowCount (newValue).