我的问题很难用语言表达,但这里是基本轮廓:
我有一个界面:
public interface TheInterface {
/**
*
* Returns a string
*/
public String getStuff();
}
我有一个实现这个接口(interface)的抽象类:
public abstract class GenericClass implements TheInterface {
public GenericClass() {
// TODO Auto-generated constructor stub
}
@Override
public String getStuff() {
return "Random string";
}
}
然后我有一个扩展 GenericClass 的类
public class GUIClass extends GenericClass {
private myFrame myNewFrame;
public GUIClass() {
super();
myNewFrame = new myFrame();
}
}
如您所见,GenericClass 有一个框架:
import javax.swing.JFrame;
public class myFrame extends JFrame {
private myPanel topPanel;
public myFrame() {
topPanel= new myPanel();
add(topPanel);
setSize(400,200);
//setLocation(200,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Test Program");
setVisible(true);
}
}
在该框架内是一个包含标签的面板:
导入java.awt.GridLayout; 导入 java.awt.Label;
导入javax.swing.JLabel; 导入 javax.swing.JPanel;
public class myPanel extends JPanel {
private JLabel myLabel;
public myPanel() {
setLayout(new GridLayout(0,2));
add (new Label("This label should contain the content of getStuff(): "));
myLabel=new JLabel();
add (myLabel);
}
}
我在这里要做的是从 GenericClass 调用 getStuff() 并将其显示在该标签内。但是目前我无法访问它,而且我的设计似乎有缺陷。如果有人可以帮助重新安排或更改它,以便能够以最有效的方式在标签中调用该方法,而无需多次使用相同代码,我将不胜感激。
谢谢。
最佳答案
您可以使用观察者模式:
public interface StuffObserver {
/**
*
* Pass whatever you want, perhaps getStuff(),
* but that method might be removed by the time we're done here
* (depends on what else might need to query/track it without,
* an observer)
*/
private void onStuffChanged(String newStuff);
你的面板类现在是
public class myPanel extends JPanel implements StuffObserver
其中包含
private void onStuffChanged(String newStuff)
{
Runnable changeText = new Runnable() {
public void run() {
myLabel.setText(newStuff);
}
};
SwingUtilities.invokeLater(changeText);
}
确保你有 myLabel 引用你添加到面板的实际标签(你当前的代码可能不是你想要的?)
从这里开始,也许 GenericClass 或者它的子类 GUIClass 可以有一个 StuffObservers 列表(带有添加或删除的方法)
private List<StuffObservers> stuffObservers = new ArrayList<>();
public void addStuffObserver(StuffObserver ob)...
// looks familar? Same way Swing has addActionListener() on some components
public void deleteStuffObserver(StuffObserver ob)...
GUIClass 可以简单地调用如下内容:
myNewFrame = new myFrame();
addStuffObserver(myNewFrame.getPanel());
您的 GenericClass 或 GUIClass 也可以在更改 getStuff() 的结果时执行以下操作:
for (StuffObserver ob : stuffObservers)
{
ob.onStuffChanged(someStringRepresentingWhatYouWouldChangeGetStuffTo);
}
现在摆脱 getStuff() 。每当您更改 getStuff() 将返回的状态时,您的 JLabel 现在将自动更新以显示该数据。
关于Java - 在处理继承和接口(interface)时调用 Swing 中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23018404/