JList не обновляется при установке нового DefaultListModel

public class MainMenu extends JFrame {
    private JPanel panel,file_list_panel;
    private JPanel contentPane;
    private JMenuBar menuBar;
    private JMenu mnNewMenu1,mnNewMenu2,mnNewMenu3;
    private JMenuItem mt1,mt2,mt3;
    private JPanel right,left ,bottom;
    private JSplitPane spver ,sphor;
    private JTabbedPane tabbedPane;
    private JLabel label;
    private JList<String> list_1;
    private JScrollPane jscroll_list;
    private DefaultListModel listmodel_1 = new DefaultListModel();


    public MainMenu() {




    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    setBounds(0,0,screenSize.width, screenSize.height);
    setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);
    int intValue = Integer.parseInt( "EEEEEE",16);
    Color aColor = new Color( intValue );
    UIManager.put("TabbedPane.background", new Color(230, 216, 174));
    UIManager.put("TabbedPane.selected", Color.WHITE); 
    UIManager.put("TabbedPane.contentAreaColor",aColor ); 
    UIManager.put("TabbedPane.focus", Color.WHITE); 

    setTitle("Main Menu");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //setBounds(100, 100, 848, 680);
    //setLocation(10, 10);
    setLocationRelativeTo(null); // set jFrame alignment to center

    //parent(first) panel 
    contentPane = new JPanel();
    contentPane.setBackground(Color.BLACK);
    contentPane.setBorder(new EmptyBorder(2, 2, 2, 2));
    setContentPane(contentPane);
    contentPane.setLayout(new BorderLayout(0, 0));

    //Main Menu BAR
    menuBar = new JMenuBar();
    menuBar.setFont(new Font("Tekton Pro Ext", Font.PLAIN, 11));
    setJMenuBar(menuBar);

    //Menu 1
    mnNewMenu1 = new JMenu("New menu");
    menuBar.add(mnNewMenu1);
    //Menu 1 MenuItem 1

    mt1 = new JMenuItem("Browse New Project");
    mt1.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
        BrowseScreen frame = new BrowseScreen();
        frame.setVisible(true);
        }


    });


    mnNewMenu1.add(mt1);




    //second panel
    panel = new JPanel();
    contentPane.add(panel, BorderLayout.CENTER);
    panel.setLayout(new BorderLayout(0, 0));

    spver =new  JSplitPane(JSplitPane.VERTICAL_SPLIT);
    spver.setDividerLocation(500);
    spver.setEnabled(false);

    bottom=new JPanel();
    sphor =new  JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
    sphor.setEnabled(false);
    spver.setTopComponent(sphor);
    spver.setBottomComponent(bottom);
    bottom.setLayout(null);
    panel.add(spver);

    sphor.setDividerLocation(180);
    left =new JPanel();
    right =new JPanel();
    sphor.setRightComponent(right);
    right.setLayout(new GridLayout(0, 1, 0, 0));

    tabbedPane = new JTabbedPane(JTabbedPane.TOP);
    tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);

    JPanel tab1 = new JPanel();
    tabbedPane.addTab("fffa", tab1);
    tabbedPane.setMnemonicAt(0, KeyEvent.VK_1);

    JPanel tab2 = new JPanel();
    tabbedPane.addTab("TAB1", tab2);
    tabbedPane.setMnemonicAt(0, KeyEvent.VK_1);



    right.add(tabbedPane);
    sphor.setLeftComponent(left);
    left.setLayout(new BorderLayout(0, 0));

    file_list_panel= new JPanel();
    file_list_panel.setBackground(Color.BLACK);
    file_list_panel.setForeground(Color.WHITE);

    label = new JLabel("Java Files of Project");
    label.setBackground(Color.BLACK);
    label.setForeground(Color.WHITE);
    label.setFont(new Font("Garamond", Font.BOLD, 14));
    file_list_panel.add(label);
    left.add(file_list_panel, BorderLayout.NORTH);


    list_1 = new JList<String>(listmodel_1);



    jscroll_list = new JScrollPane(list_1);
    left.add(jscroll_list, BorderLayout.CENTER);


    }
    public  void setList(Vector<String> files){
        listmodel_1.removeAllElements();
        list_1.removeAll();
        for(int i=0;i<files.size();i++)
            listmodel_1. addElement(files.elementAt(i));
        list_1.setModel(listmodel_1);
        this.invalidate();
        this.validate();
        this.repaint();
    }

}

setList вызывается из окна просмотра перед вызовом setVisible(false); т.е. этот метод вызывается, когда окно обзора исчезает. Он выполняет все действия в методе, но не обновляет его в общедоступном меню MainMenu. void setFileList(){ MainMenu mm= new MainMenu(); мм.setList(java_files); }

list_1 -JList listmodel_1 = Модель списка по умолчанию

я пытался обновить кадр, но не обновляется после добавления нового списка в главное окно...

перед обновлением JList я просматриваю файлы в другом окне, затем для него устанавливается значение setVisible (false), затем MainMenu фокусируется и вызывает метод setList, но не меняется


person mouse    schedule 07.08.2013    source источник
comment
например   -  person mKorbel    schedule 07.08.2013


Ответы (2)


По сути, вы создаете новый JList и связываете с ним свою модель, но это не влияет на JList на экране.

public  void setList(Vector<String> files){
    // Good...
    listmodel_1.removeAllElements();
    // Not required, has nothing to do with the items in the list
    //list_1.removeAll();
    // Good
    for(int i=0;i<files.size();i++)
        listmodel_1. addElement(files.elementAt(i));
    // This here is your problem
    //list_1=new JList<String>(listmodel_1);
    // Because I have no idea what model list_1 is actually using...
    list_1.setModel(listmodel_1);
    //list_1.setSelectedIndex(0);
    //this.invalidate();
    //this.validate();
    //this.repaint();
}
person MadProgrammer    schedule 07.08.2013
comment
спасибо за вашу помощь .. Я все еще не получаю никаких изменений в своем основном JFrame, когда пробовал ваш код ... я не знаю, что я здесь делаю неправильно. но когда я добавляю this.setVisible(true), он загружает другое окно с новым списком, но старое окно все еще там, тогда я добавил this.setVisible(false) перед this.setVisible(true), но все еще получаю старое главное окно - person mouse; 07.08.2013
comment
Вам нужно обновить свой вопрос с помощью исполняемого примера, похоже, вы повсюду затеняете свои переменные. - person MadProgrammer; 07.08.2013
comment
спасибо за ваш ответ, я разместил весь код MainMenu JFrame - person mouse; 07.08.2013
comment
setList вызывается из BrowseWindow до того, как он будет setVisible (false), все, что в setList сделано, но не обновляет его ... единственный способ обновить его - вызвать оператор setVisible (true) главного меню, но старое окно делает не уходи - person mouse; 07.08.2013
comment
Откуда BrowserScreen знает, что обновлять, если вы не передали ему ссылку на свой MainMenu. Бьюсь об заклад, вы создаете новый экземпляр в BrowserScreen... - person MadProgrammer; 07.08.2013
comment
Да, ты прав ! я настолько глуп, что не передал ссылку на MainMenu и не использовал ее для вызова setList(), а вместо этого инициировал новый объект MainMenu и вызвал его метод setList()... Большое спасибо за вашу помощь... передавая ссылка сделала свое дело!! :) - person mouse; 07.08.2013

Вы создаете новый JList<String> и копируете ссылку на свою переменную экземпляра, но вы не удаляете старый JList из фрейма и не добавляете новый. Простое изменение переменной этого не сделает.

Вместо создания нового JList<String>, почему бы вам просто не заменить существующую модель? Удалите эту строку:

list_1=new JList<String>(listmodel_1);

и вы можете обнаружить, что это просто работает. (Вы уже устанавливаете модель в следующей строке...)

person Jon Skeet    schedule 07.08.2013
comment
Я сделал это так, как вы говорили мне ранее, после того, как он не сделал того, что предполагалось, я попытался добавить такие вещи, как list_1=new JList‹String›(listmodel_1); - person mouse; 07.08.2013
comment
@mouse: Нет, я специально сказал удалить эту строку. Если все еще есть проблемы, вы должны быть конкретными. Не сделал то, что предполагается, не описывает проблему. - person Jon Skeet; 07.08.2013
comment
я имел в виду, что он не обновляет jlist в главном окне. Главное меню обновляется, если я вызываю его setVisible(true)... но это создаст двойные окна со старыми и новыми главными окнами - person mouse; 07.08.2013
comment
@mouse: я предлагаю вам отредактировать свой вопрос с помощью короткой, но полной программы, демонстрирующей проблему. - person Jon Skeet; 07.08.2013
comment
Спасибо за вашу помощь. мне удалось получить ответ. проблема заключалась в том, что я не передал ссылку на объект главного окна, а создал новый объект и вызвал его метод setList. Еще раз спасибо :) - person mouse; 07.08.2013