itemStateChanged и actionPerformed проблемы - PullRequest
0 голосов
/ 13 февраля 2011

У меня есть класс обработчика, который реализует ActionListner, FocusListner и ItemListner. Я создал объект GUI из класса ConfrenceGUI:

      public ConferenceGUI()
   {
      //Create a new JPanel and set its latyout mgr   
      conference = new JPanel(); 
      setLayout(new BorderLayout());  
      //create a RegPanel panel           
      regPanel = new RegPanel();
      //create new WorkshopPanel workshopPanel
      workshopPanel = new WorkshopPanel();      
      //build a buttonpanel
      buildButtonPanel();
      //Create a title panel      
      titlePanel = new JPanel(new FlowLayout());
      //create and set a font object
      titlePanel.setFont(new Font ("sansserif", Font.BOLD, 18));
      //add a label
      titlePanel.add(new Label("Select Registration Options"));      
      //Add the instantiated subpanels to the main conference gui panel
      add(titlePanel,        BorderLayout.NORTH);
      add(regPanel,          BorderLayout.WEST);
      add(workshopPanel,     BorderLayout.EAST);
      add(buttonPanel,       BorderLayout.SOUTH);
      //add an item listener to the combo box
      ConferenceHandler handler = new ConferenceHandler(this);
      regPanel.regComboBox.addItemListener(handler);
      //add a focus listener to the name field
      ConferenceHandler fhandler = new ConferenceHandler(this);
      regPanel.regTextField.addFocusListener(fhandler);
   }

Я пытаюсь получить информацию от слушателей (включая двух слушателей кнопок из отдельного метода в моем классе ConferenceGUI, который я не включил).

Вот фрагмент кода из моего обработчика:

  public void itemStateChanged(ItemEvent e)
  {
     String name = gui.regPanel.regTextField.getText(); 
     if (e.getSource() == gui.regPanel.regComboBox)
       {
          if (gui.regPanel.getRegType() == "Please select a type")
          JOptionPane.showMessageDialog(null, "Please select a registraion type",
                                        "Type Error", JOptionPane.ERROR_MESSAGE);     
          else gui.textArea.setText(name+" is a " +
                                        gui.regPanel.getRegType()+ " registration");
       }

и для кнопок:

      public void actionPerformed (ActionEvent e)
  {
    String name = gui.regPanel.regTextField.getText();
    DecimalFormat $ = new DecimalFormat("$#,##0.00");
    if (e.getSource() == gui.calcButton)//if the calculate buttton is pressed
    {
       //dislplay error box if user selects index 0
       if (gui.regPanel.getRegType() == "Please select a type")
         JOptionPane.showMessageDialog(null, "Please select a registraion type",
                                                "Type Error",JOptionPane.ERROR_MESSAGE);
       //prints to textarea if registrant will be attending keynote or not
       if (gui.regPanel.regCheckBox.isSelected())
          gui.textArea.setText("Keynote address will be attended");
            else
              gui.textArea.setText("Keynote address will not be attended");
       //prints to textarea which workshops registrant will be attending
       gui.textArea.setText(name+" is registered in these workshops:" +
                            gui.workshopPanel.getWorkshopList());
       //prints total registration fees to textarea
       gui.textArea.setText("Total charges for" + name + " are " + $.format(calcTotalCharges()));
    }
    else if (e.getSource() == gui.clearButton)//if the clear button is pressed
    {
       //clear the textarea 
       gui.textArea.setText("");  
       //reset the list
       gui.workshopPanel.workshopList.setSelectedIndex(0);
       //reset the combobox to index 0
       gui.regPanel.regComboBox.setSelectedIndex(0);
    }
  }

Проблема будет очевидна для всех вас, но, поскольку я только начинаю, я не могу понять, почему я не могу написать какой-либо текст в textArea моего GUI. Извиняюсь за объем кода, но я хотел попытаться быть тщательным.

Вот откуда берется текстовая область (это отдельный метод, содержащийся в моем классе ConferenceGUI:

   private void buildButtonPanel()
   {
      //create the buttonpanel
      buttonPanel = new JPanel(new FlowLayout());
      //create the buttons
      calcButton = new JButton("Calculate Charges");
      clearButton = new JButton    ("Clear");
      //add listeners to the buttons
      ConferenceHandler ahandler = new ConferenceHandler(this);
      calcButton.addActionListener(ahandler);  
      clearButton.addActionListener(ahandler);
      //create a text area
      JTextArea textArea = new JTextArea(5,30); 
      textArea.setLineWrap(true); textArea.setWrapStyleWord(true);
      //add everything to the buttonpanel
      buttonPanel.add(calcButton); buttonPanel.add(clearButton); buttonPanel.add(new JScrollPane(textArea));
   }

Существует три других класса RegPanel и WorkshopPanel, каждый из которых создает пару панелей для ConferenceGUI, который в свою очередь создается апплетом (gui).

Ответы [ 2 ]

2 голосов
/ 13 февраля 2011

Я не уверен, что понимаю ваш вопрос (что не работает? Что вы ожидаете и что происходит?), Но точно уверен, что многократный вызов setText() для JTextArea не является хорошей идеей: setText заменяет все содержимое текстовой области.Вы должны использовать append() для добавления нескольких строк текста в текстовую область.

РЕДАКТИРОВАНИЕ:

Теперь, когда вы показали нам, как строили текстовую область,проблема яснее: вы создаете локальную переменную textArea в методе buildButtonPanel, но переменная экземпляра в вашем GUI указывает на другую текстовую область (или ноль).

EDITED снова:

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

public class Bug extends JPanel {
    private JTextArea textArea = new JTextArea(); // first text area

    private void build()  {
        JTextArea textArea = new JTextArea(); // second text area. Inaccessible outside of this method
        this.add(new JScrollPane(textArea));
    }

    public void actionPerformed(ActionEvent e) {
        this.textArea.setText("foo"); // here, we modify the first text area, but it hasn't been added to the GUI, so it's invisible
    }
}

Чтобы исправить это, вы должны изменить его на:

public class NoBug extends JPanel {
    private JTextArea textArea = new JTextArea(); // unique text area

    private void build()  {
        this.add(new JScrollPane(this.textArea));
    }

    public void actionPerformed(ActionEvent e) {
        this.textArea.setText("foo"); // here, we modify the unique text area, which has been added to the GUI in the build() method        }
}
2 голосов
/ 13 февраля 2011

Извиняюсь за количество кода, но я хотел постараться быть тщательным

На самом деле код, который вы разместили, мало помогает, потому что мы не знаем контекст того, какиспользуется код.

Ваш код ссылается на объект "gui", но мы не знаем, когда и как эта переменная была создана.Вы ссылаетесь на объект "textArea", а также на тот же комментарий.Таким образом, код, который вы разместили, является неполным.

Если вы не можете добавить текст в текстовую область, то происходит одно из двух:

a) код никогда не выполняется (выможно добавить System.out.println (...), чтобы проверить это).б) у вас неправильная ссылка на компонент textArea, который был добавлен в графический интерфейс.Там может быть много причин для этого.Возможно, у вас есть и класс, и локальная переменная с одним и тем же именем.

Если вам нужна дополнительная помощь, опубликуйте свой SSCCE , который демонстрирует проблему.

...