如何将另一个JComponent镜像?

时间:2016-09-26 00:16:54

标签: java swing

我已经知道JComponent不能添加到两个不同的容器中,但我需要一些方法来模仿它。我有一个具有重写绘制方法的JLabel,我希望这个标签一次出现在两个JFrame中。由于我不能将它添加到两者中,如何在重新绘制一个JLabel并且看起来不同时将其设置为其他JFrame镜像它?

2 个答案:

答案 0 :(得分:2)

如果这是我的问题,我会创建一个用于创建JComponent的类(我自己更喜欢使用JPanel),并且我将为此程序使用MVC或“Model-View-Controller”类型的程序结构。该模型将保持程序逻辑的状态,包括所显示的图形对象的逻辑表示,而视图将是扩展JPanel的类,并且以任何方式显示所保存的数据。该模型。然后,我会创建其中两个生物并让它们共享相同的模型 - 这是关键。然后当一个发生变化时,可以看到它们。

如果您需要更多详细信息以及更好的代码说明,请考虑创建并发布有效的minimal example program

答案 1 :(得分:2)

您应该使用模型视图模式:

https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel

您的模型将是一个包含单个字符串的类。您的视图,即JLabel需要在模型更改时得到通知。您可以使用观察者模式来执行此操作:

https://en.wikipedia.org/wiki/Observer_pattern

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

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;
    }
}

通过这种方式,您可以根据需要在多个视图/ JLabel中显示模型。例如:

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());
       }
   });