2009-10-27 8 views
0

J'essaie d'appeler une méthode à partir d'une classe de panneau, mais cela n'aboutit à rien. Les panneaux peuvent-ils communiquer entre eux? Ou y a-t-il une autre raison pour laquelle cela ne fonctionne pas?Les panneaux peuvent-ils communiquer entre eux?

Appel de la méthode name() dans la classe leftInput.

Classe ButtonPanel.

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

public class ButtonPanel extends JPanel implements View 
{ 
private Prison prison; 
private JButton button = new JButton("Allocate Cell"); 
private LeftInputPanel leftInput; 
private CrimePanel crimePanel; 

public ButtonPanel(Prison prison, LeftInputPanel leftInput) 
{ 
    this.prison = prison; 
    this.leftInput = leftInput; 
    setup(); 
    build(); 
} 

public void setup() 
{ 
} 

public void build() 
{ 
    Dimension size = new Dimension(240, 70); 

    button.setPreferredSize(size); 
    button.setMinimumSize(size); 
    button.setMaximumSize(size); 
    button.addActionListener(new AllocateListener()); 
    add(button); 
} 

public void update() 
{ 
    leftInput.clear(); 
} 

private class AllocateListener implements ActionListener 
{ 
public void actionPerformed(ActionEvent e) 
{ 
    Criminal criminal = new Criminal(leftInput.name()); 
    prison.add(criminal); 
    System.out.println(leftInput.name()); 
} 
} 
} 

Classe leftInput.

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

public class LeftInputPanel extends JPanel 
{  
private Prison prison; 
public JTextField name = new JTextField(); 
public JTextField days = new JTextField(); 
public JTextField months = new JTextField(); 
public JTextField years = new JTextField(); 

public LeftInputPanel(Prison prison) 
{ 
    this.prison = prison; 
    setup(); 
    build(); 
} 

public void setup() 
{ 
    setLayout(new FlowLayout()); 
    Dimension size = new Dimension(100, 190); 

    setPreferredSize(size); 
    setMinimumSize(size); 
    setMaximumSize(size); 
} 

public void build() 
{ 
    JLabel label = new JLabel("Name"); 
    Dimension size = new Dimension(90, 20); 
    name.setPreferredSize(size); 
    add(label); 
    add(name); 
    Box box = Box.createVerticalBox(); 
    box.add(daysPanel()); 
    box.add(monthsPanel());   
    box.add(yearsPanel()); 
    add(box);  
} 

public JPanel daysPanel() 
{ 
    JPanel panel = new JPanel(); 
    panel.setLayout(new FlowLayout(FlowLayout.LEFT)); 
    addField(panel, days, " days"); 
    return panel; 
} 

public JPanel monthsPanel() 
{ 
    JPanel panel = new JPanel(); 
    panel.setLayout(new FlowLayout(FlowLayout.LEFT)); 
    addField(panel, months, " months"); 
    return panel; 
} 

public JPanel yearsPanel() 
{ 
    JPanel panel = new JPanel(); 
    panel.setLayout(new FlowLayout(FlowLayout.LEFT)); 
    addField(panel, years, " years"); 
    return panel; 
} 

public void addField(JPanel panel, JTextField field, String label) 
{ 
    Dimension size = new Dimension(30, 20); 
    field.setPreferredSize(size); 
    field.setMinimumSize(size); 
    field.setMaximumSize(size); 
    panel.add(field); 
    panel.add(new JLabel(label));  
} 

public String name() 
{ 
    return name.getText(); 
} 

public int days() 
{ 
    return Integer.parseInt(days.getText()); 
} 

public int months() 
{ 
    return Integer.parseInt(months.getText()); 
} 

public int years() 
{ 
    return Integer.parseInt(years.getText()); 
} 

public void clear() 
{ 
    name.setText(""); 
    days.setText(""); 
    months.setText(""); 
    years.setText(""); 
} 
} 
+0

Qu'est-ce qui ne fonctionne pas et que prévoyez-vous? – JRL

+0

Lorsque je l'ai testé pour voir si la méthode est appelée correctement en utilisant System.out.imprimer, il n'imprime pas. Je dois m'assurer qu'il appelle correctement avant de commencer à appeler d'autres méthodes. – Karen

Répondre

2

Avez-vous déjà construit le LeftInputPanel n'importe où? (On pourrait penser que vous obtiendriez une exception de pointeur nul dans le code en haut).

+0

J'ai une classe InputPanel. Dans cette classe, je construis le LeftInputPanel et le RightInputPanel. Je construis ensuite un ButtonPanel (celui avec l'écouteur) dans le RightInputPanel. – Karen

0

Vous ne devez pas nommer des méthodes comme des attributs. Par exemple, name() devrait être getName() ou quelque chose comme ça. Pourrait résoudre votre problème.

0

Il y a deux choses que je vois comme manquant ici:

  • au sein de votre méthode actionPerformed, vous déclarez un champ et sans essayer de l'initialiser, vous essayez d'y accéder. Cela sera pris par le compilateur.
  • Je ne vois nulle part que vous créez un AllocateListener ou l'attachez à n'importe quel élément de votre panneau qui déclencherait la méthode actionPerformed.
1

Qu'est-ce qui ne fonctionne pas et que prévoyez-vous?

Si vous prévoyez d'appeler une méthode sur un objet existant à partir d'un autre objet, cela est parfaitement réalisable, à condition que la méthode soit publique. Le fait que ces objets sont JPanel sont sans importance. Ce que vous devez faire est d'apprendre à utiliser le débogueur pour savoir si votre méthode est appelée et l'impression est en cours mais le nom est vide, ou votre méthode n'est pas appelée, ou tout autre problème.

Si vous utilisez Eclipse, il existe d'excellents tutoriels vidéo de débogage here. Mais même si vous n'utilisez pas Eclipse, vous pouvez les vérifier et les appliquer à l'IDE que vous utilisez. Ce sera beaucoup plus efficace que d'arroser System.out.println s ici et là.

+0

Donc la façon dont je l'ai fait, est-ce que j'appelle la méthode du panneau que j'ai déjà construit? Si ce n'est pas la raison, qu'est-ce qui ne va pas? – Karen

2

JPanels sont des extensions de Component. Cela signifie que vous pouvez toujours appeler Component.getParent() pour obtenir le conteneur immédiat de votre composant et utiliser cette référence, accéder à tous les composants frères dans le conteneur en utilisant Container.getComponents(). Plus précisément, si vous add your panels to the top level container using indexes, vous pouvez spécifiquement request the reference to a sibling component using its index.

Ceci est une façon d'éviter de transmettre des références à divers panneaux, en utilisant le conteneur parent comme contexte de confinement (ce qui est précisément ce qu'il est).

Et une fois que vous avez la référence, une classe est une classe et vous pouvez évidemment appeler toutes les méthodes visibles.

Questions connexes