Могут ли панели взаимодействовать друг с другом? - PullRequest
0 голосов
/ 27 октября 2009

Я пытаюсь вызвать метод из класса панели, но это ни к чему не приводит. Могут ли панели взаимодействовать друг с другом? Или есть другая причина, почему это не работает?

Вызов имени метода () в классе leftInput.

Класс 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());
}
}
}

левый входной класс.

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("");
}
}

Ответы [ 5 ]

2 голосов
/ 27 октября 2009

JPanels являются расширениями Component . Это означает, что вы всегда можете вызвать Component.getParent () , чтобы получить непосредственный контейнер вашего компонента и, используя эту ссылку, получить доступ ко всем дочерним компонентам в контейнере с помощью Container.getComponents () .

В частности, если вы добавляете свои панели в контейнер верхнего уровня, используя индексы , то вы можете, в частности, запросить ссылку на одноуровневый компонент, используя его индекс .

Это один из способов избежать передачи ссылок на различные панели, используя родительский контейнер в качестве контекста содержимого (который именно так и есть).

И когда у вас есть ссылка, класс является классом, и вы, очевидно, можете вызывать все видимые методы.

2 голосов
/ 27 октября 2009

Вы когда-нибудь создавали LeftInputPanel где-нибудь? (Можно подумать, что вы получите исключение нулевого указателя в коде вверху).

1 голос
/ 27 октября 2009

Что не работает и чего вы ожидаете?

Если вы ожидаете вызова метода для существующего объекта из другого объекта, это вполне выполнимо при условии, что метод общедоступен. Тот факт, что эти объекты JPanel с не имеют значения.

Что вы должны сделать, это узнать, как использовать отладчик, чтобы выяснить, вызывается ли ваш метод и происходит ли println, но имя пусто, или ваш метод не вызывается, или любая другая проблема.

Если вы используете Eclipse, есть несколько отличных видеоуроков по отладке здесь . Но даже если вы не используете Eclipse, вы можете проверить их и применить к любой IDE, которую вы используете. Это будет гораздо эффективнее, чем разбрызгивание System.out.println s здесь и там.

0 голосов
/ 27 октября 2009

Есть пара вещей, которые мне здесь не хватает:

  • в вашем методе actionPerformed вы объявляете поле и, не пытаясь его инициализировать, пытаетесь получить к нему доступ. Это будет поймано компилятором.
  • Я нигде не вижу, чтобы вы создавали AllocateListener или прикрепляли его к чему-либо на вашей панели, что вызвало бы метод actionPerformed.
0 голосов
/ 27 октября 2009

Вы не должны называть методы как атрибуты. Например, name () должно быть getName () или что-то в этом роде. Может решить вашу проблему.

...