2014-12-04 2 views
0

Это мой первый вопрос, поэтому, пожалуйста, несите меня :) Im работает над динамической частью графического интерфейса, и по какой-то причине его дразнит меня. Класс открывается в новом окне после входа в систему. Я хочу, чтобы новый JPanel был создан и добавлен в «контейнер» каждый раз при нажатии кнопки «добавить игрока». Он должен помещать их ниже eachother, но все, что он делает, это добавить одну кнопку при первом щелчке, а затем остальные клики впоследствии ничего не делают.Динамическое добавление JPanels к JFrame

Любая помощь приветствуется :)

package Gui; 

import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
//import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

@SuppressWarnings("serial") 
public class TeamManagerGUI extends JFrame implements ActionListener 
{ 
// private JLabel pNameLabel = new JLabel("Player Name: "), 
//     pSchoolLabel = new JLabel("School: "); 
// private JTextField pNameField = new JTextField(), 
//      pSchoolField = new JTextField(); 
    private JButton addButton = new JButton("Add Player"), 
        removeButton = new JButton("Remove player"); 
    private JPanel container = new JPanel(), 
        playerContainer = new JPanel(); 


    int frameCounter = 1; 

    public TeamManagerGUI() 
    { 
     super("Team Manager User Interface"); 
     setSize(1200,800); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     container.setLayout(new GridBagLayout()); 
     playerContainer.setLayout(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 

     gbc.gridx = 0; 
     gbc.gridy = 0; 
     gbc.insets = new Insets(3,3,3,3); 
     addButton.addActionListener(this); 
     container.add(addButton,gbc); 

     gbc.gridx = 1; 
     gbc.gridy = 0; 
     gbc.insets = new Insets(3,3,3,3); 
     container.add(removeButton,gbc); 

     this.add(container); 
    } 

    public void playerFrame() 
    { 
     GridBagConstraints gbc = new GridBagConstraints(); 

     playerFrameArr.add(new JPanel()); 

     gbc.gridx = 0; 
     gbc.gridy = 0; 
     playerContainer.add(new JButton("LABEL"),gbc); 

     gbc.gridx = 1; 
     gbc.gridy = 0; 
     playerContainer.add(new JButton("BUTTON"),gbc); 

     gbc.gridx = 0; 
     gbc.gridy = frameCounter+1; 
     container.add(playerContainer,gbc); 

     System.out.println(frameCounter); 

     frameCounter++; 
    } 

    public void addPlayerRow() 
    { 
     playerFrame(); 
     container.revalidate(); 
     container.repaint(); 
    } 

    public void removePlayerRow() 
    { 
     //Not yet implemented 
    } 

    public void actionPerformed(ActionEvent ae) 
    { 
     if(ae.getSource() == addButton) 
     { 
      addPlayerRow(); 
     } 
     if(ae.getSource() == removeButton) 
     { 
      //Not yet implemented 
     } 
    } 
} 

ответ

1

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

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

Я имею в виду что-то вроде этого:

public void playerFrame() 
{ 
    GridBagConstraints gbc = new GridBagConstraints(); 

    JPanel newPanel = new JPanel(new GridBagLayout()); 
    playerFrameArr.add(newPanel); 

    gbc.gridx = 0; 
    gbc.gridy = 0; 
    newPanel.add(new JButton("LABEL"), gbc); 

    gbc.gridx = 1; 
    gbc.gridy = 0; 
    newPanel.add(new JButton("BUTTON"), gbc); 

    gbc.gridx = 0; 
    gbc.gridy = frameCounter + 1; 
    container.add(newPanel, gbc); 

    System.out.println(frameCounter); 

    frameCounter++; 
} 
+0

Теперь, когда они добавляют хорошо, как я могу удалить их по одному за раз со дна? У них нет настоящих имен, или я чего-то не хватает? – H4rdstyler

+0

Ну, у вас есть список 'playerFrameArr', не так ли? Вы можете извлечь последнюю запись из этого списка и удалить эту панель из своего контейнера. Должен работать нормально. Вы также можете использовать размер этого списка в качестве счетчика кадров. Это может пригодиться, если вы хотите добавить и удалить эти записи на постоянной основе. – Nitram

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