2016-01-03 3 views
1

Мое Цель в том, что когда я нажимаю кнопку b1 («SHOW»), кнопка b2 («BUTTON 2») должна появиться в 10px справа от кнопки b1.Когда я нажимаю кнопки b1 в первый раз, он работает так, как предполагалось, но со второго раза кнопка b2 становится помещенной в (0,0) position.why?Проблема с динамическим размещением кнопок в приложении Swing

import javax.swing.JPanel; 
import javax.swing.JFrame; 
import javax.swing.JButton; 
import javax.swing.Spring; 
import javax.swing.SpringLayout; 
import java.awt.event.*; 
import javax.swing.*; 

class DynamicSpring implements ActionListener 
{ 
    JPanel jp; 
    JFrame jf; 
    JButton b1,b2; 
    SpringLayout sl; 
    DynamicSpring() 
    { 
    jf=new JFrame("DynamicSpring"); 
    jf.setSize(500,500); 
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    sl=new SpringLayout(); 
    jp=new JPanel(sl); 

    b1=new JButton("SHOW"); 
    b1.setSize(100,100); 
    sl.putConstraint(SpringLayout.WEST,b1,10,SpringLayout.WEST,jp);  
     sl.putConstraint(SpringLayout.NORTH,b1,10,SpringLayout.NORTH,jp); 
    b1.addActionListener(this); 
    jp.add(b1); 

    b2=new JButton("Button 2"); 
    b2.setSize(100,100); 


    jf.setContentPane(jp); 
    jf.setVisible(true); 



    } 

    public void actionPerformed(ActionEvent ae) 
    { 
     sl.putConstraint(SpringLayout.WEST,b2,10,SpringLayout.EAST,b1); 
     jp.add(b2); 

     jp.repaint(); 
     jp.validate(); 
    } 

    public static void main(String... s) 
    { 
    new DynamicSpring(); 
    } 

} 
+3

Удалить второй вопрос. это все равно. –

+0

Позвоните 'revalidate', а затем' repaint' – MadProgrammer

+0

все еще получаете тот же результат –

ответ

1

Используйте MigLayout вместо SpringLayout. С MigLayout можете использовать опцию hidemode ограничения:

hidemode: Устанавливает режим скрытия для компонента. Если режим скрыть был указан в этом режиме скрыть, можно переопределить ограничение компонента. Режим hide указывал, как диспетчер компоновки должен обрабатывать компонент , который не отображается. Режимы:

0 -Default. Это означает, что невидимые компоненты будут обрабатываться точно так, как если бы они были видны.

1 -The размер компонента (если невидимый) будет установлен в 0, 0.

2 -The размер компонента (если невидимый) будет установлен в 0, 0 и пробелы также будут установлены на 0 вокруг него.

3 -Инвестиционные компоненты не будут участвовать в макете вообще, и это, например, не займет ячейку сетки.

Ваш код будет:

DynamicString() { 
    jp=new JPanel(sl); 
    b1=new JButton("SHOW"); 
    b1.addActionListener(this); 
    jp.add(b1,"newline, w 100!, h 100!"); 

    b2=new JButton("Button 2"); 
    jp.add(b2,"w 100!, h 100!, hidemode 0"); // use whatever hidemode mode that's the more convenient for you 
    b2.setVisible(false); 

    jf.setContentPane(jp); 
    jf.setVisible(true); 

    } 

public void actionPerformed(ActionEvent ae) { 
    b2.setVisible(true); 
} 
+0

Я бы не рекомендовал использовать MigLayout. Он не является частью Java API, он может вызвать некоторые проблемы с лицензированием (это GPL) для коммерческих приложений, и если другие люди должны участвовать в проекте, они должны сначала привыкнуть к нему ... Я бы рекомендовал использовать Java API, если он также выполняет свою работу ... –

3

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

Вы можете избежать этого, удалив b1, прежде чем делать что-нибудь еще в вашем actionPerformed:

public void actionPerformed(ActionEvent ae) 
{ 
     jp.remove(b2); /* remove the button first! */ 
     sl.putConstraint(SpringLayout.WEST,b2,10,SpringLayout.EAST,b1); 
     jp.add(b2); 
     jp.repaint(); 
     jp.validate(); 
} 

Это не должно вызывать никаких проблем в первый раз, так как не снимая несуществующий элемент имеет никакого эффекта!

+0

tthis работал !!! но я мог понять, почему мне нужно удалить кнопку b2 перед ее добавлением. Согласно правилу, любой компонент удаляется из предыдущего контейнера, если компонент добавлен в другой контейнер ..... поэтому, когда я нажимаю кнопку b1 для 2-й раз, кнопка b2 должна быть автоматически удалена из контейнера, а затем она должна быть добавлена ​​в тот же контейнер. –

+0

Если это работает, отметьте ответ как правильный. У вас нет кнопки дважды, если вы добавляете ее несколько раз, но 'SpringLayout' не может справиться с ней правильно. Я предполагаю, что это связано с тем, что Constraint по-прежнему принадлежит к «старому экземпляру» кнопки, когда вы добавляете его во второй раз и не используется для «нового экземпляра», хотя это тот же объект. –

+0

ok ... но когда я нажал кнопку b1 в первый раз, не должен ли она давать какую-либо ошибку, поскольку она должна удалить b2, которая не находится в контейнере ??? –

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