Java 如何使一个JComponent映射另一个?

Java 如何使一个JComponent映射另一个?,java,swing,Java,Swing,我已经知道JComponent不能添加到两个不同的容器中,但我需要一些方法来模拟这一点。我有一个JLabel,它有一个重写的draw方法,我希望这个标签同时出现在两个jframe中。既然我不能将它同时添加到这两个组件中,那么当一个JLabel被重新绘制并且看起来不同时,另一个JFrame镜像它时,我如何才能做到这一点呢?如果这是我的问题,我会创建一个类来创建这个JComponent(我自己更喜欢使用JPanel),并且我会为这个程序使用M-V-C或“模型-视图-控制器”类型的程序结构。模型将保存

我已经知道JComponent不能添加到两个不同的容器中,但我需要一些方法来模拟这一点。我有一个JLabel,它有一个重写的draw方法,我希望这个标签同时出现在两个jframe中。既然我不能将它同时添加到这两个组件中,那么当一个JLabel被重新绘制并且看起来不同时,另一个JFrame镜像它时,我如何才能做到这一点呢?

如果这是我的问题,我会创建一个类来创建这个JComponent(我自己更喜欢使用JPanel),并且我会为这个程序使用M-V-C或“模型-视图-控制器”类型的程序结构。模型将保存程序逻辑的状态,包括显示的图形对象的逻辑表示,而视图将是扩展JPanel的类的状态,并且将以任何需要的方式显示模型中保存的数据。然后我会创建两个这样的生物,让它们共享同一个模型,这是关键。当一个发生变化时,两个都会发生变化


如果您需要更多的细节和更好的代码解释,请考虑创建和发布一个有效的A.< /P>< P>如果这是我的问题,我会创建一个类来创建JComponent(我自己更喜欢使用JPAND),并且我会使用一个MV-V-C或“模型视图控制器”类型的程序结构来进行这个程序。模型将保存程序逻辑的状态,包括显示的图形对象的逻辑表示,而视图将是扩展JPanel的类的状态,并且将以任何需要的方式显示模型中保存的数据。然后我会创建两个这样的生物,让它们共享同一个模型,这是关键。当一个发生变化时,两个都会发生变化


如果您需要进一步的细节和更好的代码解释,请考虑创建并发布一个有效的A.

,您应该使用一个模型视图模式:

您的模型将是一个具有单个字符串的类。当模型发生变化时,需要通知您的视图,即JLabel。您可以使用“观察者”模式执行此操作:

这意味着,您的模型维护一个观察者列表,并且每当您更新模型时,所有观察者都会得到通知。例如:

class Model {
    public interface Observer {
        void onTextChanged();
    }
    private String text;
    final private List<Observer> observerList = new ArrayList<>();

    public void addObserver(Observer observer) {
        observerList.add(observer);
    }

    public void setText(String text) {
        this.text = text;
        for (Observer observer : observerList)
            observer.onTextChanged();
    }

    public String getText() {
        return text;
    }
}
final JLabel label = new JLabel();
model.addObserver(new Model.Observer() {
       public void onTextChanged() {
            label.setText(model.getText());
       }
   });
final JLabel label2 = new JLabel();
model.addObserver(new Model.Observer() {
       public void onTextChanged() {
            label2.setText(model.getText());
       }
   });

应使用模型视图填充图案:

您的模型将是一个具有单个字符串的类。当模型发生变化时,需要通知您的视图,即JLabel。您可以使用“观察者”模式执行此操作:

这意味着,您的模型维护一个观察者列表,并且每当您更新模型时,所有观察者都会得到通知。例如:

class Model {
    public interface Observer {
        void onTextChanged();
    }
    private String text;
    final private List<Observer> observerList = new ArrayList<>();

    public void addObserver(Observer observer) {
        observerList.add(observer);
    }

    public void setText(String text) {
        this.text = text;
        for (Observer observer : observerList)
            observer.onTextChanged();
    }

    public String getText() {
        return text;
    }
}
final JLabel label = new JLabel();
model.addObserver(new Model.Observer() {
       public void onTextChanged() {
            label.setText(model.getText());
       }
   });
final JLabel label2 = new JLabel();
model.addObserver(new Model.Observer() {
       public void onTextChanged() {
            label2.setText(model.getText());
       }
   });

您通常会通过编写一些代码来镜像JComponent。你这样做了吗?也许你可以发布它,让人们看到哪里出了问题并帮助你修复它
我有一个JLabel,它有一个重写的draw方法,
-我不知道这意味着什么,因为JLabel中没有“draw()”方法。也许你应该在BuffereImage上进行自定义绘制。然后可以使用BuffereImage创建图像图标。一个图标可以由多个标签共享。这里引用了另一种使用
repainmanager
的方法。您通常会通过编写一些代码来镜像JComponent。你这样做了吗?也许你可以发布它,让人们看到哪里出了问题并帮助你修复它
我有一个JLabel,它有一个重写的draw方法,
-我不知道这意味着什么,因为JLabel中没有“draw()”方法。也许你应该在BuffereImage上进行自定义绘制。然后可以使用BuffereImage创建图像图标。一个图标可以由多个标签共享。这里引用了另一种使用
repaitmanager
的方法。