Java 面板可以相互通信吗?

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

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

在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("");
}
}
按钮面板类

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测试它以查看是否正确调用了该方法时,它不会打印出来。在我开始调用其他方法之前,我需要确保它调用正确。那么,按照我的方式,我是从我已经构建的面板中调用该方法的吗?如果这不是原因,它有什么问题吗?那么,按照我的方式,我是在从我已经构建的面板调用该方法吗?如果这不是原因,那有什么问题?