0

我试图从面板类中调用一个方法,但是它不会产生任何结果。面板可以相互通信吗?或者还有其他原因导致这不起作用?

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

按钮面板类。

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

5 回答 5

2

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

更具体地说,如果您使用 index 将面板添加到顶级容器,那么您可以使用其 index 专门请求对兄弟组件的引用

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

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

于 2009-10-27T13:55:12.957 回答
2

您是否曾经在任何地方实际构建过 LeftInputPanel?(有人会认为您会在顶部的代码中得到一个空指针异常)。

于 2009-10-27T13:24:10.803 回答
1

什么不起作用,您期望发生什么?

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

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

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

于 2009-10-27T13:34:53.390 回答
0

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

于 2009-10-27T13:25:28.337 回答
0

我认为这里缺少几件事:

  • 在您的actionPerformed方法中,您声明一个字段并且不尝试初始化它,而是尝试访问它。这将被编译器捕获。
  • 我看不到您创建AllocateListener或将其附加到面板中会触发该actionPerformed方法的任何内容的任何地方。
于 2009-10-27T13:29:32.523 回答