我正在尝试从面板类调用一个方法,但它不会产生任何结果。面板可以相互通信吗?或者还有其他原因导致这种情况无效吗?
在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("");
}
}
答案 0 :(得分:2)
你有没有在任何地方构建LeftInputPanel? (有人会认为你会在顶部的代码中得到一个空指针异常。)
答案 1 :(得分:2)
JPanels是Component的扩展名。这意味着您始终可以调用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
方法的任何内容。