Как получить верхнюю карту в Java CardLayout
Можно ли получить верхнюю карту в Java CardLayout?
Я пробовал прокручивать каждый компонент, чтобы проверить видимость с помощью isVisible(), но кажется, что они все "видимы".
Изменить: по "верхней карте" я имею в виду ту, что сейчас отображается на "сверху", а не на первой или последней. Кроме того, я не знаю, помогает ли это, но я ищу JPanel (или его подкласс)
Изменить: фрагмент кода
for (Component component : getComponents()) {
if (component instanceof JPanel && component.isVisible()) {
currentPanel = (JPanel) component;
System.out.println(currentPanel.getClass().getName());
}
}
Приведенный выше код всегда печатает каждое имя класса компонента, независимо от того, являются ли они видимой картой или нет.
Изменить. Я использую это как часть школьного задания. Я не пытаюсь получить халяву здесь, назначение не вращается вокруг этого макета. Это просто удобная компоновка для переключения между панелями. Мой учитель указал, что в проекте не должно быть стороннего кода. Я видел реализацию из ссылки camickr раньше, но я не могу ее использовать. Я могу свободно реализовать аналогичные функции и, возможно, дать ссылку на нее в документации, но я не могу просто загрузить и использовать ее.
Изменить. Причина, по которой я пытаюсь получить верхнюю карту, состоит в том, что у меня есть панель инструментов с кнопкой "Добавить". Вместо того, чтобы добавить одну кнопку для каждой из моих двух возможных вещей, я хотел, чтобы она знала, что добавить просто, посмотрев, какая панель просматривается в данный момент. Если есть другой, более подходящий способ сделать это, пожалуйста, дайте мне знать.
Изменить. Спасибо всем за помощь. Я понял, в чем проблема. Думаю, это была моя ошибка, так как я не представил достаточно подробностей. Две мои карты JScrollPane
, и мне также нужно было просмотреть ее содержимое, чтобы узнать, была ли одна из этих панелей той, которую я видел. Я не проверял 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;
}
Ответы
Ответ 1
Если вы измените фрагмент кода, добавленный в вопрос, вы можете легко определить, какая карта видна. В моем тестовом кадре, когда кнопка нажата, она печатает имя текущей видимой карты, прежде чем переходить на следующую карту. Изменив свой код, важно помнить, что вам нужно вызвать 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() я напечатал имя карты, но у вас есть ссылка на карту, видимую в данный момент.
Ответ 2
Я расширил CardLayout, чтобы обеспечить этот тип функциональности. См. "Макет карты" .
Edit:
Затем зациклируйте компоненты, которые ищут compnent с ZOrder of 0. Это тот, который нарисован сверху. На самом деле вам даже не нужно перебирать все компоненты, просто добавьте компонент в позицию 0. Просмотрите мой блог в макете перекрытия для более подробного описания того, как работает ZOrder.
Component visibleComponent = panelWithCardLayout.getComponent(0);
Edit2:
Вышеизложенное изменение неверно. ZOrder не имеет значения при использовании с CardLayout. Таким образом, вы не можете просто получить компонент 0.
Ответ 3
В реализации 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)
.
Ответ 4
Вы можете установить переменную, которая изменяется в зависимости от видимости карты
например
int cardShow;
а затем вы видите свою карту.
cards.show(card1, "card1");
cardShow = 1;
и когда вы пытаетесь получить, какая карта видна, просто используйте
if (cardShow == 1)
//code in case of card1 is visible