2014-10-01 2 views
0

У меня есть основной JFrame в моем проекте. И один основной JPanel с Y-AXIS BoxLayout, который используется для размещения в нем других панелей. Это путь я использую мой JFrame, чтобы показать эту JPanel по умолчанию (я не совсем уверен, если это правильный путь):Как динамически создавать JPanel с заданными параметрами?

Следующая добавить два JPanels в mainPanel так:

public class MainScreenPanel extends javax.swing.JPanel { 

    public MainScreenPanel() { 
     StatusPanel sPanel = new StatusPanel(); 
     LogPanel lPanel = new LogPanel(); 
     add(sPanel); 
     add(lPanel); 
    } 

} 

lPanel имеет различные элементы gui на нем. Один из них это кнопка, которая открывает другую панель (addConnectionPanel), и заменяет mainPanel в jFrame Вот как я это сделать:

private void addCnctButtonActionPerformed(java.awt.event.ActionEvent evt) {            
    JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this); 
    topFrame.setContentPane(new AddConnectionPanel()); 
    topFrame.invalidate(); 
    topFrame.validate(); 
} 

AddConectionPanel имеет некоторые этикетки и ввод текстовых полей. Он имеет две кнопки ok и cancel. Вот код cancel кнопки:

private void cancelCnctBtnActionPerformed(java.awt.event.ActionEvent evt) {            
    JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this); 
    topFrame.setContentPane(new MainScreenPanel()); 
    topFrame.invalidate(); 
    topFrame.validate(); 
} 

sPanel пуст. Он должен быть пустым, пока поля ввода на AddConnectionPanel не будут заполнены и кнопка «ok» не будет нажата. Когда эти действия выполняются, я хочу динамически создать JLabels, которые принимают параметры с входов на sPanel. Этикетки должны быть сгруппированы, поэтому, когда необходимо выполнить действия, выполняемые во второй раз, необходимо создать новую группу. Может кто-нибудь дать мне совет, как это сделать? И покажи мне мои ошибки? Имейте в виду, что я использую NetBeans.

+1

Пожалуйста, отрегулируйте отступ фрагментов кода. Также, пожалуйста, опубликуйте, что вы реализовали в классе AddConnectionPanel. –

+0

@SME_Dev Класс AddConnectionPanel является стандартным JPanel, с TextLabels, TextInputs и двумя кнопками. Не имеет ничего особенного. – iColdBeZero

ответ

0

Это будет мой подход:

public interface ConnectionPanelListener{ 
    void onOkButtonClicked(String... options); 

    void onCancelButtonClicked(); 
} 


public class AddConnectionPanel extends JPanel { 

    private static final long serialVersionUID = 1L; 

    private ConnectionPanelListener listener; 


    public AddConnectionPanel(){ 
     final Map<ConnectionOptions, JTextField> components = new HashMap<>(ConnectionOptions.values().length); 

     for(ConnectionOptions option:ConnectionOptions.values()){ 
      this.add(new JLabel(option.labelCaption)); 

      JTextField textField = new JTextField(); 
      //setup textField; 
      this.add(textField); 

      components.put(option, textField); 
     } 
     JButton button = new JButton("OK"); 
     button.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(final MouseEvent pE) { 
       super.mouseClicked(pE); 
       //TODO validate TextFields 

       Collection<String> inputs = new Stack<>(); 

       for(Entry<?,JTextField> e : components.entrySet()){ 
        String text = e.getValue().getText(); 

        if(text==null || text.trim().isEmpty()){ 
         //TODO improve input validation 
         System.out.println("Input text is empty for: "+e.getKey()); 
        } else { 
         inputs.add(e.getKey() + ": " + text); 
        } 
       } 
       listener.onOkButtonClicked(inputs.toArray(new String[inputs.size()])); 
      } 
     }); 
     this.add(button); 
     button = new JButton("cancel"); 
     button.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(final MouseEvent pE) { 
       super.mouseClicked(pE); 

       listener.onCancelButtonClicked(); 
      } 
     }); 
     this.add(button); 
    } 

    public void setConnectionPanelListener(final ConnectionPanelListener l){ 
     listener = l; 
    } 

    private enum ConnectionOptions{ 
     IP_ADDRESS("IP-Address:"), PORT("Port:"), WHATEVER_ATTRIBUTE_YOU_NEED("Extras:"); 

     private String labelCaption; 

     private ConnectionOptions(final String caption) { 
      labelCaption = caption; 
     } 
    } 
} 

Как вы можете видеть, AddConnectionPanel ожидает Слушатель зарегистрировать для случая, что «OK» или «ОТМЕНА» щелкают. Таким образом, ваша скорректированная реализация может быть такой:

private void addCnctButtonActionPerformed(java.awt.event.ActionEvent evt) {            
    JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this); 

    AddConnectionPanel panel = new AddConnectionPanel(); 
    panel.setConnectionPanelListener(new ConnectionPanelListener(){ 

     @Override 
     void onOkButtonClicked(String... options){ TODO: fill sPanel using the given Strings } 

     @Override 
     void onCancelButtonClicked(){ TODO } 
    }); 

    topFrame.setContentPane(panel); 
    topFrame.invalidate(); 
    topFrame.validate(); 
} 
+0

Thx, помог мне понять концепцию – iColdBeZero

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