[英]Java - Calling methods in Swing whilst dealing with Inheritance and Interfaces
我的问题很难说,但这里是基本的大纲:
我有一个界面:
public interface TheInterface {
/**
*
* Returns a string
*/
public String getStuff();
}
我有一个实现此接口的抽象类:
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);
}
}
在该框架内是一个包含标签的面板:
import java.awt.GridLayout; import java.awt.Label;
import javax.swing.JLabel; import 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()并将其显示在该标签内。 但是目前我无法访问它,似乎我的设计存在缺陷。 我很感激,如果有人可以帮助重新排列或更改它,以便能够以最有效的方式在标签中调用该方法,而无需多个相同代码的情况。
谢谢。
您可以使用Observer模式:
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);
}
您的Panel类现在是
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());
每当更改getStuff()的结果时,GenericClass或GUIClass也可以执行以下操作:
for (StuffObserver ob : stuffObservers)
{
ob.onStuffChanged(someStringRepresentingWhatYouWouldChangeGetStuffTo);
}
现在摆脱getStuff()。 无论何时更改getStuff()返回的状态,JLabel现在都会自动更新以显示该数据。
我建议您直接在GUIClass中构建和管理GUI组件,而不是在自定义子类中自动管理它们。
public class GUIClass extends GenericClass {
private JFrame frame;
private JPanel panel;
private JLabel label;
public GUIClass() {
super();
initialisation();
setLabelText(getStuff());
}
private void initialisation() {
// Label
this.label = new JLabel();
this.label.setText(getStuff());
// Panel
this.panel = new JPanel();
this.panel.setLayout(new GridLayout(0, 2));
this.panel.add(this.label);
// Frame
this.frame = new JFrame();
this.frame.add(this.panel);
this.frame.setSize(400, 200);
this.frame.setLocation(200, 200);
this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.frame.setTitle("Test Program");
this.frame.setVisible(true);
}
private void setLabelText(String text) {
this.label.setText(text);
}
}
这是一个设计建议,所以我可能忘记了原始代码中的一些元素,但我认为你可以得到这个想法!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.