2014-10-17 2 views
1

Jbutton 툴팁에 키보드 단축키를 표시해야한다는 요구 사항이 있습니다. 툴팁에 동작 맵과 모든 필수 코드를 추가했지만 단축키는 Metalic 모양과 느낌으로 만 표시됩니다. 우리는 응용 프로그램의 모양과 느낌을 metalic에서 시스템 또는 다른 모양과 느낌으로 변경하고, 단축키는 더 이상 도구 팁에 표시되지 않습니다.jbutton의 단축키 툴팁이 matalic 이외의 다른 테마에 표시되지 않음

다음은 바로 가기가있는 2 개의 J 버튼을 보여주는 바로 가기입니다. 바로 가기가 멋진 모양과 느낌으로 제대로 표시되지만, 시스템이나 Motif와 같은 다른 모양과 느낌을 사용하면 바로 가기가 J 버튼 도구에 표시되지 않습니다. 팁.

import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.InputEvent; 
import java.awt.event.KeyEvent; 

import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.KeyStroke; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

public static void main(String args[]) { 
    try { 
     UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); 
     // UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     // UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); 
    } catch (ClassNotFoundException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } catch (InstantiationException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } catch (IllegalAccessException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } catch (UnsupportedLookAndFeelException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

    JFrame frame = new JFrame("KeyStroke Sample"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    final JButton buttonA = new JButton("a Button"); 
    buttonA.setMnemonic('a'); 
    frame.setVisible(true); 
    buttonA.setToolTipText("a Button"); 
    final JButton buttonB = new JButton("another Button"); 
    buttonB.setMnemonic('b'); 
    frame.add(buttonA); 
    frame.add(buttonB); 
    buttonB.setToolTipText("another Button"); 
    Action action = new AbstractAction() { 
     public void actionPerformed(ActionEvent e) { 
      if (e.getSource().equals(buttonA)) { 
       System.out.println("buttonA"); 
      } 
      if (e.getSource().equals(buttonB)) { 
       System.out.println("buttonB"); 
      } 
     } 
    }; 
    buttonA.addActionListener(action); 
    buttonB.addActionListener(action); 

    // buttonA ("ALT+A"); 
    buttonA.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
      KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.ALT_MASK), 
      "left_button_pressed"); 
    buttonA.getActionMap().put("left_button_pressed", action); 

    // buttonB ("CTRL+Shift+A"); 
    buttonB.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
      KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_DOWN_MASK 
        | InputEvent.SHIFT_MASK), "right_button_pressed"); 
    buttonB.getActionMap().put("right_button_pressed", action); 
    frame.setLayout(new GridLayout(2, 2)); 

    frame.setSize(400, 200); 

} 

}

+3

이러한 툴팁, 액션 맵 등을 사용하여 구성 요소의 짧은 코드 예를 게시하여 직접 볼 수 있도록하십시오. – user1803551

+0

예제가 추가되었습니다. 다른 모양과 느낌으로 예제를 테스트 해주십시오. 단축키는 Metalic 모양과 느낌으로 만 표시되지만 다른 모양으로는 표시되지 않습니다. – Gaurav

+1

예를 들어 주셔서 감사합니다. 메소드의 끝에서'frame.setVisible (true)'가 호출되어야한다는 것에주의하십시오. – user1803551

답변

1

는 가속기 문자열을 표시 : 다른 모양 아래 예제의 동작을 테스트하고 느낄 수있는 금속적인 모양과 예를 느낌과 시스템 또는 주제보기를 활성화하고 현재 주석되는 느낌을 언급하시기 바랍니다 툴팁에는 기본적으로 금속으로 만 구현되는 항목이 있습니다 ("유일한"은 시도한 다른 모든 LAF를 나타냄). 이 동작은 도구 설명을 설정하고 표시하는 클래스 인 MetalToolTipUI 클래스에서 정의됩니다.

다행히도 UIManager 클래스를 사용하면 ToolTipUI을 설정할 수 있습니다. 내가 적응 툴팁의 시각적 스타일 (배경 색상과 글꼴을) 체크 LAFS를 들어

UIManager.getDefaults().put("ToolTipUI", "javax.swing.plaf.metal.MetalToolTipUI"); 

하지만 외모가 일치하지 않습니다하는 경우가있을 수 있습니다 : 당신은 다른 LAF에 대한 금속의를 사용할 수 있습니다. 이 경우 ToolTipUI 또는 하위 클래스 중 하나를 자신의 필요에 맞게 하위 클래스로 만들 수 있습니다.

또한, 점검하십시오 LAF에 대한

UIManager.getDefaults().getBoolean("ToolTip.hideAccelerator"); 

반환 false 그. 표시되지 않고 사용 된 툴팁 UI가이 속성을 존중하면 액셀러레이터가 표시되지 않습니다. 어쨌든 true으로 설정할 수 있습니다.

+0

솔루션을 주셔서 감사합니다. ToolTipUI를 Metal로 구성한 후 해결책이 저에게 효과적이었습니다. 다른 LAF도 확인했는데 다른 LAF ToolTipUI가 액셀러레이터 문자열을 표시하는 코드가없는 BasicToolTipUI로 설정되어 있음을 알았습니다. 따라서 유일한 해결책은 ToolTipUI 클래스를 BasicToolTipUI에서 MetalToolTipUI로 변경하는 것입니다. 속성을 변경하면 ToolTip.hideAccelerator가 다른 LAF의 가속기를 표시하는 데 도움이되지 않습니다. 빠른 솔루션을 제공해 주셔서 다시 한번 감사드립니다. 다른 LAF ToolTipUI에 대해 " – Gaurav

+1

@ Gaurav *"는 BasicToolTipUI로 설정됩니다. *, * "속성 변경 ToolTip.hideAccelerator는 다른 LAF * 용 액셀러레이터를 표시하는 데 도움이되지 않습니다."LAF는 툴팁 UI에 대한 자체 구현을 가질 수 있으며, hideAccelerator' 속성 때문에이 일반화를 만들 수 없습니다. 이것은 또한 내가 대답에 그것을 설명하는 이유입니다. – user1803551

+1

@Gaurav * "유일한 해결책은 BasicToolTipUI에서 MetalToolTipUI로 ToolTipUI 클래스를 변경하는 것입니다."* 내가 말했던 것처럼 독자적인 툴팁 UI를 만들고 원하는 기능을 구현할 수도 있습니다. – user1803551

관련 문제