CardLayout - 如何删除当前卡片 (Java Swing)
CardLayout - How to Delete current card (Java Swing)
如何删除用户当前所在的卡。我知道如何使用下一个和上一个功能浏览卡片布局,但如何删除用户所在的当前帧?例如,如果我有一个程序,我目前位于 5 个面板中的第 3 个面板,我将如何删除当前的第 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);
}
}
如果你查看 Container
, you will see that it has a remove()
method. Since JPanel
extends Container
的文档,它也有这个方法。您应该熟悉这些 API 文档以找到此类信息。
不幸的是,CardLayout
没有告诉您当前正在显示哪个卡片 (JPanel)。
查看 Card Layout Focus 的 class 扩展 CardLayout
以提供此功能。
您将使用 getCurrentCard()
方法访问当前显示的面板。
然后,一旦您获得当前显示的卡片,您就可以使用 Container
class.
的 remove(...)
方法将其从父面板中删除
您只需按如下方式使用 class:
//final CardLayout cardLayout = new CardLayout();
final RXCardLayout cardLayout = new RXCardLayout();
您的 "Remove" 按钮的逻辑是:
cardPanel.remove(cardLayout.getCurrentCard());
当你说索引(3rd panel of 5 panels)时,你指的是插入组件时的名称(String),对吧?我不知道有什么优雅的方法可以做到这一点,但您可以尝试获取此容器 (parentComponent) 中的所有组件,并尝试找到与您的索引同名的组件。例如:
Component[] components = parentComponent.getComponents();
for(int i = 0; i < components.length; i++) {
if(components[i].getName().equals(index)) {
cardLayout.removeLayoutComponent(components[i]);
}
}
如何删除用户当前所在的卡。我知道如何使用下一个和上一个功能浏览卡片布局,但如何删除用户所在的当前帧?例如,如果我有一个程序,我目前位于 5 个面板中的第 3 个面板,我将如何删除当前的第 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);
}
}
如果你查看 Container
, you will see that it has a remove()
method. Since JPanel
extends Container
的文档,它也有这个方法。您应该熟悉这些 API 文档以找到此类信息。
不幸的是,CardLayout
没有告诉您当前正在显示哪个卡片 (JPanel)。
查看 Card Layout Focus 的 class 扩展 CardLayout
以提供此功能。
您将使用 getCurrentCard()
方法访问当前显示的面板。
然后,一旦您获得当前显示的卡片,您就可以使用 Container
class.
remove(...)
方法将其从父面板中删除
您只需按如下方式使用 class:
//final CardLayout cardLayout = new CardLayout();
final RXCardLayout cardLayout = new RXCardLayout();
您的 "Remove" 按钮的逻辑是:
cardPanel.remove(cardLayout.getCurrentCard());
当你说索引(3rd panel of 5 panels)时,你指的是插入组件时的名称(String),对吧?我不知道有什么优雅的方法可以做到这一点,但您可以尝试获取此容器 (parentComponent) 中的所有组件,并尝试找到与您的索引同名的组件。例如:
Component[] components = parentComponent.getComponents();
for(int i = 0; i < components.length; i++) {
if(components[i].getName().equals(index)) {
cardLayout.removeLayoutComponent(components[i]);
}
}