正直MIDPを開発したことはないですが・・・
質問を見た限り、要するにjavaで二重継承の問題を解決したいと言う質問に置き換えられるようなので、「委譲を使ったAdapterパターン」を使えば解決できるような気がします。
つまり、Canvasを継承したクラスの内部にprivateなTextFieldのオブジェクトを作っておいて、使いたいTextFieldのメソッドはそのサブクラスの内部で呼べばいいわけです。
イメージでは
class TextFieldCanvas extends Canvas
{
private TextField tf;
String getText()
{
return tf.getText();
}
void setText(String string)
{
tf.setText(string);
}
}
と言った感じです。getTextやsetTextでないメソッドを呼び出したいときも同じように、そのメソッドをサブクラスで定義して、そのメソッドの内部でTextFieldのインスタンスメソッドを呼び出すようにすればよいです。
MIDPは使ったことがないので具体例が挙げられませんが、swingでJFrameクラスのサブクラスでJTextFieldクラスのメソッドを使う例をどうぞ。
import java.awt.event.*;
import javax.swing.*;
public class TextFieldAdapter extends JFrame{
private JTextField jtf; //委譲のためのオブジェクト
public static void main(String args[])
{
final TextFieldAdapter tfa=new TextFieldAdapter();
tfa.setVisible(true);
tfa.setBounds(300,300,300,300);
tfa.addKeyListener(new KeyListener(){
public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_ENTER)
{
//enterが押されたときTextFieldの文字表示
System.out.println(tfa.getText());
}
//↑か↓が押されたときTextFieldに文字をセット
else if(e.getKeyCode()==KeyEvent.VK_UP)
{
tfa.setText("↑が押されました");
}
else if(e.getKeyCode()==KeyEvent.VK_DOWN)
{
tfa.setText("↓が押されました");
}
}
public void keyReleased(KeyEvent e) {
}
});
}
TextFieldAdapter()
{
jtf=new JTextField();
this.getContentPane().add(jtf); //オブジェクトをセット
}
public void setBounds(int x,int y,int width,int height)
{
super.setBounds(x,y,width,height);
//これを入れないとsetVisibleをsetBoundsの前に呼ばないといけない
setVisible(isVisible());
}
public void addKeyListener(KeyListener kl)
{
//FrameではなくTextFieldにセットする
jtf.addKeyListener(kl);
}
//JFrameのサブクラスでJTextFieldのメソッドを呼ぶ
String getText()
{
return jtf.getText();
}
void setText(String string)
{
jtf.setText(string);
}
}
お礼
出来ました! 本当にご丁寧にありがとうございます。 Canvasクラスに入力文字が表示されたときは ちょっと感無量!って感じでした・・・