java - 来自其他类的变量在 JFrame 中没有获取值

标签 java swing variables jframe

我在 Java 中遇到了一个非常基本的问题,这阻碍了我实现和测试项目。问题是,当我使用 MVC 模式时,一旦按下按钮,我需要打开一个新的 JFrame,在其中绘制 N 个红色矩形。根据 MVC 模式,输入值 N 是从 Control 类中的文本字段读取的,我在其中测试并正确读取了该值。但是,当我进入新框架时,该值消失,并且出现 nullPointerException。

我也从这里尝试了类似问题的源代码(如下所示: Using paintComponent() to draw rectangle in JFrame ),但它们似乎都不起作用。

Control类的相关部分是:

private void readInput()
{
    numberOfQueues = Integer.parseInt(v_view.field1.getText());
}
public int getNumberOfQueues()
{
    return numberOfQueues;
}
class StartListener implements ActionListener {
            public void actionPerformed(ActionEvent event) {
                if(m_model.validateInput(v_view.field1.getText()) && m_model.validateInput(v_view.field2.getText()) &&
                   m_model.validateInput(v_view.field3.getText()) && m_model.validateInput(v_view.field4.getText()) && 
                   m_model.validateInput(v_view.field5.getText()) && m_model.validateInput(v_view.field6.getText()))
                {
                    if(Integer.parseInt(v_view.field3.getText()) <= Integer.parseInt(v_view.field4.getText()) &&
                        Integer.parseInt(v_view.field5.getText()) <= Integer.parseInt(v_view.field6.getText()))
                    {
                        readInput();
                        SimulationFrame simulationFrame = new SimulationFrame(m_model);
                        simulationFrame.setVisible(true);
                        simulationFrame.repaint();
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(null,"Invalid input range! Please try again!");
                    }
                }
            }
}

输入验证肯定很好,如果我尝试在这里打印出 numberOfQueues 的值,效果会很好。

扩展 JFrame 的类如下所示:

public class SimulationFrame extends JFrame{

Control control;
private int numberOfQueues;

public SimulationFrame(Model model)
{
    setPreferredSize(new Dimension(1000, 550));
    this.pack();
    this.setTitle("Simulator Frame");
    this.setLayout(new FlowLayout());
    this.setVisible(true);
    this.setLocation(100, 100);
    numberOfQueues=control.getNumberOfQueues();
    System.out.println(numberOfQueues);
    repaint();
}

protected void paintComponent(Graphics g)
{
    g.setColor(Color.red);
    for(int i=0; i<numberOfQueues; i++)
    {
        System.out.println(control.numberOfQueues);
        g.fill3DRect(50+20, 20, 50, 50, true);
    }

}

我还尝试在这两个地方调用 repaint 方法,我也尝试不使用 getter,只是直接通过类实例获取值,我还尝试在构造函数内部、构造函数外部,无论它可以放在哪里,但在某个地方我不断犯同样明显的错误,但我找不到。

最佳答案

您正在向 View 传递模型类(它应该有您想要绘制的矩形数量),但您正在调用“control.getNumberOfQueues()”,而您从未实例化“Control control”

您的 View 不应该了解该控件,它应该使用您传递给它的模型来渲染您的模型。您的控件应接受输入并使用矩形数量更新模型,然后您的 View 应再次呈现该模型。

关于java - 来自其他类的变量在 JFrame 中没有获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29127646/

相关文章:

java - 保护 iphone api web 服务的最安全/最简单的方法

java - 计算离用户位置最近的 4 点? (安卓)

Java 9 react 流 : does one Subscriber belong to one Publisher

java - 为什么我们需要 super 关键字来调用默认接口(interface)方法?

java - 当 JTextArea 超过一定数量的行时启用滚动条

sql - 在 Oracle SQL 中声明要在查询中使用的变量

javascript console.log 在变量中给出错误的结果

java - 缓冲图像动画代码无法正确重画

swing - documentFilter.insert 从未调用过

c++ - 使用字符串变量将短语分配给数字? C++