2013-11-29 2 views
-2

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

 //adds the Flower data to the Array and list 
ActionListener flowerAddAction = new ActionListener(){ 
    @Override 
    public void actionPerformed(ActionEvent flowerAddAction){ 
     if(flowerAddAction.getActionCommand().equals("Enter")){ 
      Name = NameTxt2.getText(); 
      Colors = ColorTxt2.getText(); 
      Smell = SmellTxt.getText(); 
      ID = (int) IDCmbo.getSelectedItem(); 
      if(((String) ThornCmbo.getSelectedItem()).equals("Yes")) 
       Thorns = true; 
      else 
       Thorns = false; 
      plants[count] = new Flower(Name, ID, Colors, Smell, Thorns); 
      displayEntered.setText(displayArray); 
      count++; 
      frame.repaint(); 
      frameB.setVisible(false); 
     } 
     } 
}; 
enterFlrData.addActionListener(flowerAddAction); 

это выше код, чтобы добавить действие, когда пользователь нажимает клавишу ВВОД после ввода данных в текстовые поля и ComboBoxes. Ниже создается длинная строка массива, созданная вводом. (Если у кого есть лучший способ отображения массива на JLabel Я хотел бы знать, потому что я знаю, что это немного неаккуратно.

//create a string of all values for the array 
    displayArray = " "; 
    String displayArraytemp = " "; 
    for(int n = 0; n < 25; n++){ 
     if(plants[n] != null){ 
      if(plants[n] instanceof Flower){ 
       displayArraytemp = (n + ": " + plants[n].getID() + ", " + plants[n].getName() + ", " + ((Flower)plants[n]).getColor() + ", " + ((Flower)plants[n]).getSmell() + ", Thorny: " + ((Flower)plants[n]).getThorns() + "/n"); 
       } 
       else if(plants[n] instanceof Fungus){ 
       displayArraytemp = (n + ": " + plants[n].getID() + ", " + plants[n].getName() + ", " + ((Fungus)plants[n]).getColor() + ", Poisonous: " + ((Fungus)plants[n]).getPoisonous() + "/n"); 
       } 
       else if(plants[n] instanceof Weed){ 
       displayArraytemp = (n + ": " + plants[n].getID() + ", " + plants[n].getName() + ", " + ((Weed)plants[n]).getColor() + ", Edible: " + ((Weed)plants[n]).getEdible() + ", Medicinal: " + ((Weed)plants[n]).getMedicinal() + ", Poisonous: " + ((Weed)plants[n]).getPoisonous() + "/n"); 
       } 
       else if(plants[n] instanceof Herb){ 
       displayArraytemp = (n + ": " + plants[n].getID() + ", " + plants[n].getName() + ", " + ((Herb)plants[n]).getColor() + ", " + ((Herb)plants[n]).getFlavor() + ", Medicinal: " + ((Herb)plants[n]).getMedicinal() + ", Poisonous: " + ((Herb)plants[n]).getSeasonal() + "/n"); 
       } 
      displayArray += (displayArraytemp + "/n"); 
     } 
    } 

Ниже показывает остальное создание этикетки и включает в себя основной метод.

final JPanel p2Base = new JPanel(); 
    displayEntered = new JLabel(displayArray); 
    //entire constant GUI put together 
p2Base.setLayout(new BorderLayout(10,10)); 
p2Base.add(menuBar, BorderLayout.NORTH); 
p2Base.add(p1Right, BorderLayout.EAST); 
p2Base.add(displayEntered, BorderLayout.WEST); 

     public static void main(String[] args) { 
    frame = new GUI(); 
    frame.setTitle("Plant Database"); 
    frame.setSize(900,700); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
} 
+0

Для лучшей помощи в ближайшее время отправьте сообщение [SSCCE] (http://sscce.org/). –

+0

Спасибо за ваш комментарий. После некоторого времени поиска я понял, что моя проблема в том, что мне нужно было объявить и установить строку внутри actionPerformed, чтобы она могла видеть. Я закончил тем, что создал текст StringBuilder и использовал и
, чтобы новый текст вводился на новые строки (что, я уверен, не самый лучший способ, но это сработало). Теперь я поймал все данные, но отобразит первую, затем первую и вторую записи. Итак, мне нужно избавиться от первого, чтобы не отображать дубликаты. Кто-нибудь имеет информацию о том, как перерисовать? То, что я пробовал, не сработало. – user2758501

+0

* «То, что я пробовал, не сработало». * То, что вы разместили, не является SSCCE. –

ответ

1

Это выглядит подозрительно ко мне:

flowerAddAction.getActionCommand().equals("Enter") 

Если вы хотите, чтобы это ActionListener реагирует на нажатие на кнопку ввода, то это не получится, так как actionCommand строка не будет "Войти". Я даже не уверен, что это будет, и мне все равно, поскольку я обычно использую ActionListener для каждого компонента и поэтому обычно не проверяю actionCommand String.

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


Редактировать

я должен заткнуться и читать API. Команда действия JTextField - это текст, который он содержит, если вы не установите его явно.

import java.awt.event.*; 
import javax.swing.*; 

public class EnterActionCommand { 
    public static void main(String[] args) { 
     JTextField field1 = new JTextField(10); 
     JTextField field2 = new JTextField(10); 

     // **** set the action command explicitly for field2 **** 
     field2.setActionCommand("Field 2"); 

     ActionListener actionListener = new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.printf("action command: \"%s\"%n", e.getActionCommand()); 
     } 
     }; 

     field1.addActionListener(actionListener); 
     field2.addActionListener(actionListener); 

     JPanel panel = new JPanel(); 
     panel.add(new JLabel("Field 1:")); 
     panel.add(field1); 
     panel.add(new JLabel("Field 2:")); 
     panel.add(field2); 

     JOptionPane.showMessageDialog(null, panel); 
    } 
} 
Смежные вопросы