JList未在单独的窗格中更新(Swing、Java)

JList未在单独的窗格中更新(Swing、Java),java,swing,jlist,Java,Swing,Jlist,在我的第一个名为Password Vault的选项卡上,我有一个JList,其中列出了存储密码的“网站”。在第二个选项卡上,我有一个添加“密码”功能。当我添加密码时,JList仅在窗格中更新。当我切换回另一个选项卡“密码保险库”时,它尚未更新。当我重新启动程序时,它已被更新。我使用一个字段,所以它不是局部变量的问题 public final class PasswordManagerView1 extends JFrame implements PasswordManagerView,

在我的第一个名为Password Vault的选项卡上,我有一个JList,其中列出了存储密码的“网站”。在第二个选项卡上,我有一个添加“密码”功能。当我添加密码时,JList仅在窗格中更新。当我切换回另一个选项卡“密码保险库”时,它尚未更新。当我重新启动程序时,它已被更新。我使用一个字段,所以它不是局部变量的问题

public final class PasswordManagerView1 extends JFrame
    implements PasswordManagerView, ListSelectionListener {
/**
 * JList.
 */
private JList<String> list;

/**
 * JButtons.
 */
private JButton enter, unlock, reset, buttonAddEnter;

/**
 * Controller.
 */
private PasswordManagerController controller;

/**
 * Dimensions.
 */
private Dimension maxSize;

/**
 * JTabbedPanes.
 */
private JTabbedPane tabbedPane;

/**
 * JTextField.
 */
private JTextField passwordDisplay, textField;

/**
 * PasswordField.
 */
private JPasswordField passwordField, resetField, passwordFieldadd;

/**
 * Useful Constants.
 */
private static final int MAX_SIZE_HORI = 800, MAX_SIZE_VERTI = 400,
        EMPTY_BORDER_SIZE = 5;

/**
 * Constructor.
 */
public PasswordManagerView1() {
    super("Password Manager");
    JTabbedPane tabbedPane = new JTabbedPane();
    //Initial JPanel creation
    tabbedPane.setBorder(
            new EmptyBorder(PasswordManagerView1.EMPTY_BORDER_SIZE,
                    PasswordManagerView1.EMPTY_BORDER_SIZE,
                    PasswordManagerView1.EMPTY_BORDER_SIZE,
                    PasswordManagerView1.EMPTY_BORDER_SIZE));
    this.maxSize = new Dimension(PasswordManagerView1.MAX_SIZE_HORI,
            PasswordManagerView1.MAX_SIZE_VERTI);
    tabbedPane.setPreferredSize(this.maxSize);
    this.getContentPane().add(tabbedPane);

    //Initial JTabbedPane creation

    //Tab creation
    JComponent panel1 = this.makePasswordVault();
    ImageIcon icon = new ImageIcon("lock-icon.png");
    tabbedPane.addTab("Password Vault", icon, panel1,
            "View the passwords in the vault");
    JComponent panel3 = this.makeAddPanel("Add Password");
    tabbedPane.addTab("Add Password", icon, panel3,
            "Add passwords to the vault");
    //JComponent panel2 = this.makeAddPanel("ALSO ADDS");
    //tabbedPane.addTab("Delete Password", icon, panel2,
    //        "Deletes a password from the vault");

    JComponent panel4 = this.makeInfoPanel();
    tabbedPane.addTab("Info", icon, panel4,
            "View settings and program info");
    //Pack up
    this.setResizable(false);
    this.pack();
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);
}

@Override
public JComponent makeAddPanel(String text) {
    JPanel panel = new JPanel();
    panel.setLayout(null);
    //Creation of string array of with stores
    String[] listContentC = this.getStore();

    this.list = new JList<>(listContentC);
    this.list.setBounds(0, 0, 233, 360);
    JScrollPane pane = new JScrollPane(this.list);
    pane.setBounds(0, 0, 233, 360);
    panel.add(pane);
    JLabel labelAdd = new JLabel("Add Password");
    labelAdd.setHorizontalAlignment(SwingConstants.CENTER);
    labelAdd.setFont(new Font("Times New Roman", Font.PLAIN, 24));
    labelAdd.setBounds(427, 38, 163, 31);
    panel.add(labelAdd);

    this.passwordFieldadd = new JPasswordField();
    this.passwordFieldadd.setBounds(536, 100, 116, 22);
    panel.add(this.passwordFieldadd);

    this.textField = new JTextField();
    this.textField.setBounds(375, 100, 116, 22);
    panel.add(this.textField);

    JLabel lblWebsite = new JLabel("Website");
    lblWebsite.setHorizontalAlignment(SwingConstants.CENTER);
    lblWebsite.setFont(new Font("Times New Roman", Font.PLAIN, 13));
    lblWebsite.setBounds(401, 126, 56, 16);
    panel.add(lblWebsite);

    JLabel lblPassword = new JLabel("Password");
    lblPassword.setHorizontalAlignment(SwingConstants.CENTER);
    lblPassword.setFont(new Font("Times New Roman", Font.PLAIN, 13));
    lblPassword.setBounds(566, 126, 56, 16);
    panel.add(lblPassword);

    this.buttonAddEnter = new JButton("Enter");
    this.buttonAddEnter.setBounds(465, 161, 97, 25);
    panel.add(this.buttonAddEnter);
    this.buttonAddEnter.addActionListener(this);
    return panel;
}

@Override
public JComponent makeInfoPanel() {
    JPanel panel = new JPanel();
    panel.setLayout(new GridLayout(1, 1));
    StringBuilder toPrint = new StringBuilder();
    SimpleReader in = new SimpleReader1L("data/Notice.txt");
    while (!in.atEOS()) {
        toPrint.append(in.nextLine() + "\n");
    }
    String toPrintString = toPrint.toString();
    JTextArea noticeText = new JTextArea(toPrintString);
    noticeText.setEditable(false);
    JScrollPane noticeTextScroll = new JScrollPane(noticeText);
    panel.add(noticeTextScroll);
    in.close();
    return panel;

}

@Override
public JComponent makePasswordVault() {
    JPanel panel = new JPanel();
    panel.setLayout(null);
    /*
     * Ask for help on this.
     *
     * I would have liked to create the listContentC by passing nothing into
     * the controller and then the controller using the model to extract the
     * data from a text file. However, my array was always initialized to
     * something null and caused a runtime error.
     *
     *
     */

    //Creation of string array of with stores
    String[] listContentC = this.getStore();

    //GUI setup of list
    this.list = new JList<>(listContentC);
    this.list.setLayoutOrientation(JList.VERTICAL);
    this.list.addListSelectionListener(this);
    JScrollPane pane = new JScrollPane(this.list);
    pane.setBounds(0, 0, 233, 360);
    panel.add(pane);

    //The label creation (for instructions)
    JLabel labelA = new JLabel("the store and press enter!");
    labelA.setFont(new Font("Times New Roman", Font.PLAIN, 13));
    labelA.setBounds(294, 70, 157, 31);
    panel.add(labelA);
    JLabel labelB = new JLabel("To view a password, click on");
    labelB.setFont(new Font("Times New Roman", Font.PLAIN, 13));
    labelB.setBounds(284, 54, 163, 31);
    panel.add(labelB);

    //Enter button creation
    this.enter = new JButton("Enter");
    this.enter.setBounds(303, 128, 116, 25);
    panel.add(this.enter);
    this.enter.setEnabled(false);
    this.enter.addActionListener(this);

    //Password Display field creation
    this.passwordDisplay = new JTextField();
    this.passwordDisplay.setBackground(Color.WHITE);
    this.passwordDisplay.setEditable(false);
    this.passwordDisplay
            .setFont(new Font("Times New Roman", Font.PLAIN, 13));
    this.passwordDisplay.setHorizontalAlignment(SwingConstants.CENTER);
    this.passwordDisplay.setText("");
    this.passwordDisplay.setBounds(303, 247, 116, 22);
    panel.add(this.passwordDisplay);
    this.passwordDisplay.setColumns(10);

    //Password Label creation
    JLabel passwordLabel = new JLabel("Password:");
    passwordLabel.setHorizontalAlignment(SwingConstants.CENTER);
    passwordLabel.setFont(new Font("Times New Roman", Font.PLAIN, 13));
    passwordLabel.setBounds(336, 218, 56, 16);
    panel.add(passwordLabel);

    //Master password notice
    JLabel mastPass = new JLabel("Enter master password to unlock vault:");
    mastPass.setFont(new Font("Times New Roman", Font.PLAIN, 13));
    mastPass.setBounds(532, 54, 218, 31);
    panel.add(mastPass);

    //Password Field
    this.passwordField = new JPasswordField();
    this.passwordField.setBounds(532, 128, 116, 24);
    panel.add(this.passwordField);

    //Unlock button
    this.unlock = new JButton("Unlock");
    this.unlock.setFont(new Font("Times New Roman", Font.PLAIN, 13));
    this.unlock.setBounds(660, 127, 97, 25);
    panel.add(this.unlock);
    this.unlock.addActionListener(this);

    //New setup label
    JLabel labelC = new JLabel("Reset/Set up new master pass:");
    labelC.setHorizontalAlignment(SwingConstants.CENTER);
    labelC.setFont(new Font("Times New Roman", Font.PLAIN, 13));
    labelC.setBounds(532, 217, 218, 16);
    panel.add(labelC);

    //New setup label
    JLabel defaultLabel = new JLabel("Default Password = \"password\"");
    defaultLabel.setHorizontalAlignment(SwingConstants.CENTER);
    defaultLabel.setFont(new Font("Times New Roman", Font.PLAIN, 13));
    defaultLabel.setBounds(560, 77, 171, 16);
    panel.add(defaultLabel);

    this.resetField = new JPasswordField();
    this.resetField.setBounds(532, 246, 116, 24);
    panel.add(this.resetField);

    this.reset = new JButton("Update");
    this.reset.setFont(new Font("Times New Roman", Font.PLAIN, 13));
    this.reset.setBounds(660, 245, 97, 25);
    this.reset.setEnabled(false);
    panel.add(this.reset);
    this.reset.addActionListener(this);
    return panel;
}

@Override
public String[] getStore() {

    int storeCount = 0;
    SimpleReader in = new SimpleReader1L("data/store.txt");
    while (!in.atEOS()) {
        storeCount++;
        in.nextLine();
    }
    in.close();
    String[] listContentC = new String[storeCount];
    SimpleReader in2 = new SimpleReader1L("data/store.txt");
    for (int i = 0; i < storeCount; i++) {
        listContentC[i] = in2.nextLine();
    }
    in2.close();
    return listContentC;
}

@Override
public void registerObserver(PasswordManagerController controller) {
    this.controller = controller;
}

@Override
public void updateEnterButtonVaultTab(boolean result) {
    this.enter.setEnabled(result);
}

@Override
public void actionPerformed(ActionEvent event) {
    //Wait cursor
    this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));

    //What button was pressed
    Object source = event.getSource();
    if (source == this.enter) {
        int index = this.list.getSelectedIndex();
        System.out.println(index);
        if (this.list.getSelectedIndex() != -1) {
            this.controller.processEnterEvent(this.list.getSelectedValue());
        }
    } else if (source == this.unlock) {
        this.controller
                .processUnlockEvent(this.passwordField.getPassword());
    } else if (source == this.reset) {
        this.controller.processResetEvent(this.resetField.getPassword());
    } else if (source == this.buttonAddEnter) {
        this.controller.processAddEvent(this.textField.getText(),
                this.passwordFieldadd.getPassword());
        //needs done in model
        this.updateListModel();
    }
    this.setCursor(Cursor.getDefaultCursor());
}

@Override
public void updateListModel() {
    //MOVE TO THE MODEL
    String[] temp = this.getStore();
    DefaultListModel<String> temp2 = new DefaultListModel<>();
    for (int i = 0; i < temp.length; i++) {
        temp2.addElement(temp[i]);
    }
    this.list.setModel(temp2);
}

@Override
public JTabbedPane getTabbedPane() {
    return this.tabbedPane;
}

@Override
public void setTabbedPane(JTabbedPane tabbedPane) {
    this.tabbedPane = tabbedPane;
}

@Override
public void updatePasswordField() {
    this.passwordField.setText("");
}

@Override
public void updateResetPasswordDisplay() {
    this.resetField.setText("");
}

@Override
public void displayWrongPass() {
    JOptionPane.showMessageDialog(this, "Wrong password entered!");

}

@Override
public void displayUpdatedPass() {
    JOptionPane.showMessageDialog(this, "Master password updated!");
}

@Override
public void updateResetButton(boolean result) {
    this.reset.setEnabled(result);
}

@Override
public void updatePasswordDisplay(char[] password) {
    StringBuilder passwordCreation = new StringBuilder();
    for (int i = 0; i < password.length; i++) {
        passwordCreation.append(password[i]);
    }
    this.passwordDisplay.setText(passwordCreation.toString());

}

@Override
public JComponent makeTextPanel(String text) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void valueChanged(ListSelectionEvent arg0) {

}

}
公共最终类PasswordManagerView1扩展了JFrame
实现PasswordManagerView、ListSelectionListener{
/**
*JList。
*/
私人名单;
/**
*纽扣。
*/
专用按钮输入、解锁、重置、按钮提示;
/**
*控制器。
*/
专用密码管理器控制器;
/**
*尺寸。
*/
私有维度maxSize;
/**
*JTabbedPanes。
*/
私有JTabbedPane选项卡窗格;
/**
*JTextField。
*/
私有JTextField密码显示,textField;
/**
*密码字段。
*/
私有JPPasswordField passwordField、resetField、passwordFieldadd;
/**
*有用的常数。
*/
专用静态最终整数最大尺寸水平=800,最大尺寸垂直=400,
空_边框_大小=5;
/**
*构造器。
*/
公共密码管理器视图1(){
超级(“密码管理器”);
JTabbedPane tabbedPane=新的JTabbedPane();
//初始JPanel创建
tabbedPane.setOrder(
新的EmptyByOrder(PasswordManagerView1.EMPTY\u BORDER\u大小,
PasswordManagerView1.EMPTY_BORDER_SIZE,
PasswordManagerView1.EMPTY_BORDER_SIZE,
PasswordManagerView1.空(边框大小);
this.maxSize=新维度(PasswordManagerView1.MAX\u SIZE\u HORI,
密码管理器视图1.MAX_SIZE_VERTI);
tabbedPane.setPreferredSize(this.maxSize);
this.getContentPane().add(tabbedPane);
//初始JTabbedPane创建
//制表符创建
JComponent panel1=this.makePasswordVault();
ImageIcon=newImageIcon(“lock icon.png”);
tabbedPane.addTab(“密码保险库”,图标,panel1,
“查看vault中的密码”);
JComponent panel3=this.makeAddPanel(“添加密码”);
tabbedPane.addTab(“添加密码”),图标,panel3,
“将密码添加到vault”);
//jComponentPanel2=this.makeAddPanel(“还添加”);
//tabbedPane.addTab(“删除密码”),图标,panel2,
//“从vault中删除密码”);
JComponent panel4=this.makeInfoPanel();
tabbedPane.addTab(“信息”,图标,panel4,
“查看设置和程序信息”);
//收拾
此参数为.setresizeable(false);
这个包();
此.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
此.setVisible(true);
}
@凌驾
公共JComponent makeAddPanel(字符串文本){
JPanel面板=新的JPanel();
panel.setLayout(空);
//使用存储创建字符串数组
字符串[]listContentC=this.getStore();
this.list=新的JList(listContentC);
这个.list.setBounds(0,0233360);
JScrollPane=新的JScrollPane(this.list);
窗格.立根(0,0,233,360);
面板。添加(面板);
JLabel labelAdd=新的JLabel(“添加密码”);
labelAdd.设置水平对齐(SwingConstants.中心);
labelAdd.setFont(新字体(“Times new Roman”,Font.PLAIN,24));
后缘标签(427,38,163,31);
面板。添加(标签添加);
this.passwordFieldadd=新的JPasswordField();
this.passwordFieldadd.setBounds(5361001116,22);
panel.add(this.passwordFieldadd);
this.textField=新的JTextField();
this.textField.setBounds(375、100、116、22);
panel.add(this.textField);
JLabel lblWebsite=新的JLabel(“网站”);
lblWebsite.setHorizontalAlignment(SwingConstants.CENTER);
setFont(新字体(“Times new Roman”,Font.PLAIN,13));
立根(401126 56 16);
面板。添加(lblWebsite);
JLabel lblPassword=新的JLabel(“密码”);
lblPassword.setHorizontalAlignment(SwingConstants.CENTER);
lblPassword.setFont(新字体(“Times new Roman”,Font.PLAIN,13));
lblPassword.setBounds(566126,56,16);
panel.add(lblPassword);
this.buttonedenter=新的JButton(“输入”);
这个.纽扣齿.立根(465161,97,25);
panel.add(此按钮显示器);
this.ButtonAddresser.addActionListener(this);
返回面板;
}
@凌驾
公共JComponent makeInfoPanel(){
JPanel面板=新的JPanel();
panel.setLayout(新网格布局(1,1));
StringBuilder toPrint=新的StringBuilder();
SimpleReaderIn=newSimpleReader1L(“data/Notice.txt”);
而(!in.atEOS()){
toPrint.append(in.nextLine()+“\n”);
}
字符串toPrintString=toPrint.toString();
JTextArea noticeText=新的JTextArea(toPrintString);
noticeText.setEditable(false);
JScrollPane noticeText scroll=新的JScrollPane(noticeText);
panel.add(noticeTextScroll);
in.close();
返回面板;
}
@凌驾
公共JComponent makePasswordVault(){
JPanel面板=新的JPanel();
panel.setLayout(空);
/*
*在这方面寻求帮助。
*
*我希望通过不向任何对象传递任何内容来创建listContentC
*控制器,然后控制器使用模型来提取
*来自文本文件的数据。但是,我的数组始终初始化为
*某个值为null并导致运行时错误。
*
*
*/
//使用存储创建字符串数组
字符串[]listContentC=this.getStore();
//列表的GUI设置
this.list=新的JList(listContentC);
this.list.setLayoutOrientation(JList.VERTICAL);
this.list.addListSelectionListener(this);
JScrollPane=新的JScrollPane(this.list);
窗格.立根(0,0,233,360);
面板。添加(面板);
//标签创建(用于说明)
JLabel labelA=新JLabel(“存储并按enter!”);
labelA.setFont(新字体(“Times new Roman”,Font.PLAIN,13));
后缘标签(294,70,157,31);
面板。添加(标签);
JLabel labelB=新JLabel(“要查看密码,请单击”);
labelB.setFo
   this.list = new JList<>(listContentC);
   this.list = new JList<>(listContentC);
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;

@SuppressWarnings("serial")
public class PanelsWithSharedList extends JPanel {
    private static final int PREF_W = 400;
    private static final int PREF_H = 250;
    private JTabbedPane tabbedPane = new JTabbedPane();
    private DefaultListModel<String> listModel = new DefaultListModel<>();

    public PanelsWithSharedList() {
        for (int i = 0; i < 10; i++) {
            listModel.addElement("List element " + (i + 1));
        }

        setLayout(new BorderLayout());
        add(tabbedPane);
        tabbedPane.add("Panel 1", new ListShowingPanel1(listModel));
        tabbedPane.add("Panel 2", new ListShowingPanel2(listModel));
        tabbedPane.add("Panel 3", new ListShowingPanel3(listModel));
    }

    @Override
    public Dimension getPreferredSize() {
        Dimension superSz = super.getPreferredSize();
        if (isPreferredSizeSet()) {
            return superSz;
        }
        int prefW = Math.max(superSz.width, PREF_W);
        int prefH = Math.max(superSz.height, PREF_H);
        return new Dimension(prefW, prefH);
    }

    private static void createAndShowGui() {
        PanelsWithSharedList mainPanel = new PanelsWithSharedList();

        JFrame frame = new JFrame("Panels With Shared List");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

@SuppressWarnings("serial")
abstract class AbstractListShowingPanel extends JPanel {
    private JList<String> list;

    public AbstractListShowingPanel(DefaultListModel<String> listModel) {
        list = new JList<>(listModel);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    }

    public JList<String> getList() {
        return list;
    }

    public DefaultListModel<String> getModel() {
        return (DefaultListModel<String>) list.getModel();
    }
}

@SuppressWarnings("serial")
class ListShowingPanel1 extends AbstractListShowingPanel {
    private JTextField textField = new JTextField(10);

    public ListShowingPanel1(DefaultListModel<String> listModel) {
        super(listModel);
        add(new JScrollPane(getList()));
        add(new JLabel("Text to add:"));

        Action action = new AddTextAction();
        textField.setAction(action);
        add(textField);
        add(new JButton(action));

    }

    private class AddTextAction extends AbstractAction {
        public AddTextAction() {
            super("Add Text");
            putValue(MNEMONIC_KEY, KeyEvent.VK_A);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            getModel().addElement(textField.getText());
            textField.selectAll();
        }
    }

}

@SuppressWarnings("serial")
class ListShowingPanel2 extends AbstractListShowingPanel {
    public ListShowingPanel2(DefaultListModel<String> listModel) {
        super(listModel);
        add(new JScrollPane(getList()));
        add(new JButton(new DeleteItemAction()));
    }

    private class DeleteItemAction extends AbstractAction {
        public DeleteItemAction() {
            super("Delete Selected Item");
            putValue(MNEMONIC_KEY, KeyEvent.VK_D);
        }

        public void actionPerformed(ActionEvent e) {
            JList<String> list = getList();
            String selection = list.getSelectedValue();
            if (selection != null) {
                getModel().removeElement(selection);
            }
        }
    }
}

@SuppressWarnings("serial")
class ListShowingPanel3 extends AbstractListShowingPanel {
    public ListShowingPanel3(DefaultListModel<String> listModel) {
        super(listModel);
        setLayout(new BorderLayout());
        add(new JScrollPane(getList()));
    }
}