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