Как получить максимальную карту в карте Java
-
08-10-2019 - |
Вопрос
Можно ли получить верхнюю карту в карте Java? Я пробовал зацикливаться через каждый компонент, чтобы проверить видимость с невидимым (), но кажется, что они все «видны».
Редактировать: на «Верхняя карта» я имею в виду тот, который в настоящее время находится на «верхнем», отображается не первым или последним картами. Кроме того, я не знаю, поможет ли это, но я ищу jpanel (или их подкласс)
Редактировать: фрагмент кода
for (Component component : getComponents()) {
if (component instanceof JPanel && component.isVisible()) {
currentPanel = (JPanel) component;
System.out.println(currentPanel.getClass().getName());
}
}
Приведенный выше код всегда печатает имя каждого класса компонентов, независимо от того, являются ли они видимой картой или нет.
Редактировать: Я использую это как часть школьного назначения. Я не пытаюсь получить здесь Freebie, назначение не вращается вокруг этого макета. Похоже, что это самый удобный макет для изменения между панелями. Мой учитель указал, что в проекте нет стороннего кода. Я видел реализацию от ссылки 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;
}
Решение
Если вы измените фрагмент кода, который вы добавили к вопросу, вы можете легко сказать, какая карта видна. В моей тестовой кадре, когда кнопка нажата, она печатает имя видимой в данный момент видимой карты, прежде чем переворачивается на следующую карту. Изменяя ваш код, важно иметь в виду, что вам нужно позвонить в GetComponentents () на компонент, который на самом деле имеет 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, чтобы обеспечить этот тип функциональности. Видеть Расположение карты фокусировки.
Редактировать:
Затем петлю через компоненты, которые ищут компютер с Zorker 0. Это тот, который окрашен сверху. На самом деле вам даже не нужно повторять все компоненты, просто получите компонент в положении 0. Проверьте мой блог на макете для перекрытия для более подробного описания того, как работает Zorder.
Component visibleComponent = panelWithCardLayout.getComponent(0);
Редактировать2:
Вышеуказанное редактирование неверно. Zorker не имеет смысла при использовании с 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