2017-02-15 13 views
-2

残念ながら、私はJavaを学んでいませんでした。私はJava以外の他のプログラミング言語も知っています。Java、別のクラスのJMenuItemのテキストを設定するにはどうすればいいですか?

私はメニューを作成し、メニューにアイテムを追加する方法を知っています。私は私の単純な基本的なJavaの本からそれを考え出した。しかし、私はオープンソースソフトウェアの一部にアクセスし、それをいくつか調整して、それが私のために働くようにする必要があり、私は立ち往生しています。だから私は何が起こっているのかのコードを提供し、私が持っているもののコードを提供し、誰かが不足している部分を記入し、それがどのように働いたかを説明することができればうれしく思います。

以下のコードは、TranslatorAction.javaを呼び出すファイルの一部です。新しいメニュー項目を作成するときに、行で呼び出します。私はこの部分を完全に理解しています。私はこのコードを投稿しただけなので、importステートメントがJMenuItemのためにインポートされておらず、メニュー項目がmenu.addコールから間接的に追加されていることがわかります。 adminMenu.addは、オブジェクト/クラスを作成してメニュー項目を作成していますか? paremetersを使用して新しいTranslatorAction

javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import com.bo.actions.TranslatorAction; 
    private void createAdminMenu(JMenuBar menuBar) { 
    JMenu adminMenu = new JMenu(com.POSConstants.ADMIN); 
    adminMenu.add(new TranslatorAction()); 
    menuBar.add(adminMenu); 
    } 

新しいTranslatorAction()が呼び出されると、新しいメニュー項目が作成されます。新しいJMenuItemのテキストの設定にアクセスする際に問題が発生しています。私はコードを演奏することから知っていることを知っているラインスーパー( "テスト");新しいJMenuItemテキストを設定しています。これを変数にセットしたいので、その場で変更することができます。以下はadminMenu.add(New TranslatorAction())で上から呼び出されるファイル全体です。

TranslatorAction javaファイルのコード私を助けるために、すべてのものの時間のため

package com.bo.actions; 
    import java.awt.event.ActionEvent; 
    import javax.swing.AbstractAction; 
    import javax.swing.Icon; 
    import javax.swing.JTabbedPane; 
    import com.POSConstants; 
    import com.bo.ui.BackOfficeWindow; 


    public class TranslatorAction extends AbstractAction { 

    public TranslatorAction(){ 
    //I know this sets the JMenuItem to Test. Again no importing of  
    //JMenuItem at all what so ever. But I need to set the JmenuItem 
    //to something on the fly instead of hard coding it. Can anyone 
    //show and explain how to dynamically create/change super("test"), 
    // so that way it is not hard coded? 

    super("Test"); 
    } 

    public TranslatorAction(String name) { 
    super(name); 
    } 

    public TranslatorAction(String name, Icon icon) { 
     super(name, icon); 
    } 

    public void actionPerformed(ActionEvent e) { 
    } 
    } 

感謝。 ショーン

+2

完全な例を示すために質問を編集してください。特に、すべてのメソッドはクラス内にある必要があります。また、インデントを修正する必要があります。 –

+0

また、私はあなたが尋ねていることを正確に理解していません。あなたは何を置くべきか分からないコードを追加する必要があるあなたの例を示すべきです。 –

+0

私は、私が理解しているものと変更する必要があるものでコードをコメントしました。ラインスーパー( "テスト")。私が変える必要があるものです。私が知っているこの行は、ファイルメニューのテキストを変更します。だから私はそれをスーパー( "java")に変更します。ファイルメニューにはJavaがあります。私はこれを動的に変更できる必要があります。だから、私はそれを動的に変更するコードではないが、他のクラスadminMenu.add(new translatorAction())からの呼び出しから作成されたJMenuItemのsetTextにアクセスするために何をする必要があるかを知る必要があると思います。 –

答えて

0

JMenuItem#setText(String)メソッドでJMenuItemのテキストを動的に設定できます。

別のクラスを使用しないと簡単な解決方法は、独自のJMenuItemを作成し、anonymous classesを使用してアクションを設定し、JMenuに追加することです。

final JMenu menu = new JMenu("Test JMenu"); 
final JMenuItem menuItem = new JMenuItem("Initial Text"); 
menuItem.setAction(new AbstractAction() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     menu.setText("Different Text"); 
    } 

}); 
menu.add(menuItem); 

あなたは(@MadProgrammerと私は非常にお勧め)MVCパターンの実装を計画している場合、コントローラにあなたのメソッド呼び出しがactionPerformed(...)方法になることに注意してください。 MVCパターンの詳細については、this answerを参照してください。


あなたが本当にあなたのJMenuAbstractActionを追加することで設定されている場合、あなたは 追加されるだろうJMenuItemのインスタンスへのあなたのアクションへのアクセスを提供するための方法を追加する必要があるとしています。

JMenuItemは、myJMenu.getItem(menu.getItemCount() - 1)を使用して取得できます。これにより、JMenuの最後のJMenuItemが取得されます。文書に記載されているように、JMenu#add(Action a)で追加されたJMenuItemJMenuの末尾に追加されます。

は、カスタムアクションにセッターメソッド(setJMenuItem(JMenuItem item))を追加することができ、カスタムにAbstractActionJMenuItemインスタンスを与えることadd(Action a)への呼び出し後まで作成JMenuItemを取得する方法はありませんので。actionPerformed(...)メソッドが呼び出され、itemNullPointerExceptionがスローされますnullでされている場合があるため、この場合にアクションを追加した後

public class CustomAction extends AbstractAction { 

    private JMenuItem item; 

    public CustomAction() { 
     super("Initial Text"); 
    } 

    public void setJMenuItem(JMenuItem item) { 
     this.item = item; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     item.setText("Different Text"); 
    } 

} 

するJMenuItemを設定してください:

私はAbstractAction実装はこのようになりますリワーク。

final JMenu menu = new JMenu("Test JMenu"); 
final CustomAction action = new CustomAction(); 
menu.add(action); 
action.setJMenuItem(menu.getItem(menu.getItemCount() - 1)); 
+0

ありがとうございました。私はこれを試してみましょう。別々のクラスを持ち、AbstractActionを使用する唯一の理由は、元のコードのスタイルにとどまることです。ただし、元のコードはすべてmenu.add(new class())を呼び出してJMenuItemのテキストを設定し、新しいクラスでSUPER( "Menu Itemの表示名")を使用して表示されたJMenuItemを作成しました。そして、私はjavaに関するさまざまな本を読んで多くのことをしましたが、JMenuItemとJMenuクラスについての基本的な詳細はすべてまとめられていましたが、一緒にまとめていくには十分ではありません。 –

+0

2私が学んでいる本はDeitel and Deitel Javaです。How ToプログラムはSwingとIvor HortonのJava 2を始めます。しかし、これらのどれも、私が知る必要がある、あるいはこれを理解しようとしている。私は別のクラスを使わずにこれを行う方法を知っていますが、元の著者のスタイルを維持することは、私が維持したいことです。他の良いJavaのリソースブックや私が使用しているものよりも優れている場合は、私にも知らせてください。 –

+0

私だけでなく他の人も読んでいます。私の最初の別のクラスファイルはJMenuItemをインポートしないので、これを動作させるためにインポートする必要があると仮定していますか?私がコンパイルするとエラーが発生するSYMBOL JMenuItemを見つけることができません。 –

関連する問題