Эффективный способ добавить множество различных объектов свинга на панель / рамку.(Джава) - PullRequest
1 голос
/ 13 января 2012

Я пытаюсь сделать так, как написано в заголовке.

У меня есть эффективный способ размещения нескольких одинаковых объектов свинга в кадре путем их сохранения в массиве и добавления их с помощьюцикл выглядит так:

JLabel[] contrllabels= new JLabel[8];
contrllabels[0] = new JLabel("SCF Type: ");
contrllabels[1] = new JLabel("Units: ");
contrllabels[2] = new JLabel("Spherical Harmonics: ");
contrllabels[3] = new JLabel("Molecular Charge: ");
contrllabels[4] = new JLabel("PP: ");
contrllabels[5] = new JLabel("DFT Type: ");
contrllabels[6] = new JLabel("Max Iterations: ");
contrllabels[7] = new JLabel("Mult: ");


for(int i = 0;i<contrllabels.length;i++){
    c.gridy = i;
    frame.add(contrllabels[i],c);
}

Но что, если есть несколько объектов свинга разных типов?У меня есть несколько полей со списком и текстовых полей, которые я хотел бы добавить в кадр аналогичным образом.Я использую gridbaglayout, поэтому, если я не использую цикл for, я получаю много ненужного кода из-за предоставления ограничениям новых значений каждый раз, когда я хочу добавить другой объект.массив ссылок, которые указывают на эти различные объекты, которые я могу затем перебрать, чтобы добавить в кадр?Что-то вроде

JTextField tf = new JTextField(5);
JComboBox cb = new JComboBox("example");

Swing[] array = {tf,cb}

for(int i = 0;i<array.length;i++){
    c.gridy = i;
    frame.add(array[i],c);
}

Я знаю, что такого массива не существует, но есть ли способ реализовать такую ​​вещь?Это значительно уменьшит количество строк в моем коде и сделает его менее запутанным.

Спасибо

Ответы [ 2 ]

7 голосов
/ 13 января 2012

Вы можете использовать массив или коллекцию общего супертипа, такого как массив или ArrayList из JComponent.Мне интересно, если вы используете параллельный массив GridBagConstraints для каждого добавляемого компонента - тьфу.Я часто использую массивы компонентов, но обычно, если они похожи на такие компоненты, как пары JLabel / JTextField или кластер JRadioButtons.

В дополнение, за свои деньги, я стараюсь избегать GridBagLayout, насколько это возможно, и вместо этогоГнездовые контейнеры, которые используют более удобные для кодировщиков макеты.

Например, этот небольшой графический интерфейс был создан с комбинацией FlowLayout, BoxLayout, BorderLayout и GridLayout:

enter image description here

Большой JPanel, который содержит весь графический интерфейс пользователя, использует BorderLayout, JTextArea в центре размещается BorderLayout.CENTER, JLabel провайдера и JTextField вверху находятся в FlowLayout JPanel, который размещается в общем BorderLayout.NORTH, нижние кнопки находятся вJPanel, который использует GridLayout (1, 0, 5, 0), который хранится в другом JPanel, который использует FlowLayout, который помещен в GUI BorderLayout.SOUTH, а материал справа находится в BoxLayout с использованием JPanel.

Например:

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Window;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.UnsupportedLookAndFeelException;

@SuppressWarnings("serial")
public class GetLetterTextGui extends JPanel {
   private static final int TA_ROWS = 20;
   private static final int TA_COLS = 35;
   private static final int PROVIDER_FIELD_COLS = 10;
   private static final String GUI_TITLE = "Get Letter Text";
   private JList letterList;
   private JTextArea textarea = new JTextArea(TA_ROWS, TA_COLS);
   private JTextField providerField = new JTextField(PROVIDER_FIELD_COLS);
   private JCheckBox addValedictionChkBox = new JCheckBox("Add Valediction", true);

   public GetLetterTextGui() {
      letterList = new JList(new String[]{"Fe", "Fi", "Fo", "Fum"});

      providerField.setText("John Smith, MD");

      textarea.setWrapStyleWord(true);
      textarea.setLineWrap(true);

      JPanel northPanel = new JPanel();
      northPanel.add(new JLabel("Provider:"));
      northPanel.add(providerField);

      JPanel southPanel = new JPanel();
      JPanel btnPanel = new JPanel(new GridLayout(1, 0, 5, 0));
      btnPanel.add(new JButton("Copy to Clipboard"));
      btnPanel.add(new JButton("Clear"));
      btnPanel.add(new JButton(new ExitAction()));
      southPanel.add(btnPanel);

      JPanel eastPanel = new JPanel();
      eastPanel.setLayout(new BoxLayout(eastPanel, BoxLayout.PAGE_AXIS));
      eastPanel.add(new JScrollPane(letterList));
      eastPanel.add(new JPanel() {{add(addValedictionChkBox);}});

      int eb = 0;
      setBorder(BorderFactory.createEmptyBorder(eb, eb, eb, eb));
      setLayout(new BorderLayout(eb, eb));
      add(northPanel, BorderLayout.PAGE_START);
      add(eastPanel, BorderLayout.LINE_END);
      add(new JScrollPane(textarea), BorderLayout.CENTER);
      add(southPanel, BorderLayout.PAGE_END);
   }


   private class ExitAction extends AbstractAction {
      private final Object MNEMONIC = new Integer(KeyEvent.VK_X);

      public ExitAction() {
         super("Exit");
         putValue(MNEMONIC_KEY, MNEMONIC);
      }

      @Override
      public void actionPerformed(ActionEvent evt) {
         Window win = SwingUtilities.getWindowAncestor(GetLetterTextGui.this);
         win.dispose();
      }
   }

   private static void createAndShowGui() {
      GetLetterTextGui mainPanel = new GetLetterTextGui();

      JFrame frame = new JFrame(GUI_TITLE);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      try {
         for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
               UIManager.setLookAndFeel(info.getClassName());
               break;
            }
         }

         SwingUtilities.invokeLater(new Runnable() {
            public void run() {
               createAndShowGui();
            }
         });

      } catch (ClassNotFoundException e) {
         e.printStackTrace();
      } catch (InstantiationException e) {
         e.printStackTrace();
      } catch (IllegalAccessException e) {
         e.printStackTrace();
      } catch (UnsupportedLookAndFeelException e) {
         e.printStackTrace();
      }
   }
}
4 голосов
/ 13 января 2012

Все компоненты GUI являются объектами JComponent.ArrayList<JComponent> может содержать ссылки на все из них.Попробуйте:

JFrame frame = new JFrame("test");
ArrayList<JComponent> cps = new ArrayList<JComponent>();
cps.add(new JLabel("Hello"));
cps.add(new JPanel());
cps.add(new JButton("OK"));

for (JComponent widget : cps) {
  frame.add(widget);
}
...