2015-03-18 2 views
1

Я испытываю очень серьезные проблемы в Java, что мешает мне реализовать и протестировать проект. Проблема в том, что, хотя я использую шаблон MVC после нажатия кнопки, мне нужно открыть новый JFrame, где я рисую N красных прямоугольников. В соответствии с шаблоном MVC входное значение N считывается из текстового поля в классе Control, где я тестировал и правильно считывал значение. Однако, когда я попадаю в новый фрейм, значение исчезает, и я получаю исключение nullPointerException.Переменная от другого класса не получает значения в JFrame

Я также попробовал аналогичные вопросы отсюда (вот так: Using paintComponent() to draw rectangle in JFrame), но никто из них, похоже, не работал.

Соответствующая часть класса управления является:

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); 
    } 

} 

Я также пытался вызвать метод перекрашивать в обоих местах, я также попытался не использовать поглотитель, просто получить значение непосредственно через экземпляр класса , Я также пробовал внутри конструктора вне конструктора, где бы он ни находился, но где-то я продолжаю делать ту же очевидную ошибку, которую я не мог найти.

+0

См. [Использование нескольких JFrames, Good/Bad Practice?] (Http://stackoverflow.com/q/9554636/418556) –

ответ

0

Вы передаете свой вид класс модели (которая должна иметь сколько прямоугольников вы хотите сделать), но вы вызываете «control.getNumberOfQueues()», который вы никогда не «создание экземпляров управления Control»

Ваш вид должен не знаю о контроле, он должен отобразить вашу модель с помощью модели, которую вы ее передали. Ваш элемент управления должен принимать входные данные и обновлять модель с количеством прямоугольников, а затем ваше представление должно снова отобразить эту модель.

+0

Да, вы были правы. Я сделал полный беспорядок из класса. Таким образом, вы сказали, что это работает. Спасибо за помощь! – rafanadal

Смежные вопросы