面板可以相互通信吗?

时间:2009-10-27 13:17:34

标签: java user-interface swing panel

我正在尝试从面板类调用一个方法,但它不会产生任何结果。面板可以相互通信吗?或者还有其他原因导致这种情况无效吗?

在leftInput类中调用方法name()。

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

leftInput class。

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 个答案:

答案 0 :(得分:2)

你有没有在任何地方构建LeftInputPanel? (有人会认为你会在顶部的代码中得到一个空指针异常。)

答案 1 :(得分:2)

JPanelsComponent的扩展名。这意味着您始终可以调用Component.getParent()来获取组件的直接容器并使用该引用,使用Container.getComponents()访问容器中的所有同级组件。

更具体地说,如果您add your panels to the top level container using indexes,那么您可以专门request the reference to a sibling component using its index

这是避免传递对各种面板的引用的一种方法,通过使用父容器作为包含上下文(这正是它)。

一旦你有了引用,一个类就是一个类,你显然可以调用所有可见的方法。

答案 2 :(得分:1)

什么不起作用,你期待发生什么?

如果您希望从另一个对象调用现有对象上的方法,那么这是完全可行的,前提是该方法是公共的。这些对象JPanel的事实无关紧要。

您应该学习如何使用调试器来确定您的方法是否被调用以及println是否正在发生但名称为空,或者您的方法未被调用,或者是否有任何其他问题。

如果你正在使用Eclipse,那么有一些很棒的调试视频教程here。但即使您没有使用Eclipse,也可以将它们检出,并将它们应用到您正在使用的任何IDE中。它比在这里和那里洒System.out.println更有效率。

答案 3 :(得分:0)

您不应该命名属性等方法。例如,name()应该是getName()或类似的东西。可能会解决你的问题。

答案 4 :(得分:0)

我认为有几件事情在这里缺失:

  • 在您的actionPerformed方法中,您声明了一个字段而不尝试初始化它,您尝试访问它。这将被编译器捕获。
  • 我在任何地方都没有看到您创建AllocateListener或将其附加到面板中会触发actionPerformed方法的任何内容。