2014-08-20 4 views
0

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

  • MyContentPane
  • ParametersPanel
  • ControlsPanel

Первый класс выглядит следующим образом:

public class MyContentPane extends JPanel{ 

private ParametersPanel parametersPanel; 
private ControlsPanel controlPanel; 
private CashRegistersPanel cashRegistersPanel; 

public MyContentPane() { 

    parametersPanel = new ParametersPanel(); 
    controlPanel = new ControlsPanel(parametersPanel); 
    cashRegistersPanel = new CashRegistersPanel(); 

    this.setLayout(null); 
    this.add(controlPanel); 
    this.add(parametersPanel); 
    this.add(cashRegistersPanel); 

    controlPanel.setBounds(0, 0, 300, 250); 
    parametersPanel.setBounds(0, 250, 300, 450); 
    cashRegistersPanel.setBounds(300, 0, 1500, 700); 

    this.setPreferredSize(new Dimension(1800,700)); 

} 

}

Второй класс выглядит следующим образом:

public class ParametersPanel extends JPanel{ 

private ControlsPanel controlsPanel; 

private JButton reset; 

public ParametersPanel() { 

    controlsPanel = new ControlsPanel(this); 


    this.setBackground(new Color(219,221,255)); 

    reset  = new JButton("Reset parameters"); 

    reset.setFont(new Font("Arial", Font.BOLD, 14)); 

    this.setLayout(null); 


    this.add(reset); 

    reset.setBounds(10, 245, 280, 30); 



    reset.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      boolean startIsPressed = controlsPanel.StartisPressed(); 
      System.out.println("Boolean: " + startIsPressed); 
     } 
    }); 

} 

Последний класс:

public class ControlsPanel extends JPanel{ 

private JButton start; 
private JButton stop; 

private boolean startIsPressed; 

public ControlsPanel(final ParametersPanel panel) { 

    start  = new JButton("Start"); 
    stop  = new JButton("Stop"); 

    start.setFont(new Font("Arial", Font.BOLD, 14)); 
    stop.setFont(new Font("Arial", Font.BOLD, 14)); 

    this.setLayout(null); 
    this.setBackground(new Color(199,202,255)); 

    this.add(start); 
    this.add(stop); 


    start.setBounds(10, 10, 280, 30); 
    stop.setBounds(10, 50, 280, 30); 

    stop.setEnabled(false); 


    start.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 

     if (start.getText().equals("Start")) { 
      start.setText("Pause"); 
      stop.setEnabled(true); 
      startIsPressed = true; 

      System.out.println("Start Button boolean value: " + startIsPressed + stringStartIsPressed); 

     } 
    }); 

public boolean StartisPressed() { 
    return startIsPressed; 
} 

Теперь проблема в том, что когда я нажимаю на кнопку Start в ControlsPanel, значение булева оказывается, чтобы правда. Но когда я задаю значение этого булева в ParametersPanel, нажав кнопку сброса, он возвращает false. Я обнаружил, что если я изменить порядок панели decleration в первом классе (MyContentPane), я решить эту проблему, но я не могу попросить булевы в ControlsPanel ...

Добавлен еще один класс

public class CashRegistersPanel extends JPanel{ 

private Image img; 
private int amount; 
private ParametersPanel parametersPanel; 
private ControlsPanel controlsPanel; 
private boolean startIsPressed; 

public CashRegistersPanel() { 

    parametersPanel = new ParametersPanel(); 

    startIsPressed = controlsPanel.StartisPressed(); 

    this.setBackground(new Color(237,237,237)); 
    this.setLayout(null); 

    CashRegister cashRegister = new CashRegister(); 
    img = cashRegister.getImg(); 

    amount = parametersPanel.getAmountOfRegisters(); 


} 
    public void setControlsPanel(ControlsPanel cp) { 
    controlsPanel = cp; 

} 

Я изменил MyContentPane, как вы, ребята предложили и добавил что-то еще:

public class MyContentPane extends JPanel{ 

private ParametersPanel parametersPanel; 
private ControlsPanel controlPanel; 
private CashRegistersPanel cashRegistersPanel; 

public MyContentPane() { 

    parametersPanel = new ParametersPanel(); 
    controlPanel = new ControlsPanel(parametersPanel); 
    parametersPanel.setControlsPanel(controlPanel); 
    cashRegistersPanel = new CashRegistersPanel(parametersPanel, controlPanel); 

Спасибо, ребята, вопрос решен!

ответ

3

Вы создаете 2 ControlsPanel.

Один в ParametersPanel не должно быть сделано, это мешающий линия:

controlsPanel = new ControlsPanel(this); 

Вместо этого создайте метод установки на ParametersPanel:

public void setControlsPanel(ControlsPanel cp) { 
    controlsPanel = cp; 
} 

и изменить инициализацию в первом классе до:

+0

Это действительно помогло мне поблагодарить вас за это, но я попробовал то же самое для своего CashRegisterpanel, но это не помогло. Не возражаете ли вы тоже взглянуть на это? – Mirwais

+0

О, не возражаете! Я только что добавил в MyContentPane в CahRegisterPanel (ParametersPanel, controlPanel). Спасибо, в любом случае! – Mirwais

0

Мне кажется, что в MyContentPane вы создаете экземпляр ControlsPanel, но затем ParametersPanel делает свой собственный ControlsPanel. Я думаю, вы должны передать ControlsPanel на ParametersPanel вместо создания нового. Имейте в виду, что каждый раз, когда вы говорите new, вы создаете полностью отдельный объект.

изменить это:

public ParametersPanel() { 

    controlsPanel = new ControlsPanel(this); 

к этому:

public ParametersPanel(ControlPanel cp) { 

    controlsPanel = cp; 

и изменить код MyControlPanel на:

controlPanel = new ControlsPanel(); 
parametersPanel = new ParametersPanel(controlPanel); 

и конструктор ControlsPanel к:

public ControlsPanel() { 

, так как вы, кажется, не используете ссылку на ParametersPanel.

В качестве альтернативы вы можете установить startIsPressed как статическую переменную, но я не думаю, что это то, что вы действительно хотите.

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