Java 面板可以相互通信吗?
我试图从一个面板类调用一个方法,但是它不会产生任何结果。面板可以相互通信吗?或者这不起作用还有其他原因吗 在leftInput类中调用方法名()Java 面板可以相互通信吗?,java,user-interface,swing,panel,Java,User Interface,Swing,Panel,我试图从一个面板类调用一个方法,但是它不会产生任何结果。面板可以相互通信吗?或者这不起作用还有其他原因吗 在leftInput类中调用方法名() import model.*; import java.awt.*; import javax.swing.*; public class LeftInputPanel extends JPanel { private Prison prison; public JTextField name = new JTextField(); pub
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("");
}
}
按钮面板类
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类
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("");
}
}
您是否在任何地方构建过LeftInputPanel?(有人会认为在顶部的代码中会出现空指针异常)。您是否在任何地方构造过LeftInputPanel?(有人会认为在顶部的代码中会出现空指针异常)。不应该像属性那样命名方法。例如,name()应该是getName()或类似的东西。可能会解决您的问题。您不应该像属性那样命名方法。例如,name()应该是getName()或类似的东西。可能会解决您的问题。我认为这里缺少一些东西:
- 在
方法中,您声明一个字段,并且在不尝试初始化它的情况下,尝试访问它。这将被编译器捕获actionPerformed
- 我看不到您在任何地方创建了
,或将其附加到面板中任何会触发分配器侦听器
方法的内容actionPerformed
- 在
方法中,您声明一个字段,并且在不尝试初始化它的情况下,尝试访问它。这将被编译器捕获actionPerformed
- 我看不到您在任何地方创建了
,或将其附加到面板中任何会触发分配器侦听器
方法的内容actionPerformed
- 我认为这里缺少一些东西:
JPanel
s这一事实与此无关
您应该学习如何使用调试器来确定是否正在调用您的方法,并且println正在发生,但是名称为空,或者没有调用您的方法,或者存在任何其他问题
如果您使用的是Eclipse,那么有一些很棒的调试视频教程。但即使您没有使用Eclipse,您也可以检查它们,并将它们应用于您正在使用的任何IDE。它将比在这里和那里喷洒
System.out.println
要有效得多。什么不起作用,你希望发生什么
如果您希望从另一个对象调用现有对象上的方法,那么这是完全可行的,只要该方法是公共的。这些对象是JPanel
s这一事实与此无关
您应该学习如何使用调试器来确定是否正在调用您的方法,并且println正在发生,但是名称为空,或者没有调用您的方法,或者存在任何其他问题
如果您使用的是Eclipse,那么有一些很棒的调试视频教程。但即使您没有使用Eclipse,您也可以检查它们,并将它们应用于您正在使用的任何IDE。它将比在这里和那里喷洒System.out.println更有效。是的扩展。这意味着您可以随时调用以获取组件的即时容器,并使用该引用,通过使用访问容器中的所有同级组件
更具体地说,如果你,那么你可以具体地
这是一种避免传递对各种面板的引用的方法,方法是使用父容器作为包含上下文(实际上就是这样)
一旦你有了引用,一个类就是一个类,你显然可以调用所有可见的方法。是的扩展。这意味着您可以随时调用以获取组件的即时容器,并使用该引用,通过使用访问容器中的所有同级组件
更具体地说,如果你,那么你可以具体地
这是一种避免传递对各种面板的引用的方法,方法是使用父容器作为包含上下文(实际上就是这样)
一旦你有了引用,一个类就是一个类,你显然可以调用所有可见的方法。我有一个InputPanel类。在该类中,我构建了LeftInputPanel和RightInputPanel。然后,我在RightInputPanel中构建了一个ButtonPanel(带有侦听器的那个)。在该类中,我构建了LeftInputPanel和RightInputPanel。然后,我在RightInputPanel中构建了一个ButtonPanel(带有侦听器的那个)。什么不起作用,您希望发生什么?当我使用System.out.print测试该方法是否正确调用时,它不会打印出来。在开始调用其他方法之前,我需要确保它调用正确。什么不起作用?您希望发生什么?当我使用System.out.print测试它以查看是否正确调用了该方法时,它不会打印出来。在我开始调用其他方法之前,我需要确保它调用正确。那么,按照我的方式,我是从我已经构建的面板中调用该方法的吗?如果这不是原因,它有什么问题吗?那么,按照我的方式,我是在从我已经构建的面板调用该方法吗?如果这不是原因,那有什么问题?