Java Gui, разрыв между элементами после скрытия некоторых из них - PullRequest
1 голос
/ 19 мая 2011

Я разрабатываю графический интерфейс в Java, используя Netbeans (7.0).

У меня есть JFrame, включая JPanel и несколько элементов внутри этой панели.

Тип макета бесплатный, я думаю.

проект:

-------------------
|JFrame           |
|                 |
| --------------- |
| |JPanel       | |
| |             | |
| | elem1 elem2 | |
| | elem3 elem4 | |
| | elem5 elem6 | |
| |             | |
| |-------------- |
|                 |
-------------------

Во время работы моей программы я скрываю некоторые элементы, находящиеся в одном ряду (например, elem3 и elem4), используя setVisible (false).

Все изменяется в соответствии с ожиданиями (JFrame и JPanel), за исключением пробелов. Похоже, что элементы скрыты правильно, но остаются пробелы, так что в моем примере, где я прячу elem3 и elem4, остается больший разрыв между строками elem1 / elem2 и elem5 / 6.

Надеюсь, моя проблема была понятна: -)

Есть ли способ исправить это поведение?

Заранее спасибо.

Штеффен

Ответы [ 3 ]

1 голос
/ 19 мая 2011

с намерением избежать каких-либо неверных интерпретаций:

, если TopLayoutContainer один раз видимый, то:

1 / для добавления нового JComponent необходимо вызвать revalidate() и длясоставные JComponents, например, с установленным программно Элемент в JComboBox необходим вызов с repaint() слишком

2 / после удаления JCmponent (s) вы должны позвонить revalidate() плюс repaint()

3 /например, удалите JComponents -> добавьте новые JComponents -> revalidate() plus repaint()

@ Steffen Kuehn, есть много возможных проблем, лучше было бы отправить код, который проиллюстрировал вашу описанную проблему

1 голос
/ 20 мая 2011

@ Steffen Kuehn, пожалуйста, ознакомьтесь с кодом ниже, который представляет «возможную» проблему, с которой вы столкнулись. то есть вы не переоцениваете и не перерисовываете панель, которая была изменена.

Обратите внимание, что при нажатии левой кнопкой мыши на панель не происходит перерисовки / повторной проверки, и сначала кажется, что ничего не происходит. Попробуйте изменить размер кадра. Он вызывает операции, и вы увидите, что элементы 5 и 6 действительно видны. Таким образом, если вы хотите, чтобы изменения были мгновенными, используйте правый клик, который изменяет и проверяет видимость.

    import java.awt.Color;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;

    public class FlowComponentsTest
    {
        public static void main(String[] args)
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                @Override
                public void run()
                {
                    final JPanel p = new JPanel();
                    for(int i = 1; i <= 20; i++)
                    {
                        JComponent c = new JTextField("I am element no. " + i);
                        //so any textfield will not steal the focus from the panel p
                        c.setFocusable(false);
                        p.add(c);
                        if(i == 5 || i == 6)
                        {
                            c.setForeground(Color.GREEN);
                            c.setVisible(false);
                        }
                    }
                    JFrame f = new JFrame();
                    f.addMouseListener(new MouseAdapter()
                    {
                        @Override
                        public void mousePressed(MouseEvent e)
                        {
                            JComponent c5 = (JComponent) p.getComponent(4);
                            JComponent c6 = (JComponent) p.getComponent(5);
                            c5.setVisible(!c5.isVisible());
                            c6.setVisible(!c6.isVisible());

                        if(e.getButton() == MouseEvent.BUTTON3)
                        {
                            System.out.println("Right click");
                            p.revalidate();
                            p.repaint();
                        }
                    }
                });
                f.setContentPane(p);
                f.setSize(300, 330);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
            }
        });
    }
}
1 голос
/ 19 мая 2011

Попробуйте удалить эти элементы из jpanel вместо скрытия, но помните, что это все равно не будет работать для некоторого макета. От того, как обрабатывать добавление и удаление компонента, зависит ваш макет.

...