如何在 cardLayout 的面板之间传输数据
How to transfer data between panels of cardLayout
在我的软件中,我使用卡片布局来创建一个 "wizard-based" 界面。在面板中,用户选择一个文件,在另一个面板中获取有关上一个面板中所选文件的信息。
问题是 CardLayout 一起加载所有面板。所以面板处理预定义的数据。但我想用当前面板中提供的信息更新下一个面板。
每个面板都有 'next' 和 'back' 按钮,所以我认为这是下一个面板可以以某种方式更新的地方。我想使用 setters 和 getters 方法,但无法正确实现。
这是一个包含两个子面板的示例代码:
基地 CLASS:
public Base(){
frame.setLayout(bl);
frame.setSize(800, 600);
frame.add(new MainPanel(), BorderLayout.CENTER);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String[] args) {
// TODO code application logic here
new Base();
}
}
MainPanel(子面板支架)
class MainPanel extends JPanel{
private CardLayout cl = new CardLayout();
private JPanel panelHolder = new JPanel(cl);
public MainPanel() {
ChooseFile chooseFile = new ChooseFile(this);
ShowResult showResult = new ShowResult(this);
panelHolder.add(showResult, "showResult");
panelHolder.add(chooseFile, "chooseFile");
cl.show(panelHolder, "chooseFile");
add(panelHolder);
}
public void showPanel(String panelIdentifier){
cl.show(panelHolder, panelIdentifier);
}
}
子小组 1:
class ChooseFile extends JPanel{
MainPanel ob2;
JPanel directoryChooserPanel, bottomPanel;
JButton btn, localSourceBack, localSourceNext;
JTextField field;
public ChooseFile(MainPanel mainPanel){
this.ob2 = mainPanel;
ShowResult showResult = new ShowResult();
setLayout(new BorderLayout());
directoryChooserPanel = new JPanel(new GridLayout(0,2));
btn = new JButton("Browse");
btn.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
JFileChooser chooser = new JFileChooser("D:\Desktop");
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = chooser.showOpenDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION){
File myFile = chooser.getSelectedFile();
String text = myFile + "";
field.setText(text);
}
}
});
directoryChooserPanel.add(btn);
field = new JTextField(20);
directoryChooserPanel.add(field);
localSourceNext = new JButton("Next");
localSourceNext.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
ob2.showPanel("showResult");
showResult.setRoot(getPath());
}
});
add(directoryChooserPanel, BorderLayout.NORTH);
add(localSourceNext, BorderLayout.EAST);
}
public String getPath(){
return field.getText();
}
}
子面板 2:
class ShowResult extends JPanel{
MainPanel ob2;
JPanel bottomPanel, labelsPanel;
JButton srcLocalBTN, srcFtpBTN, sourceLocationBack;
JLabel result;
File directory;
String root;
ArrayList<String> myFiles = new ArrayList<String>();
public ShowResult(MainPanel mainPanel){
this.ob2 = mainPanel;
setLayout(new BorderLayout());
result = new JLabel();
root = "No ADDRESS";
directory = new File(root);
listFiles(directory, myFiles);
String filesNumber = "It contains " + myFiles.size() + " files.";
result.setText(filesNumber);
add(result, BorderLayout.NORTH);
}
public void listFiles(File directory, ArrayList<String> list){
for(File file : directory.listFiles()){
list.add(file.getName());
if(file.isDirectory()){
listFiles(file.getAbsoluteFile(), list);
}
}
}
public ShowResult(){
}
public void setRoot(String chosenPath){
root = chosenPath;
}
}
所以它首先加载 'sub panel 1' 所以用户通过 jFileChooser
选择一个目录,然后我需要将这些数据传输到 'sub panel 2'。所以它可以计算它包含多少文件。
我试图通过获取所选目录并分配给第二个变量中的变量来传输数据。但是没用。
有什么想法吗?
您正在创建多个 ShowResult 对象,显示一个然后将信息传递给另一个,即未显示的对象,但这不是 Java 的工作方式(这很容易通过简单地发现在此页面中搜索 new ShowResult()
个匹配项的数量)。您需要确保显示的 ShowResult 对象与您将信息传递给的对象完全相同,这意味着您必须通过构造函数或方法将显示对象的引用传递到您的 ChooseFile class参数.
更好的选择:使用 MVC 设计模式,让您的控件更改模型的状态,并让您的视图显示模型的状态。这可能会降低代码的圈复杂度。
在我的软件中,我使用卡片布局来创建一个 "wizard-based" 界面。在面板中,用户选择一个文件,在另一个面板中获取有关上一个面板中所选文件的信息。
问题是 CardLayout 一起加载所有面板。所以面板处理预定义的数据。但我想用当前面板中提供的信息更新下一个面板。 每个面板都有 'next' 和 'back' 按钮,所以我认为这是下一个面板可以以某种方式更新的地方。我想使用 setters 和 getters 方法,但无法正确实现。
这是一个包含两个子面板的示例代码: 基地 CLASS:
public Base(){
frame.setLayout(bl);
frame.setSize(800, 600);
frame.add(new MainPanel(), BorderLayout.CENTER);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String[] args) {
// TODO code application logic here
new Base();
}
}
MainPanel(子面板支架)
class MainPanel extends JPanel{
private CardLayout cl = new CardLayout();
private JPanel panelHolder = new JPanel(cl);
public MainPanel() {
ChooseFile chooseFile = new ChooseFile(this);
ShowResult showResult = new ShowResult(this);
panelHolder.add(showResult, "showResult");
panelHolder.add(chooseFile, "chooseFile");
cl.show(panelHolder, "chooseFile");
add(panelHolder);
}
public void showPanel(String panelIdentifier){
cl.show(panelHolder, panelIdentifier);
}
}
子小组 1:
class ChooseFile extends JPanel{
MainPanel ob2;
JPanel directoryChooserPanel, bottomPanel;
JButton btn, localSourceBack, localSourceNext;
JTextField field;
public ChooseFile(MainPanel mainPanel){
this.ob2 = mainPanel;
ShowResult showResult = new ShowResult();
setLayout(new BorderLayout());
directoryChooserPanel = new JPanel(new GridLayout(0,2));
btn = new JButton("Browse");
btn.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
JFileChooser chooser = new JFileChooser("D:\Desktop");
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = chooser.showOpenDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION){
File myFile = chooser.getSelectedFile();
String text = myFile + "";
field.setText(text);
}
}
});
directoryChooserPanel.add(btn);
field = new JTextField(20);
directoryChooserPanel.add(field);
localSourceNext = new JButton("Next");
localSourceNext.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
ob2.showPanel("showResult");
showResult.setRoot(getPath());
}
});
add(directoryChooserPanel, BorderLayout.NORTH);
add(localSourceNext, BorderLayout.EAST);
}
public String getPath(){
return field.getText();
}
}
子面板 2:
class ShowResult extends JPanel{
MainPanel ob2;
JPanel bottomPanel, labelsPanel;
JButton srcLocalBTN, srcFtpBTN, sourceLocationBack;
JLabel result;
File directory;
String root;
ArrayList<String> myFiles = new ArrayList<String>();
public ShowResult(MainPanel mainPanel){
this.ob2 = mainPanel;
setLayout(new BorderLayout());
result = new JLabel();
root = "No ADDRESS";
directory = new File(root);
listFiles(directory, myFiles);
String filesNumber = "It contains " + myFiles.size() + " files.";
result.setText(filesNumber);
add(result, BorderLayout.NORTH);
}
public void listFiles(File directory, ArrayList<String> list){
for(File file : directory.listFiles()){
list.add(file.getName());
if(file.isDirectory()){
listFiles(file.getAbsoluteFile(), list);
}
}
}
public ShowResult(){
}
public void setRoot(String chosenPath){
root = chosenPath;
}
}
所以它首先加载 'sub panel 1' 所以用户通过 jFileChooser
选择一个目录,然后我需要将这些数据传输到 'sub panel 2'。所以它可以计算它包含多少文件。
我试图通过获取所选目录并分配给第二个变量中的变量来传输数据。但是没用。
有什么想法吗?
您正在创建多个 ShowResult 对象,显示一个然后将信息传递给另一个,即未显示的对象,但这不是 Java 的工作方式(这很容易通过简单地发现在此页面中搜索 new ShowResult()
个匹配项的数量)。您需要确保显示的 ShowResult 对象与您将信息传递给的对象完全相同,这意味着您必须通过构造函数或方法将显示对象的引用传递到您的 ChooseFile class参数.
更好的选择:使用 MVC 设计模式,让您的控件更改模型的状态,并让您的视图显示模型的状态。这可能会降低代码的圈复杂度。