我正在按照如何使用 CardLayout Java Swing 教程進行操作,然后將面板添加到布局中:
JPanel cards;
final static String BUTTONPANEL = "Card with JButtons";
//Create the "cards".
JPanel card1 = new JPanel();
//Create the panel that contains the "cards".
cards = new JPanel(new CardLayout());
cards.add(card1, BUTTONPANEL);
他們還說:
要將組件添加到 CardLayout 物件管理的容器中,請指定一個標識要添加的組件的字串。例如,在這個演示中,第一個面板有字串“Card with JButtons”
因此,如果該字串用于標識要添加的組件,我想知道是否有辦法從 AssertJ SwingFrameFixture或直接從JFrame物件獲取布局中的特定面板,并傳遞字串。
我看到該add方法是繼承自java.awt.Container. 我期待找到一種方法可以讓我做類似的事情,frame.getComponent(BUTTONPANEL)但該方法需要一個索引作為引數。我忽略了什么嗎?
我也知道我可以這樣做card1.setName(BUTTONPANEL),然后在我的測驗中檢索它:
window = new FrameFixture(view);
window.panel(BUTTONPANEL);
add但是,如果沒有用,那么在方法中設定該字串有什么意義。謝謝。
編輯:
我錯過了一個事實,當然BUTTONPANEL它用于從卡片布局更改面板的字串,如下所示:
cardLayout.show(getContentPane(), BUTTONPANEL);
很明顯,那個字串是有用的。
但是,我正在尋找一種能夠通過在or物件JPanel上呼叫方法并傳遞字串來獲取物件的方法。像這樣的東西:JFrameFrameFixture
JPanel buttonPanelPanel = frame.getPanelFromName(BUTTONPANEL);
這是因為在測驗中我無法直接訪問面板,而只能訪問框架。為了在特定面板上做出斷言,我希望能夠使用add. 但也許這是不可能的。
uj5u.com熱心網友回復:
我在類中添加了一個方法以在您傳遞 a 時MainPanel回傳a 。我不使用該方法,但它就在那里。JPanelString
我將所有額外的類都做成了內部類,這樣我就可以將代碼作為一個塊發布。
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class CardPanelExample implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new CardPanelExample());
}
private final MainPanel mainPanel;
public CardPanelExample() {
this.mainPanel = new MainPanel(this);
}
@Override
public void run() {
JFrame frame = new JFrame("CardPanel Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(mainPanel.getPanel(), BorderLayout.CENTER);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public void setNextPanel() {
mainPanel.setNextPanel();
}
public JPanel getPanelFromName(String name) {
return mainPanel.getPanelFromName(name);
}
public class MainPanel {
private final CardLayout cardLayout;
private final JPanel panel;
private JPanel yellowPanel, orangePanel, whitePanel;
private final String[] panelStrings;
private String currentPanelString;
public MainPanel(CardPanelExample view) {
this.cardLayout = new CardLayout();
this.panelStrings = new String[] { "alpha", "beta", "gamma" };
this.currentPanelString = panelStrings[0];
this.panel = createMainPanel(view, cardLayout, panelStrings);
}
private JPanel createMainPanel(CardPanelExample view,
CardLayout cardLayout, String[] panelStrings) {
this.yellowPanel = new ColorPanel(view, Color.YELLOW).getPanel();
this.orangePanel = new ColorPanel(view, Color.ORANGE).getPanel();
this.whitePanel = new ColorPanel(view, Color.WHITE).getPanel();
JPanel panel = new JPanel(cardLayout);
panel.add(yellowPanel, panelStrings[0]);
panel.add(orangePanel, panelStrings[1]);
panel.add(whitePanel, panelStrings[2]);
return panel;
}
public JPanel getPanelFromName(String name) {
if (name.equals(panelStrings[0])) {
return yellowPanel;
} else if (name.equals(panelStrings[1])) {
return orangePanel;
} else if (name.equals(panelStrings[2])) {
return whitePanel;
} else {
return null;
}
}
public void setNextPanel() {
for (int index = 0; index < panelStrings.length; index ) {
if (currentPanelString.equals(panelStrings[index])) {
index = index % panelStrings.length;
currentPanelString = panelStrings[index];
cardLayout.show(panel, currentPanelString);
return;
}
}
}
public JPanel getPanel() {
return panel;
}
}
public class ColorPanel {
private final JPanel panel;
public ColorPanel(CardPanelExample view, Color backgroundColor) {
this.panel = createMainPanel(view, backgroundColor);
}
private JPanel createMainPanel(CardPanelExample view, Color backgroundColor) {
JPanel panel = new JPanel(new FlowLayout());
panel.setBackground(backgroundColor);
panel.setBorder(BorderFactory.createEmptyBorder(25, 150, 25, 150));
JButton button = new JButton("Next Panel");
button.addActionListener(new ButtonListener(view));
panel.add(button);
return panel;
}
public JPanel getPanel() {
return panel;
}
}
public class ButtonListener implements ActionListener {
private final CardPanelExample view;
public ButtonListener(CardPanelExample view) {
this.view = view;
}
@Override
public void actionPerformed(ActionEvent event) {
view.setNextPanel();
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/428113.html
上一篇:網格包布局25P%%
