Скрыть кнопку из Layout в Java Swing - PullRequest
1 голос
/ 16 декабря 2009

Я пытаюсь что-то очень простое: У меня есть список из 5 кнопок. Они находятся в FlowLayout, и общая идея должна состоять в том, что после того, как я нажму один, он должен исчезнуть, а остальные должны соответствующим образом изменить порядок.

Теперь, если я вызываю setVisible (false), кнопка становится невидимой, но она все еще занимает свое место в Layoutmanager.

Есть ли способ сохранить Баттон в JPanel, скрывая его, чтобы он не попал в Layout?

Обновление: : Спасибо за все ответы, проблема с удалением кнопок в том, что порядок важен. Проблема, которую я пытался решить, заключалась в поиске при вводе сценария, когда очень длинный список фильтров фильтруется до тех, которые соответствуют введенным символам, поэтому пользователи могут легко нажимать на них. Поскольку пользователи могут удалять символы из поля поиска, важен порядок, и при повторном совпадении кнопки должны возвращаться.

Ответы [ 4 ]

4 голосов
/ 16 декабря 2009

Работает нормально для меня.

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

public class FlowLayoutInvisible extends JFrame
    implements ActionListener
{
    JPanel north;
    int i;

    public FlowLayoutInvisible()
    {

        north = new JPanel();

        for (int i = 0; i < 5; i++)
        {
            JButton button = new JButton("North - " + i);
            button.addActionListener(this);
            north.add(button);
        }

        getContentPane().add(north, BorderLayout.NORTH);
        }

    public void actionPerformed(ActionEvent e)
    {
        Component c = (Component)e.getSource();
        c.setVisible(false);
    ((JPanel)c.getParent()).revalidate();
    }

    public static void main(String[] args)
    {
        FlowLayoutInvisible frame = new FlowLayoutInvisible();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }
}

Если вам нужна дополнительная помощь, опубликуйте свой SSCCE .

Обновление: я не знаю, требуется ли revalidate (). Казалось, у меня однажды была проблема, но теперь я не могу продублировать проблему.

3 голосов
/ 16 декабря 2009

Просто удалите его:

 panel.remove( button );

Что не так с этой опцией?

Предполагается, что менеджеры компоновки должны избегать того, чтобы «пользователь» делал трюки, чтобы каждый компонент находился в нужном месте (хотя это, кажется, вызывает противоположный эффект)

Снятие кнопки с панели приведет к разложению всех оставшихся компонентов. Вот почему его зовут «Диспетчер компоновки», он управляет компоновкой компонентов для вас.

1 голос
/ 16 декабря 2009

Я вижу две возможности:

  • Напишите свой собственный менеджер макета, который прослушивает изменения в свойстве visible детей - не должно быть слишком сложно, вы, вероятно, можете сделать подкласс FlowLayout, чтобы сделать это.
  • фактически удаляет нажатую кнопку с панели и, при необходимости, добавляет ее позже.
0 голосов
/ 16 декабря 2009

Вы можете переопределить методы getPreferredSize() каждой кнопки (и, возможно, getMinimumSize()), чтобы возвращать 0,0, когда компонент невидим; и вам нужно вызвать, я думаю, invalidate() (или revalidate или validate, я никогда не смогу держать их прямо) на контейнере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...