Java Swing: не могу показать несколько экземпляров моего JPanel

Я делаю GUI и у меня проблемы с JPanel.

Прежде всего, вот мой JPanel:

public class ExperimentPanel extends JPanel{

private static File file1,file2=null;

private static DefaultListModel model = new DefaultListModel();
private static JList list = new JList(model);

private static JPanel mainpanel = new JPanel();
private static JPanel leftpanel = new JPanel();
private static JPanel rightpanel = new JPanel();
private static JPanel twoFiles = new SelectTwoFiles();
private static JPanel folderOrFile = new SelectFolderOrFile();
private static JPanel foldersOrFiles = new SelectTwoFoldersOrFiles();

public ExperimentPanel(int selectID){

    this.setBorder(new EmptyBorder(10, 10, 10, 10));

    if(selectID==Constants.SelectTwoFiles){
    this.add(twoFiles, BorderLayout.NORTH);
    }
    else if(selectID==Constants.SelectFolderOrFile){
    this.add(folderOrFile, BorderLayout.NORTH);
    }
    else if(selectID==Constants.SelectTwoFoldersOrFiles){
    this.add(foldersOrFiles,BorderLayout.NORTH);
    }

    JButton remove =new JButton("Remove Method");
    JButton add = new JButton("Add Method");
    JButton save = new JButton("Save list");
    JButton load = new JButton("Load list");

    leftpanel.add(new JScrollPane(list));
    Box listOptions = Box.createVerticalBox();
    listOptions.add(add);
    listOptions.add(remove);
    listOptions.add(save);
    listOptions.add(load);

    rightpanel.add(listOptions);

    Box mainBox = Box.createHorizontalBox();

    mainBox.add(leftpanel);
    mainBox.add(rightpanel);
    //mainBox.add(leftleft);

    this.add(mainBox, BorderLayout.CENTER);

    //start jobs
    JButton start = new JButton("Launch experiment");
    this.add(start,BorderLayout.PAGE_END);

    start.addActionListener(launch);
    add.addActionListener(adding);
    remove.addActionListener(delete);
}

public static ActionListener launch = new ActionListener(){
      public void actionPerformed(ActionEvent event){
          //check the files
          if((file1==null)||(file2==null)){
              JOptionPane.showMessageDialog(null,
                        "A graph file is missing",
                        "Wrong files",
                        JOptionPane.ERROR_MESSAGE);
          }

            //checks the list
      }
};

public static ActionListener delete = new ActionListener() {
      public void actionPerformed(ActionEvent event) {
        ListSelectionModel selmodel = list.getSelectionModel();
        int index = selmodel.getMinSelectionIndex();
        if (index >= 0)
          model.remove(index);
      }
 };

public static ActionListener adding = new ActionListener(){
      public void actionPerformed(ActionEvent event){

          JComboBox combo = new JComboBox();
          final JPanel cards = new JPanel(new CardLayout());

          JPanel form = new JPanel();
          JPanel methode1 = new JPanel();
          methode1.add(new JLabel("meth1"));
          methode1.setBackground(Color.BLUE);
          methode1.setName("meth1");
          JPanel methode2 = new JPanel();
          methode2.add(new JLabel("meth2"));
          methode2.setBackground(Color.GREEN);
          methode1.setName("meth2");
          combo.addItem("meth1");

          combo.addItem("meth2");
          cards.add(methode1,"meth1");
          cards.add(methode2,"meth2");

          JPanel control = new JPanel();
          combo.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    JComboBox jcb = (JComboBox) e.getSource();

                    CardLayout cl = (CardLayout) cards.getLayout();
                    cl.show(cards, jcb.getSelectedItem().toString());
                }
            });
            control.add(combo);

            form.add(cards, BorderLayout.CENTER);
            form.add(control, BorderLayout.SOUTH);

            JOptionPane.showMessageDialog(null,form,"Select a method",JOptionPane.PLAIN_MESSAGE);               
      }
};
}

Проблема в том, что если я создам несколько экземпляров этой панели, они не будут отображаться так, как задумано.

Я попытался создать 2 простых JFrames в моем основном с новой ExperimentPanel для каждого, так что проблема не от вызывающей стороны.

Это хорошо работает с одним JFrame, вызывающим один ExperiementPanel.

Вот дисплей для одного и двух звонков:

https://imgur.com/a/4DHJn

И как я их называю:

    JFrame test = new JFrame();
    test.add(new ExperimentPanel(3));
    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
    test.setLocation(dim.width/3 - test.getWidth()/3, dim.height/3 - test.getHeight()/3);
    test.setSize(550,300);
    test.setVisible(true);

    JFrame test2 = new JFrame();
    test2.add(new ExperimentPanel(3));
    test2.setLocation(dim.width/3 - test.getWidth()/3, dim.height/3 - test.getHeight()/3);
    test2.setSize(550,300);
    test2.setVisible(true);

1 ответ

Решение

Вы создаете класс Panel ExperimentPanel который сам состоит из нескольких компонентов, которые хранятся в полях класса ExperimentPanel,

Поскольку вы объявляете эти поля класса как статические, существует только один их экземпляр. Когда вы создаете несколько экземпляров ExperimentPanel объекты, все они хотят разделить эти поля, что приводит к эффектам, которые вы видели.

Поэтому удалите статический модификатор из этих полей:

public class ExperimentPanel extends JPanel{
    private File file1,file2=null;
    private DefaultListModel model = new DefaultListModel();
    private JList list = new JList(model);
    private JPanel mainpanel = new JPanel();
    private JPanel leftpanel = new JPanel();
    ...
Другие вопросы по тегам