在我的软件中,我使用卡片布局来创建一个基于向导的"接口。在面板中,用户选择一个文件,在另一个面板中获取有关所选文件的信息。
问题是CardLayout将所有面板一起加载。因此,面板处理预定义数据。但我想用当前面板中给出的信息更新下一个面板。 每个小组都有' next'和'回来'按钮,所以我认为这是下一个面板可以以某种方式更新的点。我认为使用setter和getters方法但无法正确实现它。
以下是包含两个子面板的示例代码: 基础课程:
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;
}
}
因此它第一次出现负载和子面板1&#39;所以用户按jFileChooser
选择目录,然后我需要将此数据传输到&#39;子面板2&#39;。因此它可以计算它包含的文件数量。
我试图通过获取所选目录并分配给第二个变量中的变量来传输数据。但是没有用。
有什么想法吗?
答案 0 :(得分:3)
您正在创建多个ShowResult对象,显示一个但随后将信息传递给另一个,即非显示的对象,但这不是Java的工作方式(通过简单地搜索此页面可以轻松发现new ShowResult()
匹配)。您需要确保显示的ShowResult对象与您传递信息的对象完全相同,这意味着您必须通过构造函数或方法参数将显示的对象的引用传递给ChooseFile类。
更好的选择:使用MVC设计模式,制作,让控件更改模型的状态,并且视图显示模型的状态。这可能会降低代码的圈复杂度。