所以我有一个用按钮,文本字段和标签制作的布局。用户应该将输入放入文本字段中。当他点击一个按钮时,我想要它以便输入被清除并且一个新的"页面"显示我已经制作的布局。用户可以在新的"页面中输入尽可能多的信息。正如他所希望的那样,直到他击中一个"完成"按钮。简而言之,我想在面板或框架之间切换(我不知道哪个,可能是面板?)。现在,我正在考虑使用卡片布局来实现这一点,但是由于我正在阅读用户输入,因为基于预定数量的面板以及面板中的内容进行了卡片布局,所以它并不真正有意义。由于我不知道用户何时完成",我不知道要使用多少个面板。
无论如何,我只是一个GUI的初学者,所以任何帮助都会很棒!
答案 0 :(得分:2)
现在,我正在考虑使用卡片布局来做到这一点,但是因为我 读取用户输入,因为cardlayout是真的没有意义 根据预定数量的面板制作而成的面板 面板。由于我不知道用户什么时候“完成”,我不会知道 要使用多少个面板。
您可以在下一个按钮的点击中将组件添加到CardLayout。如果所有页面具有相同的结构,则可以为这些页面创建一个类,并在每次按下下一个按钮时添加一个新类。按下完成按钮后,对所有那些遍历面板(使用CardLayout
)组件的页面执行某些操作。看看Container.getComponents()方法。你甚至不需要保留任何类型的数组也不需要列表,因为容器已经这样做了。
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class Demo {
private void createAndShowGUI() {
final JPanel cardPanel = new JPanel(new CardLayout());
cardPanel.add(new Page(), "1");
final JButton nextButton = new JButton("Next");
nextButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cardPanel.add(new Page(), String.valueOf(cardPanel.getComponentCount() + 1));
CardLayout layout = (CardLayout)cardPanel.getLayout();
layout.next(cardPanel);
}
});
final JButton finishButton = new JButton("Finish");
finishButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
nextButton.setEnabled(false);
for(Component comp : cardPanel.getComponents()) {
if(comp instanceof Page) {
Page page = (Page)comp;
page.printData();
}
}
}
});
JPanel buttonsPanel = new JPanel();
buttonsPanel.add(nextButton);
buttonsPanel.add(finishButton);
JFrame frame = new JFrame("Demo");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(cardPanel, BorderLayout.CENTER);
frame.getContentPane().add(buttonsPanel, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
class Page extends JPanel {
final private JTextField data;
public Page() {
super();
add(new JLabel("Please add some info:"));
data = new JTextField(20);
add(data);
}
public void printData() {
System.out.println(data.getText());
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Demo().createAndShowGUI();
}
});
}
}
答案 1 :(得分:0)
据我所知,您不需要多个面板。我假设您的模型层有某种对象层次结构。因此,我们假设您使用这些输入值来创建AnObject
个对象。
您可以在头等舱中创建ArrayList<AnObject>
。当用户输入和点击完成后,您只需再创建一个带有给定输入的AnObject
,并将其添加到您在顶级类中定义的ArrayList。
顺便说一句,你也可以定义ArrayList,只要它可以访问。但是你必须仔细考虑,以保持数据的持久性。如果您定义ArrayList的类的对象是&#34;已经消失了#34;,那么您的数据也会消失。#34;。我认为这应该足够清楚了。
下一步只是简单地清除那些输入字段。
这是最简单的方法,根据您的使用情况,它可能不是最明智的方法。但它会让你知道要看什么和学习什么。