2015-08-24 2 views
1

В моей JFrame, у меня есть в каждой строке два label и один JComboBox ordred следующим образом:Изменение положения JBouton динамически

Label JComboBox Label 
**Bouton** 

Пользователь может добавить новую строку с теми же лицами. Итак, я добавляю бутон, и когда пользователь отправляет новую строку, создается.

Label JComboBox Label 
    **Bouton** 
    Label JComboBox Label 

Однако положение бутона сохраняется в том же положении. Как изменить положение бутона (в конце страницы), даже если создается новая строка?

Мой код ниже:

public class Display extends JFrame{ 

    public Display(){ 
     super("Test"); 
     setTitle("Test"); 
     setSize(800,800); 
     setResizable(false); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     initComponents(); 
    } 

    private void initComponents(){ 
     setLayout(new GridLayout(0, 3)); 

     JPanel po = new JPanel(); 
     JLabel label = new JLabel("Resource"); 
     po.add(label); 
     add(po); 

     JPanel po2 = new JPanel(); 
     po2.add(new JComboBox<>(new String[] { "option1", "option2", "option3",})); 
     add(po2); 


     JPanel po3 = new JPanel(); 
     JLabel label3 = new JLabel("Something"); 
     po3.add(label3); 
     add(po3); 


     //new 
     JPanel PanelBouton = new JPanel(); 
     JButton bouton = new JButton(new AddResourceAction("Add new")); 
     add(bouton); 
     PanelBouton.add(bouton); 
     add(PanelBouton); 

     PanelBouton = new JPanel(); 
     JLabel vide = new JLabel(""); 
     PanelBouton.add(vide); 
     add(PanelBouton); 

     PanelBouton = new JPanel(); 
     vide = new JLabel(""); 
     PanelBouton.add(vide); 
     add(PanelBouton); 

    } 

class AddResourceAction extends AbstractAction { 

     public AddResourceAction(String n){ 
      super(n); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 

      JPanel po = new JPanel(); 
      JLabel label = new JLabel("Resource"); 
      po.add(label); 
      add(po); 

      JPanel po2 = new JPanel(); 
      po2.add(new JComboBox<>(new String[] { "option1", "option2", "option3",})); 
      add(po2); 


      JPanel po3 = new JPanel(); 
      JLabel label3 = new JLabel("Something"); 
      po3.add(label3); 
      add(po3); 

      revalidate(); 

     } 
} 




    public static void main(String[] args) { 
     /*display panel*/ 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override public void run() { 
       new Display().setVisible(true); 
      } 
     }); 

    } 

} 
+1

Я нашел решение. Если кто-то нуждается в решении в футуре этого вопроса. Вы можете просто удалить Bouton и воссоздать новый после создания новой строки. Не забудьте validate() & repaint() в JFrame. cheers – Mehdi

+0

Это выглядит как табличные данные для меня. Для этого используйте 'JTable'. –

ответ

2

Создать разделенную панель, которая имеет два контейнера. Один контейнер (A) для динамических кнопок и другой контейнер для кнопки «Добавить новый». Добавьте новые компоненты в контейнер A.

Найти код ниже, который иллюстрирует эту концепцию с вашей ситуацией. использование на свой страх и риск :)

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class Display 
    extends JFrame 
{ 
    Box upperBox = new Box(BoxLayout.X_AXIS); 
    Box dynamicBox = new Box(BoxLayout.Y_AXIS); 
    Box staticBox = new Box(BoxLayout.X_AXIS); 

    public Display() 
    { 
     super("Test"); 
     setTitle("Test"); 
     setSize(800,800); 
     setResizable(false); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     initComponents(); 
    } 

    private void initComponents() 
    { 
     //This will be the parent panel for other panels. 
     JPanel panel = new JPanel(); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 

     upperBox.add(new JLabel("Resource")); 
     upperBox.add(new JComboBox<>(new String[] { "option1", "option2", "option3",})); 
     upperBox.add(new JLabel("Something")); 

     panel.add(upperBox); 

     staticBox.add(new JButton(new AddResourceAction("Add new"))); 

     panel.add(dynamicBox); //just add this box now, it will be filled later with components 
     panel.add(staticBox); 

     add(panel); 
    } 

    class AddResourceAction extends AbstractAction 
    { 
     public AddResourceAction(String n) 
     { 
      super(n); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 

      Box box = new Box(BoxLayout.X_AXIS); 
      box.add(new JLabel("Resource")); 
      box.add(new JComboBox<>(
         new String[] { "option1", "option2", "option3",})); 
      box.add(new JLabel("Something")); 

      dynamicBox.add(box); 

      revalidate(); 
     } 
    } 

    public static void main(String[] args) 
    { 
     /*display panel*/ 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       new Display().setVisible(true); 
      } 
     }); 
    } 
} 
Смежные вопросы