Java 在所有帧中更新自定义JLabel

Java 在所有帧中更新自定义JLabel,java,swing,jlabel,Java,Swing,Jlabel,我有一个自定义JLabel的实例,我想在所有帧中更改其文本,但文本仅在最后打开的帧中更改。我有办法做到这一点吗 下面是发生的情况: 我的代码是: App.java package test; import javax.swing.JFrame; public class App extends JFrame { protected static App app; private String loggedUser; private MyCustomLabel m

我有一个自定义JLabel的实例,我想在所有帧中更改其文本,但文本仅在最后打开的帧中更改。我有办法做到这一点吗

下面是发生的情况:

我的代码是:

App.java

package test;

import javax.swing.JFrame;

public class App extends JFrame {

    protected static App app;

    private String loggedUser;
    private MyCustomLabel myCustomLabel;

    public App() {
        loggedUser = "User One";
        myCustomLabel = new MyCustomLabel(loggedUser);
    }

    public static App getApp() {
        return app;
    }

    public MyCustomLabel getMyCustomLabel() {
        return myCustomLabel;
    }

    public String getLoggedUser() {
        return loggedUser;
    }

    public void setLoggedUser(String loggedUser) {
        this.loggedUser = loggedUser;
    }

}
public class App extends JFrame {

    public App() {
        User user = new User(1, "User One");
        LoggedUser.getInstance().setUser(user);

        initComponents();
    }

    public static void main(String[] args) {
        new App().setVisible(true);
    }

    private void initComponents() {
        setSize(200, 200);
        setLocation(400, 200);
        setLayout(new FlowLayout());
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JButton btn1 = new JButton("dlgOne");
        btn1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                DlgOne dlgOne = new DlgOne(App.this, false);
                dlgOne.setVisible(true);
            }
        });

        JButton btn2 = new JButton("dlgTwo");
        btn2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                DlgTwo dlgTwo = new DlgTwo(App.this, false);
                dlgTwo.setVisible(true);
            }
        });

        JButton btn3 = new JButton("change user");
        btn3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (LoggedUser.getInstance().getUser().getId() == 1) {
                    User user = new User(2, "User Two");
                    LoggedUser.getInstance().setUser(user);
                } else {
                    User user = new User(1, "User One");
                    LoggedUser.getInstance().setUser(user);
                }
            }
        });

        add(btn1);
        add(btn2);
        add(btn3);
    }
}
FrmApp.java

package test;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

/**
 *
 * @author Marco
 */
public class FrmApp extends App {

    public FrmApp() {
        app = new App();
        initComponents();
    }

    private void initComponents() {
        setLayout(new FlowLayout());
        setSize(300, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        btnFrmOne = new JButton("Open frmOne");
        btnFrmOne.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                FrmOne frmOne = new FrmOne();
                frmOne.setVisible(true);
            }
        });
        add(btnFrmOne);

        btnFrmTwo = new JButton("Open frmTwo");
        btnFrmTwo.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                FrmTwo frmTwo = new FrmTwo();
                frmTwo.setVisible(true);
            }
        });
        add(btnFrmTwo);

        btnChangeUser = new JButton("Change user");
        btnChangeUser.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (App.getApp().getLoggedUser().equals("User One")) {
                    App.getApp().setLoggedUser("User Two");
                } else {
                    App.getApp().setLoggedUser("User One");
                }

                App.getApp().getMyCustomLabel().refresh();
            }
        });
        add(btnChangeUser);
    }

    private JButton btnFrmOne;
    private JButton btnFrmTwo;
    private JButton btnChangeUser;

    public static void main(String args[]) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(FrmApp.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            Logger.getLogger(FrmApp.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(FrmApp.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedLookAndFeelException ex) {
            Logger.getLogger(FrmApp.class.getName()).log(Level.SEVERE, null, ex);
        }

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new FrmApp().setVisible(true);
            }
        });
    }

}
FrmOne.java

package test;

import java.awt.FlowLayout;
import javax.swing.JFrame;

public class FrmOne extends JFrame {

    public FrmOne() {
        initComponents();
    }

    private void initComponents() {
        setLayout(new FlowLayout());
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setSize(150, 100);

        add(App.getApp().getMyCustomLabel());
    }

}
FrmTwo.java

package test;

import java.awt.FlowLayout;
import javax.swing.JFrame;

public class FrmTwo extends JFrame {

    public FrmTwo() {
        initComponents();
    }

    private void initComponents() {
        setLayout(new FlowLayout());
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setSize(150, 100);

        add(App.getApp().getMyCustomLabel());
    }

}
MyCustomLabel.java

package test;

import javax.swing.JLabel;

public class MyCustomLabel extends JLabel {

    public MyCustomLabel(String loggedUser) {
        initComponents(loggedUser);
    }

    private void initComponents(String loggedUser) {
        setText(loggedUser);
    }

    public void refresh() {
        setText(App.getApp().getLoggedUser());
    }

}
更新

这就是我现在所做的去做我想做的

App.java

package test;

import javax.swing.JFrame;

public class App extends JFrame {

    protected static App app;

    private String loggedUser;
    private MyCustomLabel myCustomLabel;

    public App() {
        loggedUser = "User One";
        myCustomLabel = new MyCustomLabel(loggedUser);
    }

    public static App getApp() {
        return app;
    }

    public MyCustomLabel getMyCustomLabel() {
        return myCustomLabel;
    }

    public String getLoggedUser() {
        return loggedUser;
    }

    public void setLoggedUser(String loggedUser) {
        this.loggedUser = loggedUser;
    }

}
public class App extends JFrame {

    public App() {
        User user = new User(1, "User One");
        LoggedUser.getInstance().setUser(user);

        initComponents();
    }

    public static void main(String[] args) {
        new App().setVisible(true);
    }

    private void initComponents() {
        setSize(200, 200);
        setLocation(400, 200);
        setLayout(new FlowLayout());
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JButton btn1 = new JButton("dlgOne");
        btn1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                DlgOne dlgOne = new DlgOne(App.this, false);
                dlgOne.setVisible(true);
            }
        });

        JButton btn2 = new JButton("dlgTwo");
        btn2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                DlgTwo dlgTwo = new DlgTwo(App.this, false);
                dlgTwo.setVisible(true);
            }
        });

        JButton btn3 = new JButton("change user");
        btn3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (LoggedUser.getInstance().getUser().getId() == 1) {
                    User user = new User(2, "User Two");
                    LoggedUser.getInstance().setUser(user);
                } else {
                    User user = new User(1, "User One");
                    LoggedUser.getInstance().setUser(user);
                }
            }
        });

        add(btn1);
        add(btn2);
        add(btn3);
    }
}
MyCustomPanel.java

public class MyCustomPanel extends JPanel implements Observer {

    private JLabel label;

    public MyCustomPanel() {
        initComponents();
    }

    @Override
    public void update(Observable o, Object arg) {
        //LoggedUser u = (LoggedUser) o;
        //System.out.println(u.getUser().getId());

        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                label.setText(LoggedUser.getInstance().getUser().getName());
            }

        });
    }

    private void initComponents() {
        LoggedUser.getInstance().addObserver(this);

        label = new JLabel(LoggedUser.getInstance().getUser().getName());
        add(label);
    }

}
User.java

public class User {

    private int id;
    private String name;

    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
DlgOne.java

public class DlgOne extends JDialog {

    public DlgOne(Frame owner, boolean modal) {
        super(owner, modal);
        initComponents();
    }

    private void initComponents() {
        setTitle("dlgOne");
        setSize(200, 200);
        setLocation(600, 200);
        setLayout(new FlowLayout());
        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        add(new MyCustomPanel());
    }

}
DlgTwo.java

public class DlgTwo extends JDialog {

    public DlgTwo(Frame owner, boolean modal) {
        super(owner, modal);
        initComponents();
    }

    private void initComponents() {
        setTitle("dlgTwo");
        setSize(200, 200);
        setLocation(800, 200);
        setLayout(new FlowLayout());
        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        add(new MyCustomPanel());
    }

}
LoggedUser.java

public class LoggedUser extends Observable {

    private static LoggedUser instance;

    public static LoggedUser getInstance() {
        if (instance == null) {
            instance = new LoggedUser();
        }

        return instance;
    }

    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
        setChanged();
        notifyObservers();
    }

}
我有一个自定义JLabel的实例,我想更改所有帧中的文本

Swing组件只能有一个父组件。实际上,您有两个自定义标签的实例。因此,更新一个标签中的文本不会影响另一个标签

您可以做的是创建一个
纯文档
,以包含多个JTextFields共享的文本。然后,当文本更改为文档时,所有文本字段都将更新

因此,在
App
课程中,您将有:

private PlainDocument sharedDocument = new PlainDocument();
您将创建一个方法来访问
文档
。可能类似于
getSharedDocument()

然后在表单类中,您可以执行以下操作:

//add(App.getApp().getMyCustomLabel());
JTextField textField = new JTextField( App.getApp().getSharedDocument() );
//  customize text field to look like a label
textField.setBorder( null );
textField.setEditable( false );
add( textField );

您希望使用observer设计模式进行连接,因此当用户更改时,所有注册的侦听器(这里的两个窗口应该是对话框,而不是JFrames)都会更改。查找M-V-C或模型视图控制器,将其视为以全面方式构造此程序的最佳方式,然后相应地重新构造程序。请参阅@HovercraftFullOfEels我使用了“观察者”,现在我可以做我想要的事情了。顺便说一句,我正在更新代码。@AndrewThompson谢谢!