gpt4 book ai didi

Java - 在处理继承和接口(interface)时调用 Swing 中的方法

转载 作者:搜寻专家 更新时间:2023-11-01 02:45:33 26 4
gpt4 key购买 nike

我的问题很难用语言表达,但这里是基本轮廓:

我有一个界面:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com