2017-11-30 2 views
0

내가 뭘 잘못하고 있는지 모르겠다. JTextField 사용자 입력을 저장하여 JList에 표시하려고 시도하고 있지만 사용자 입력을 저장하기 위해 버튼을 누를 때마다 JList는 비어있게됩니다. 어떤 도움이라도 대단히 감사하겠습니다.JList에서 사용자 입력을 저장하고 표시하는 방법은 무엇입니까?

DefaultListModel<String> model = new DefaultListModel<String>(); 
     menuList = new JList<String>(model); 
     menuList.setBounds(500, 65, 300, 400); 
     menuList.setSelectionBackground(Color.LIGHT_GRAY); 
     menuList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 

     btnCreateMenu.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 

       childFrame = new JFrame("New Menu"); 
       childFrame.setBounds(340, 300, 400, 200); 
       childFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); 
       childFrame.getContentPane().setLayout(null); 
       childFrame.setVisible(true); 

       lblNewMenu = new JLabel("Menu Name:"); 
       lblNewMenu.setBounds(30, 60, 200, 20); 
       childFrame.getContentPane().add(lblNewMenu); 

       input = new JTextField(); 
       String userInput = input.getText(); 
       input.setBounds(lblNewMenu.getX() + 80, lblNewMenu.getY(), 250, 30); 
       childFrame.getContentPane().add(input); 


       btnMenuInput = new JButton("Create New Menu"); 
       btnMenuInput.setBounds(120, 100, 200, 30); 
       btnMenuInput.addActionListener(new ActionListener(){ 
        public void actionPerformed(ActionEvent e){ 

         model.addElement(userInput); 
         menuList.setModel(model); 
         childFrame.setVisible(false); 

         Entree selectedEntree = (Entree)cboEntrees.getSelectedItem(); 
         Side selectedSide = (Side)cboSides.getSelectedItem(); 
         Salad selectedSalad = (Salad)cboSalads.getSelectedItem(); 
         Dessert selectedDessert = (Dessert)cboDesserts.getSelectedItem(); 


         Menu menu = new Menu(userInput, selectedEntree, selectedSide, selectedSalad, selectedDessert); 
         menuArray.add(menu); 
        } 
       }); 
       childFrame.getContentPane().add(btnMenuInput); 
      } 
     }); 

     mainframe.setVisible(true); 
+1

정확히 원하는 작업을 수행하는 [How List to Use] (https://docs.oracle.com/javase/tutorial/uiswing/components/list.html)의 스윙 튜토리얼 섹션을 읽으십시오. . 또한 setBounds()를 사용하지 마십시오. Swing은 레이아웃 관리자와 함께 사용하도록 설계되었습니다. 자습서의 예제는 레이아웃 관리자를 사용합니다. – camickr

답변

1

이 줄

userInput = input.getText(); 

이 된 ActionListener에 처음를 호출 할 필요가있다. 그렇지 않으면 텍스트 필드에서 최신 String을 가져 오지 못합니다. 예를 들어

, 또한

public void actionPerformed(ActionEvent e){ 
    userInput = input.getText(); 
    model.addElement(userInput); 
    //menuList.setModel(model); // not needed 

, 코멘트에 camickr에서 언급 한 바와 같이이 쉽고 유연하게 만들 것이 훨씬 어려워, 오히려 작업보다 스윙 GUI 라이브러리와 싸움으로, 널 (null) 레이아웃 및 setBounds를 사용하지 마십시오 GUI를 업데이트하고 편집합니다.

또한 childFrame 최상위 창은 JDialog이어야하며 두 번째 JFrame이 아니어야합니다. 이에 대한 자세한 내용은 The Use of Multiple JFrames: Good or Bad Practice?을 참조하십시오.

0

전체 대화 상자 나 프레임을 표시하기 전에 만들어야하며 그렇지 않으면 처음에 일부 항목이 표시되지 않을 수 있습니다.

또 다른 문제는 JFrame.HIDE_ON_CLOSE를 사용하는 것입니다. 아마도 대신 DISPOSE_ON_CLOSE를 사용해야합니다. 그렇지 않으면 프레임이 숨겨 지지만 프로그램 수명 동안 계속 존재합니다.

관련 문제