【问题标题】:CardLayout - How to Delete current card (Java Swing)CardLayout - 如何删除当前卡片 (Java Swing)
【发布时间】:2020-02-01 05:08:24
【问题描述】:

如何删除用户当前使用的卡。我知道如何使用下一个和上一个功能完成卡片布局,但是如何删除用户所在的当前帧?例如,如果我有一个程序,我目前在 5 个面板中的第 3 个面板上,我将如何删除当前的第 3 个面板。删除它后,下一个或上一个将替换它。我不认为 removecurrentlayout 可以使用,因为我没有删除组件。例如,在代码中,如果我在上面,我将如何删除 Card 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);
  }
}

【问题讨论】:

  • String cardName = "card" + 123123; 为什么代码会循环添加同名卡片?更广泛地说,您为什么认为需要删除一张卡片?一旦删除,应该出现什么?解决方案可能就像添加一个空白JPanel 并在用户决定是时候“删除”现有卡(实际上不移除卡)时翻转到它一样简单,最好的操作可能是简单地更改将卡片中任何控件中显示的值恢复为默认值(例如,将信息提交到存储中)..

标签: java swing cardlayout


【解决方案1】:

如果您查看Container 的文档,您会发现它有一个remove() 方法。由于JPanel继承了Container,所以也有这个方法。您应该熟悉这些 API 文档才能找到此类信息。

【讨论】:

    【解决方案2】:

    很遗憾,CardLayout 没有告诉您当前正在显示哪张卡片 (JPanel)。

    查看Card Layout Focus 以获取扩展CardLayout 以提供此功能的类。

    您将使用getCurrentCard() 方法访问当前正在显示的面板。

    然后,一旦您获得当前显示的卡片,您可以使用 Container 类的 remove(...) 方法将其从父面板中删除。

    您只需按如下方式使用该类:

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

    “删除”按钮的逻辑是:

    cardPanel.remove(cardLayout.getCurrentCard());
    

    【讨论】:

      【解决方案3】:

      当您说索引(第 3 个面板,共 5 个面板)时,您的意思是插入组件时的名称(字符串),对吗?我不知道有什么优雅的方法可以做到这一点,但是您可以尝试获取此容器(parentComponent)中的所有组件并尝试找到与您的索引同名的组件。例如:

      Component[] components = parentComponent.getComponents();
      
      for(int i = 0; i < components.length; i++) {
          if(components[i].getName().equals(index)) {
              cardLayout.removeLayoutComponent(components[i]);
          }
      }
      

      【讨论】:

      • (1-) CardLayout 在内部管理名称。这是将卡片添加到面板时使用的约束。阅读 How to Use CardLayout 上的 Swing 教程,了解布局管理器的工作原理。
      猜你喜欢
      • 2011-07-14
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      相关资源
      最近更新 更多