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

标签 java swing

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

我有一个界面:

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/

相关文章:

java - 如何在按 Enter 键时阻止 JDialog 关闭?

java - 在 Java 中为 TrayIcon 更改 PopupMenu 的 LAF

java - 根据值对树形图进行排序,然后将其作为树形图返回。

java - 在读取和写入文件时避免丢失换行符 (\n)

java - 转换为 HTML 时导入外部 CSS 文件

java 如何填充多个 JTextFields 从 .txt 文件读取数据

java - 使用 BufferStrategy 在 Java 中滑动图像

java - 显示所有抛出异常的函数

java - 遍历 zip 文件 java 中的所有目录

窗口中的 Java JFrame 矩形