2015-06-24 2 views
0

Я написал код для динамического создания JPanels. Теперь мне нужен способ захвата данных, которые пользователь создает в этих JPanels. В настоящее время у меня есть кнопка «Создать». При запуске я хочу, чтобы эта кнопка создавала объект, используя 3 разных типа данных в каждой панели: имя (String), count (int) и логическое значение.Создание объектов из динамических JPanels

Я довольно сырой при программировании, но основным препятствием, с которым я столкнулся, является то, как я могу получить доступ к динамическим объектам, которые не называются такими панелями? Я понял, как их добавлять и удалять, но я не могу понять методы захвата данных из полей в панелях.

Спасибо, код выглядит следующим образом:

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 
import javax.swing.border.CompoundBorder; 
import javax.swing.border.EmptyBorder; 
import javax.swing.border.LineBorder; 


public class MainSnakeGUI { 

    public static void main(String[] arg) { 
     new MainSnakeGUI(); 
    } 

    public MainSnakeGUI() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

       //Create the frame 
       JFrame frame = new JFrame("Snake Channels"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new SnakePane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class SnakePane extends JPanel { 
     public SnakePane() { 
      //Create buttons and labels 
      JButton btnAdd = new JButton("Add New Snake"); 
      JButton btnRemove = new JButton("Delete Snake"); 
      JLabel headerLabel = new JLabel("Create a Split Snake"); 
      JButton btnCreate = new JButton("Create"); 
      setLayout(new BorderLayout()); 
      //Create JPanels 
      JPanel buttons = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
      JPanel header = new JPanel(new FlowLayout(FlowLayout.CENTER)); 
      JPanel footer = new JPanel(new FlowLayout(FlowLayout.CENTER)); 
      //add items to JPanels 
      buttons.add(btnAdd); 
      buttons.add(btnRemove); 
      header.add(headerLabel); 
      footer.add(btnCreate); 
      //add JPanels to window 
      add(header, BorderLayout.NORTH); //sets header at the top of window 
      header.setBorder(new CompoundBorder(new LineBorder(Color.BLACK), new EmptyBorder(10, 10, 10, 10))); 
      add(buttons, BorderLayout.BEFORE_LINE_BEGINS); //sets the button to the left of the display pane 
      buttons.setBorder(new CompoundBorder(new LineBorder(Color.BLACK), new EmptyBorder(10, 10, 10, 10))); 
      add(footer, BorderLayout.AFTER_LAST_LINE); //sets buttons on the bottom of window 
      footer.setBorder(new CompoundBorder(new LineBorder(Color.BLACK), new EmptyBorder(10, 10, 10, 10))); 


      //add panel to hold new frames 
      final JPanel content = new JPanel(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 
      gbc.weighty = 1; 
      content.add(new JPanel(), gbc); 

      //add scroll pane? 
      add(new JScrollPane(content)); 

      //add listener for button 
      btnAdd.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        SplitSnakeCreationPane pane = new SplitSnakeCreationPane(); //create a new SnakeCreationPane 
        int insertAt = Math.max(0, content.getComponentCount() - 1); //insert it at the end of the list 
        GridBagConstraints gbc = new GridBagConstraints(); 
        gbc.gridwidth = GridBagConstraints.REMAINDER; 
        gbc.fill = GridBagConstraints.HORIZONTAL; 
        gbc.weightx = 1; 
        content.add(pane, gbc, insertAt); //add the pane to the window 
        content.revalidate(); 
        content.repaint(); 
       } 
      }); 

      btnRemove.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        int paneCount = content.getComponentCount()-1; //get count of the pane 
        content.remove(content.getComponent(paneCount-1)); //remove the pane at paneCount 
        content.revalidate(); //update window with changes 
        content.repaint(); 
        SplitSnakeCreationPane.snakeCount--; //update count for snakes 
       } 
      }); 

      btnCreate.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        int paneCount = content.getComponentCount()-1; //get count of the pane 
        for (int i=0; i<paneCount;){ 

        } 
       } 
      }); 
     } 

     //set size of window 
     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(1200, 400); 
     } 
    } 

    public static class SplitSnakeCreationPane extends JPanel { 
     //Count of how many snakes created 
     private static int snakeCount = 1; 

     public SplitSnakeCreationPane() { 

      //creates Snake Panes 
      setLayout(new GridLayout(2, 4, 10, 10)); 
      add(new JLabel("Split Snake " + (snakeCount++) + ".")); 
      add(new JLabel("Snake Name")); 
      add(new JLabel("Channel Count")); 
      add(new JLabel("")); 
      add(new JLabel("")); 
      JTextField snakeName = new JTextField(30); 
      JTextField channelCount = new JTextField("0",3); 
      JCheckBox artistSupplied = new JCheckBox("Artist Supplied?"); 
      add(snakeName); //Snake Name field 
      add(channelCount); //Channel Count field 
      add(artistSupplied); //Artist supplied checkbox 
      setBorder(new CompoundBorder(new LineBorder(Color.BLACK), new EmptyBorder(10, 10, 10, 10))); 
     } 
    } 
} 
+0

, что вы имеете в виду * создать объект с помощью 3-х различных типов данных в каждой панели * я не мог получить это – Madhan

+0

я с трудом могу понять вопрос. – Mordechai

+0

Извините, если я запутался, я попытаюсь уточнить. Если вы запустите программу, вы увидите, что она создает большую панель с тремя кнопками: «Добавить, удалить и создать». Когда вы нажимаете кнопку «Добавить», создается небольшая панель с двумя текстовыми полями и флажком. Каждый раз, когда вы нажимаете add, он добавляет новую панель с этими тремя полями. Я хочу захватить пользовательский ввод из этих текстовых полей и флажков. Поскольку эти Jpanels являются динамическими, они не объявляются в коде, и я не знаю достаточно, чтобы выяснить, как получить к ним доступ. – TravisinSeattle

ответ

1

Вместо того, чтобы эти поля как локальные переменные в конструкторе, Вы должны использовать переменные класса в вашем SplitSnakeCreationPane, а затем добавить публичный метод получить, чтобы получить значения из этих полей. Пока у вас есть метод get, вы можете использовать его, чтобы получить поданное значение в любом месте.

см модифицированного класса следующим образом:

public static class SplitSnakeCreationPane extends JPanel { 
     //Count of how many snakes created 
     private static int snakeCount = 1; 

     private JTextField snakeName = null; 
     private JTextField channelCount = null;   
     private JCheckBox artistSupplied = null; 

     public SplitSnakeCreationPane() { 

      //creates Snake Panes 
      setLayout(new GridLayout(2, 4, 10, 10)); 
      add(new JLabel("Split Snake " + (snakeCount++) + ".")); 
      add(new JLabel("Snake Name")); 
      add(new JLabel("Channel Count")); 
      add(new JLabel("")); 
      add(new JLabel("")); 
      snakeName = new JTextField(30); 
      channelCount = new JTextField("0",3); 
      artistSupplied = new JCheckBox("Artist Supplied?"); 
      add(snakeName); //Snake Name field 
      add(channelCount); //Channel Count field 
      add(artistSupplied); //Artist supplied checkbox 
      setBorder(new CompoundBorder(new LineBorder(Color.BLACK), new EmptyBorder(10, 10, 10, 10))); 
     } 

     public String getSnakeName() { 
      return snakeName.getText(); 
     } 

     public String getChannelCount() { 
      return channelCount.getText(); 
     } 

     public boolean getArtistSupplied() { 
      return artistSupplied.isSelected(); 
     } 
    } 

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

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 
import javax.swing.border.CompoundBorder; 
import javax.swing.border.EmptyBorder; 
import javax.swing.border.LineBorder; 


public class MainSnakeGUI { 

    public static void main(String[] arg) { 
     new MainSnakeGUI(); 
    } 

    public MainSnakeGUI() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

       //Create the frame 
       JFrame frame = new JFrame("Snake Channels"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new SnakePane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class SnakePane extends JPanel { 


     public SnakePane() { 
      //Create buttons and labels 
      JButton btnAdd = new JButton("Add New Snake"); 
      JButton btnRemove = new JButton("Delete Snake"); 
      JButton show = new JButton("show value"); 
      JLabel headerLabel = new JLabel("Create a Split Snake"); 
      JButton btnCreate = new JButton("Create"); 
      setLayout(new BorderLayout()); 
      //Create JPanels 
      JPanel buttons = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
      JPanel header = new JPanel(new FlowLayout(FlowLayout.CENTER)); 
      JPanel footer = new JPanel(new FlowLayout(FlowLayout.CENTER)); 
      //add items to JPanels 
      buttons.add(btnAdd); 
      buttons.add(btnRemove); 
      buttons.add(show); 
      header.add(headerLabel); 
      footer.add(btnCreate); 
      //add JPanels to window 
      add(header, BorderLayout.NORTH); //sets header at the top of window 
      header.setBorder(new CompoundBorder(new LineBorder(Color.BLACK), new EmptyBorder(10, 10, 10, 10))); 
      add(buttons, BorderLayout.BEFORE_LINE_BEGINS); //sets the button to the left of the display pane 
      buttons.setBorder(new CompoundBorder(new LineBorder(Color.BLACK), new EmptyBorder(10, 10, 10, 10))); 
      add(footer, BorderLayout.AFTER_LAST_LINE); //sets buttons on the bottom of window 
      footer.setBorder(new CompoundBorder(new LineBorder(Color.BLACK), new EmptyBorder(10, 10, 10, 10))); 


      //add panel to hold new frames 
      final JPanel content = new JPanel(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 
      gbc.weighty = 1; 
      content.add(new JPanel(), gbc); 

      //add scroll pane? 
      add(new JScrollPane(content)); 

      //add listener for button 
      btnAdd.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        SplitSnakeCreationPane pane = new SplitSnakeCreationPane(); //create a new SnakeCreationPane 
        int insertAt = Math.max(0, content.getComponentCount() - 1); //insert it at the end of the list 
        GridBagConstraints gbc = new GridBagConstraints(); 
        gbc.gridwidth = GridBagConstraints.REMAINDER; 
        gbc.fill = GridBagConstraints.HORIZONTAL; 
        gbc.weightx = 1; 
        content.add(pane, gbc, insertAt); //add the pane to the window 

        System.out.println(insertAt); 
        content.revalidate(); 
        content.repaint(); 
       } 
      }); 

      btnRemove.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        int paneCount = content.getComponentCount()-1; //get count of the pane 
        content.remove(content.getComponent(paneCount-1)); //remove the pane at paneCount 
        content.revalidate(); //update window with changes 
        content.repaint(); 
        SplitSnakeCreationPane.snakeCount--; //update count for snakes 
       } 
      }); 


      show.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 

        for(int n=0; n<content.getComponentCount(); n++){ 

         if(content.getComponent(n) instanceof SplitSnakeCreationPane){ 

          SplitSnakeCreationPane com = (SplitSnakeCreationPane) content.getComponent(n); 

          System.out.println("Sname Name is : " + com.getSnakeName()); 
          System.out.println("ChannelCount is : " + com.getChannelCount()); 
          System.out.println("ArtistSupplied is : " + com.getArtistSupplied()); 
         } 


        } 



       } 
      }); 


      btnCreate.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        int paneCount = content.getComponentCount()-1; //get count of the pane 
        for (int i=0; i<paneCount;){ 

        } 
       } 
      }); 
     } 

     //set size of window 
     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(1200, 400); 
     } 
    } 

    public static class SplitSnakeCreationPane extends JPanel { 
     //Count of how many snakes created 
     private static int snakeCount = 1; 

     private JTextField snakeName = null; 
     private JTextField channelCount = null;   
     private JCheckBox artistSupplied = null; 

     public SplitSnakeCreationPane() { 

      //creates Snake Panes 
      setLayout(new GridLayout(2, 4, 10, 10)); 
      add(new JLabel("Split Snake " + (snakeCount++) + ".")); 
      add(new JLabel("Snake Name")); 
      add(new JLabel("Channel Count")); 
      add(new JLabel("")); 
      add(new JLabel("")); 
      snakeName = new JTextField(30); 
      channelCount = new JTextField("0",3); 
      artistSupplied = new JCheckBox("Artist Supplied?"); 
      add(snakeName); //Snake Name field 
      add(channelCount); //Channel Count field 
      add(artistSupplied); //Artist supplied checkbox 
      setBorder(new CompoundBorder(new LineBorder(Color.BLACK), new EmptyBorder(10, 10, 10, 10))); 
     } 

     public String getSnakeName() { 
      return snakeName.getText(); 
     } 

     public String getChannelCount() { 
      return channelCount.getText(); 
     } 

     public boolean getArtistSupplied() { 
      return artistSupplied.isSelected(); 
     } 
    } 
} 
+0

Хорошо, это имеет смысл и является отличным расширением того, что я собирался при создании этих панелей. Однако я использую конструктор, создающий объект, используя имя, которое я предоставляю. Затем я могу получить доступ к этому имени с помощью метода get, I.E. mainSnake1.getSnakeName Что мне делать, когда программа динамически создает объекты? Я не знаю, как они ссылаются, так как я узнаю, в какой области я вызываю геттер? – TravisinSeattle

+0

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

+0

Sweet, Это работает, и я думаю, что могу использовать его, чтобы масштабировать программу, чтобы делать то, что я хочу. Спасибо! – TravisinSeattle

0

Лучший способ сделать это, чтобы создать свой собственный слушатель пользовательских действий:

public class CustomListener extends ActionListener { 

    private List<SplitSnakeCreationPane> allPanes = new ArrayList<SplitSnakeCreationPane>(); 

    @Override 
    public void actionPerformed(ActionEvent e) { 
    //Create your pane 
    //Add that pane to your 'allPanes' list. 
    } 

    public List<SplitSnakeCreationPane> getAllPanes(){ 
     return this.allPanes; 
    } 

} 

Теперь вы создаете объект этого класса и Добавим, что к кнопке:

CustomListener createListener = new CustomListener(); 
btnCreate.addActionListener(createListener); 

Теперь, если вы хотите, чтобы получить оконные стекла, которые вы добавили, просто позвоните:

List<SplitSnakeCreationPane> allPanes = createListener.getAllPanes(); 
+0

Удачи! Просто начните с создания пользовательского прослушивателя и заставьте его сохранить список всего, что создано, когда вы нажимаете 'create'. Итак, просто 'allPanes.add (yourNewPane);' 'метод getAllPanes' должен затем предоставить вам список всех панелей, и каждая панель является ссылкой на существующую панель, поэтому вы можете вызвать' allPanes.get (0) .getChildren () или что-то в этом роде. –

+0

Большое вам спасибо за ваше время. Я чувствую, что это правильный ответ, но я все еще путаюсь, как его реализовать. Этот метод собирается создать список панелей КОГДА я нажимаю «создать», правильно? Затем я мог бы использовать список, чтобы ссылаться на каждую отдельную панель по своему месту в списке. Хорошо, чем больше я думаю об этом, тем больше имеет смысл. Я буду играть с этим и дам вам знать, застрянет ли я. – TravisinSeattle

+0

Список уже существует, просто пуст. Всякий раз, когда вы нажимаете кнопку 'create', добавьте панель, созданную вами в этот список.Разумеется, все это делается в методе 'actionPerformed'. Каждый раз, когда вы нажимаете 'create', панель будет добавлена ​​в список. В любое время вы можете вызвать метод 'getAllPanes()', и он предоставит вам все панели, созданные до этого момента. Я уйду спать, удачи! –

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