4

我有两种类型的编辑器。一个是 的子类,JTextArea一个是JTable(的子类JTextArea并且JTable都是JComponent) 的子类。我想要我的两个类,TextAreaEditorTableEditor实现Editor只有方法的接口public String getText()

我希望客户端代码简单地使用Editor接口。问题是,我所有Editor的使用方法JComponent,比如setEnabled(bool). 由于我的编辑器是一个接口并且我不能让它扩展 JComponent,所以在调用这些方法时我必须使用实现而不是接口。所以我认为我可以简单地创建Editor一个子类JComponent并让我的类扩展它,而不是使用接口。问题是类TextAreaEditor已经扩展了一些类JTextArea,所以我不能让它们扩展另一个类。

有什么方法可以确保我的Editor类是 JComponent,并且我的具体编辑器类是Editors 和子类JComponent

4

6 回答 6

4

如果您在编辑器接口的子类中公开您关心的 JComponent 方法,它们将由您的类“追溯”实现。

下面是一些代码来演示这个想法:

interface Editor { 
  String getText(); 
}

interface SwingEditor extends Editor { 
  void setEnabled(bool); // has to match *exactly* the signature from JComponent
}

class TableEditor extends JTable implements SwingEditor {
   // implement your getText(), and anything else you need 
   // no need to implement setEnabled, as it is provided by JTable
}

SwingEditor te = new TableEditor();
te.setEnabled(true); // will call JComponent's method

我假设您在这里确实需要继承,通常组合是 Swing UI 代码的更好选择。

于 2012-07-23T03:24:02.343 回答
3

在继承痤疮上使用组合。大多数情况下,继承确实不是正确的解决方案,在您的情况下,它将使您免于编写大量代码。

让你TextAreaEditorTableEditor双方都有一个JComponent他们需要的实例。将您需要的所有方法添加到您的接口,然后将这些调用委托给JComponet.

例如:

public class TextAreaEditor implements Editor {
     private final JTextArea textArea = new JTextArea();

     public void setEnabled(bool isEnabled) {
          return textArea.setEnabled(isEnabled);
     }

     //... your own methods plus other methods from JComponent
}

您可能想要更花哨并使用某种依赖注入来实例化JComponent,但这并不是必需的。但是,如果所有更改都是JComponent您需要注入的特定内容,它可以解决必须上课的问题。

如果您需要更多说明,请告诉我。

于 2012-07-23T03:17:41.940 回答
2

如果您真的需要您的Editor课程JComponent也是如此,您可以选择简单地记录这一点并在您的代码中执行强制转换。不是最简洁的解决方案,但迄今为止最简单的解决方案。

另一种方法是向Editor接口添加一个额外的方法:

public JComponent getComponent();

您的Editor实例可以通过简单地返回来实现此方法this

后一种方法的好处是您可以使用所有JComponent方法,并且不必在界面中复制它们,并且在 2 个月内得出您忘记将其中一个JComponent方法添加到界面中的结论

于 2012-07-23T07:51:26.837 回答
1

以下设计可以解决这个问题:

public class TextAreaEditor extends JTextArea implements Editor {
//provide your implementation of getText()
//setEnabled(bool) doesn't have be implemented as JComponent will provide
}

TextAreaEditor te = new TextAreaEditor();
te.setEnabled(true); // will call JComponent's impl

根据上面的代码,您自己的编辑器(TextAreaEditor)的具体实现是一个编辑器和 JComponent 的子类。

于 2012-07-23T04:09:01.330 回答
0

我可能会创建一个新的 table 和 textarea 类来扩展它们各自的超类,并像这样实现一个编辑器界面

public class JTextAreaEditor extends JTextArea implements Editor {
...
}

然后使用组合暴露Editor接口的方法

    public class JTextAreaEditor extends JTextArea implements Editor {
       private Editor editor;

       public String getValue() {
          return editor.getValue();
       }
       ...
    }
于 2012-07-23T03:22:48.490 回答
0

我认为您的论点完全不正确:对于接口(编辑器),您不应该关心实现的实现方式。您说您的所有编辑器实现都必须是 JComponent。这就是现在发生的事情,但它永远不需要成为“编辑”的“要求”。只要实现符合 Editor 的要求 (getText() ),Editor 的设计就没有理由强加于此。

您所谈论的主要是“普通”编辑器实现的默认基类。再次注意,实现是否选择使用此基类是他们的选择,只要它们符合您的 Editor 接口即可。

public interface Editor {
    String getText();
}

public abstract class JComponentEditor extends JComponent 
        implements Editor {
    //.....
}

public TextAreaEditor extends JComponentEditor {
    public String getText() {
        // implements TextAreaEditor's version of getText
    }
}

编辑:我想我对 OP 的问题有点误解了。无论如何,我的回答中的主要论点仍然成立:强制“......我的编辑器类是一个 JComponent,而我的具体编辑器类是编辑器和 JComponent 的子类”是没有意义的。这只是Editor的实现细节

于 2012-07-23T03:35:19.997 回答