Как получить верхнюю карту в CardLayout Java
можно ли получить верхнюю карту в CardLayout Java? Я попытался выполнить цикл через каждый компонент, чтобы проверить видимость с помощью isVisible (), но кажется, что все они "видимы".
Edit: под "верхней картой" я имею в виду ту, которая в настоящее время находится в "верхней", отображается, а не первая или последняя карты. Кроме того, я не знаю, помогает ли это, но я ищу JPanel (или его подкласс)
Edit: фрагмент кода
for (Component component : getComponents()) {
if (component instanceof JPanel && component.isVisible()) {
currentPanel = (JPanel) component;
System.out.println(currentPanel.getClass().getName());
}
}
приведенный выше код всегда распечатывает имя каждого класса компонентов, независимо от того, являются ли они видимой картой или нет.
редактировать: я использую это как часть школьного задания. Я не пытаюсь получить халяву здесь, задание не вращается вокруг этого макета. Это просто кажется наиболее удобным расположением для изменения между панелями. Мой учитель указал, что в проекте не должно быть стороннего кода. Я видел реализацию из ссылки camickr раньше, но я не могу использовать он. Я могу свободно реализовать аналогичные функции и, возможно, дать ссылку на него в документации, но я не могу просто скачать и использовать его.
редактировать: причина, по которой я пытаюсь получить лучшие карты, потому что у меня есть панель инструментов с кнопкой "Добавить". Вместо того, чтобы иметь одну кнопку добавления для каждой из моих двух возможных вещей, я хотел, чтобы он знал, что добавить, просто посмотрев на то, что панель в настоящее время просматривается. Если есть другой, более подходящий способ сделать это, пожалуйста, дайте мне знать.
редактировать: спасибо всем за помощь. Я понял, в чем проблема. Я думаю, это была моя вина, так как я не предоставил достаточно деталей. Две мои карты -JScrollPane
s, и мне также нужно было просмотреть его содержимое, чтобы узнать, была ли одна из этих панелей той, которую я видел. Я не проверял isVisible()
на самой панели прокрутки я смотрел на это утверждает, что всегда видны, это была панель прокрутки, видимость которой мне нужно проверить.
public JPanel getCurrentPanel() {
JPanel currentPanel = null;
for (Component component : getComponents()) {
if (component.isVisible()) {
if (component instanceof JPanel)
currentPanel = (JPanel) component;
else if (component instanceof JScrollPane)
currentPanel = (JPanel) ((JScrollPane) component).getViewport().getComponent(0);
}
}
return currentPanel;
}
4 ответов
Если вы измените фрагмент кода, добавленный к вопросу, вы можете легко определить, какая карта видна. В моем тестовом фрейме, когда кнопка нажата, она печатает имя текущей видимой карты, прежде чем перейти к следующей карте. Изменяя ваш код, важно иметь в виду, что вам нужно вызвать getComponents() на компоненте, который фактически имеет CardLayout. Таким образом, виден только один из его детей. Я предполагаю, что в вашем коде вы вызываете getComponents на кадре, который содержит вашу JPanel с CardLayout.
class TestFrame
extends JFrame
implements ActionListener
{
public TestFrame()
{
cards = new JPanel(new CardLayout() );
card_list = new JPanel[5];
for (int i = 0; i < card_list.length; i++) {
String text = "Card " + i;
JPanel card = createCard(text);
card_list[i] = card;
cards.add(card, text);
}
add(cards);
}
public JPanel getCurrentCard()
{
JPanel card = null;
for (Component comp : cards.getComponents() ) {
if (comp.isVisible() == true) {
card = (JPanel)comp;
System.out.println(card.getName() );
}
}
System.out.println();
return card;
}
public void actionPerformed(ActionEvent evt)
{
JPanel card = getCurrentCard();
CardLayout cl = (CardLayout)(cards.getLayout() );
cl.next(cards);
}
public JPanel createCard(String text)
{
JPanel card = new JPanel();
card.setName(text);
JButton btn = new JButton(text);
btn.addActionListener(this);
card.add(btn);
return card;
}
JPanel cards;
JPanel[] card_list;
}
в методе actionPerformed () я напечатал имя карты, но у вас есть ссылка на текущую видимую карту.
я расширил CardLayout, чтобы обеспечить этот тип функциональности. См.Карта Макет Фокус.
изменить:
затем выполните цикл через компоненты, ища compnent с ZOrder 0. Это тот, который нарисован сверху. На самом деле вам даже не нужно перебирать все компоненты, просто получите компонент в позиции 0. Проверьте мой блог на макете перекрытия для более подробного описания того, как ZOrder завод.
Component visibleComponent = panelWithCardLayout.getComponent(0);
Edit2:
вышеуказанное редактирование неверно. ZOrder не имеет значения при использовании с CardLayout. Поэтому вы не можете просто получить компонент 0.
при осуществлении CardLayout.first()
который должен установить верхнюю видимую карту, у вас есть следующее:
int ncomponents = parent.getComponentCount();
for (int i = 0 ; i < ncomponents ; i++) {
Component comp = parent.getComponent(i);
if (comp.isVisible()) {
comp.setVisible(false); // hide previously visible components
break;
}
}
if (ncomponents > 0) {
currentCard = 0;
parent.getComponent(0).setVisible(true); // set visibility of component 0
parent.validate();
}
Итак, я полагаю, вы можете получить "верхнюю карту"yourContainer.getComponent(0)
.
вы можете установить переменную, которая меняется в зависимости от видимости карты
int cardShow;
и затем вы устанавливаете свою карту видимой
cards.show(card1, "card1");
cardShow = 1;
и когда вы пытаетесь получить, какая карта видна, просто используйте
if (cardShow == 1)
//code in case of card1 is visible