CardLayout - Как удалить текущую карту (Java Swing) - PullRequest
3 голосов
/ 03 октября 2019

Как удалить текущую карту, на которой находится пользователь. Я знаю, как пройти макет карты, используя следующую и предыдущую функцию, но как удалить текущий кадр, на котором находится пользователь? Например, если у меня есть программа, в которой я нахожусь на 3-й панели из 5 панелей, как удалить текущую, которая является 3-й панелью. Как только вы удалите его, следующий или предыдущий заменит его. Я не думаю, что removecurrentlayout может использоваться, потому что я не удаляю компонент. Например, в коде, как мне удалить карту 3, если я на ней.

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Container;  
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class CardLayoutProg {

    public static void main(String[] args) {

        JFrame frame = new JFrame("CardLayout");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container contentPane = frame.getContentPane();
        JPanel buttonPanel = new JPanel();
        JButton nextButton = new JButton("Next");
        buttonPanel.add(nextButton);
        contentPane.add(buttonPanel, BorderLayout.SOUTH);
        final JPanel cardPanel = new JPanel();
        final CardLayout cardLayout = new CardLayout();
        cardPanel.setLayout(cardLayout);

        for (int i = 1; i <= 5; i++) {
          JButton card = new JButton("Card " + i);
          card.setPreferredSize(new Dimension(200, 200));
          String cardName = "card" + 123123;
          cardPanel.add(card, cardName);
        }

        contentPane.add(cardPanel, BorderLayout.CENTER);
        nextButton.addActionListener(e -> cardLayout.next(cardPanel));

        frame.pack();
        frame.setVisible(true);
  }
}

Ответы [ 3 ]

2 голосов
/ 03 октября 2019

Если вы посмотрите на документы для Container, вы увидите, что у него есть метод remove(). Так как JPanel расширяет Container, он также имеет этот метод. Вам следует ознакомиться с этими документами API, чтобы найти такую ​​информацию.

1 голос
/ 03 октября 2019

К сожалению, CardLayout не говорит вам, какая карта (JPanel) отображается в данный момент.

Проверьте Фокус макета карты для класса, который расширяет CardLayout для обеспечения этой функциональности.

Для доступа к отображаемой в данный момент панели используйте метод getCurrentCard().

Затем, получив карту, отображаемую в данный момент, вы можете удалить ее из родительской панели, используя * 1012. * метод класса Container.

Вы бы просто использовали класс следующим образом:

//final CardLayout cardLayout = new CardLayout();
final RXCardLayout cardLayout = new RXCardLayout();

Логика для вашей кнопки «Удалить» будет такой:

cardPanel.remove(cardLayout.getCurrentCard());
0 голосов
/ 03 октября 2019

Когда вы произносите index (3-я панель из 5 панелей), вы имеете в виду имя (String) компонента, когда он был вставлен, верно? Я не знаю элегантного способа сделать это, но вы можете попытаться получить все компоненты в этом контейнере (parentComponent) и попытаться найти тот, который имеет то же имя, что и ваш индекс. Например:

Component[] components = parentComponent.getComponents();

for(int i = 0; i < components.length; i++) {
    if(components[i].getName().equals(index)) {
        cardLayout.removeLayoutComponent(components[i]);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...