2017-02-15 2 views
-2

불행히도 자바를 배우지 못했지만 Java를 제외한 다른 프로그래밍 언어를 알고 있습니다.자바, 다른 클래스의 JMenuItem의 텍스트를 어떻게 설정합니까?

메뉴를 만들고 메뉴에 항목을 추가하는 방법을 알고 있습니다. 내 단순한 기본 자바 서적에서 그걸 알아 냈어. 그러나 나는 오픈 소스 소프트웨어에 접근 할 수 있으며 그것을 위해 약간의 조정을 할 필요가있다. 그래서 나는 진행되고있는 일에 대한 코드를 제공하고, 가지고있는 코드를 제공하고, 누군가가 누락 된 부분을 채우고 어떻게 작동하는지 설명 할 수 있기를 바랍니다.

아래 코드는 TranslatorAction.java를 호출하는 파일의 일부입니다. 새 메뉴 항목을 만들 때이 코드를 호출합니다. 나는이 부분을 완전히 이해한다. 나는 import 문이 JMenuItem을 위해 임포트되지 않고 메뉴 항목이 menu.add 호출에서 간접적으로 추가되고 있음을 볼 수 있도록이 코드를 게시했다. adminMenu.add는 객체/클래스를 생성하여 메뉴 항목을 생성하고 있습니까 ?? 새 번역기 사용하기 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의 텍스트 설정에 액세스하는 데 문제가 있습니다. 나는 코드 super ("test")를 가지고 노는 것으로부터 알고있다. 새 JMenuItem 텍스트를 설정 중입니다. 이 변수를 변수로 설정하여 해당 변수를 즉시 변경할 수있게하고 싶습니다. 아래는 adminMenu.add (New TranslatorAction())에서 위에서 호출 한 전체 파일입니다.

TranslatorAction 자바 파일의 코드 저를 도와 주셔서 모든 사람 '시간

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) { 
    } 
    } 

감사합니다. Shawn

+2

전체 예제를 제공하려면 질문을 편집하십시오. 특히 모든 메소드는 클래스 내에 있어야합니다. 들여 쓰기도 수정해야합니다. –

+0

또한, 나는 당신이 정확히 무엇을 요구하고 있는지 이해하지 못합니다. 무엇을 넣을 지 모르는 코드를 추가해야하는 경우 예제에 표시해야합니다. –

+0

나는 내가 이해하고 변경해야 할 것을 코드에 주석으로 적었다. 슈퍼 라인 ("test"); 내가 바꿀 필요가있는 것이지. 내가 아는이 선은 파일 메뉴의 텍스트를 변경합니다. 그래서 내가 그것을 ("java") super로 바꾼다면; 파일 메뉴에는 Java가 있습니다. 나는 이것을 동적으로 바꿀 수 있어야한다. 그래서 내가 알아야 할 것은 동적으로 코드를 변경하는 코드가 아니라 다른 클래스 adminMenu.add (new translatorAction())에서 호출하여 생성 된 JMenuItem에 대한 setText에 액세스하기 위해해야 ​​할 일이 무엇인지 추측합니다. –

답변

0

JMenuItem#setText(String) 방법으로 JMenuItem 개의 텍스트를 동적으로 설정할 수 있습니다.

별도의 클래스를 사용하지 않고 간단한 해결책은 자신 만의 JMenuItem을 만들고 anonymous classes을 사용하여 동작을 설정 한 다음 JMenu에 추가하는 것입니다. 당신이 MVC 패턴을 (@MadProgrammer 내가 매우 추천한다) 구현에 계획하는 경우, 컨트롤러로 메서드 호출이 actionPerformed(...) 방법이 될 것이라고

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); 

참고. MVC 패턴에 대한 자세한 내용은 this answer에서 확인할 수 있습니다. 당신은 정말 당신의 JMenuAbstractAction 추가에 설정되어있는 경우


, 당신은에 추가 될 것 년대 JMenuItem의 인스턴스에 액션 액세스를 줄 수있는 방법을 추가 할 필요 해요 .

JMenuItemmyJMenu.getItem(menu.getItemCount() - 1)을 사용하여 얻을 수 있습니다. 이것은 JMenu에있는 마지막 JMenuItem을 얻습니다. 문서에 명시된대로 JMenu#add(Action a)과 함께 추가 된 JMenuItemJMenu 끝에 추가됩니다.

를 사용하면 사용자 지정 작업에 setter 메소드 (setJMenuItem(JMenuItem item))를 추가 할 수 있습니다 사용자에게 AbstractActionJMenuItem 인스턴스를 제공하기 위해 add(Action a)에 대한 호출이 끝날 때까지 만든 JMenuItem을 얻을 수있는 방법이 없기 때문에.

내는 AbstractAction 구현은 다음과 같습니다 재 다음 actionPerformed(...) 메소드가 호출 및 itemnullNullPointerException가 발생 될 것이다 경우

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을 설정해야합니다.

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 (새 클래스())를 호출하여 JMenuItem의 텍스트를 설정 한 다음 새 클래스에서 SUPER ("Menu Item의 표시 이름")와 함께 표시된 JMenuItem을 만들었습니다. 그리고 저는 자바에 관한 여러 책을 통해 많은 독서를했습니다. 그리고 그들은 모두 JMenuItem과 JMenu 클래스에 대한 기본 세부 사항으로 들어가지만, 함께 사용하기에는 부족합니다. –

+0

2 Deutel and Deitel Java에서 배운 저서 Swing과 Ivor Horton의 Java 2를 처음부터 끝까지 다룰 계획입니다. 그러나 이것들 중 어느 것도 예를 들어 알아야하거나 알아 내려고하는 것들로는 깊이 들어 가지 않습니다 . 별도의 클래스를 사용하지 않고이 작업을 수행하는 방법을 알고 있지만 원본 작성자의 스타일을 유지하는 것은 유지 관리하려는 것입니다. 다른 좋은 Java 리소스 서적이나 내가 사용하고있는 것보다 더 좋은 것이 있으면 알려주십시오. –

+0

나를 위해서뿐만 아니라 다른 사람들에게도 읽어주고 있습니다. 내 별도의 클래스 파일이 JMenuItem을 가져 오지 않는다면,이 작업을 가져 오기 위해 가져와야한다고 가정하고 있습니까? 컴파일 할 때 SYMBOL JMenuItem을 찾을 수 없다는 오류가 발생합니다. –

관련 문제