2014-11-13 7 views
1

Eclipse IDE처럼 JTabbedPane을 처리 할 수있는 JInternalFrame이 필요합니다. 탭이 제목 표시 줄 위에 놓 이길 원합니다. 각 탭에는 자체 닫기 버튼이 있어야합니다. InternalFrame에는 사용자가 한 번에 모든 탭을 닫을 수 있도록 닫기 버튼이 있어야합니다.Java Swing의 JInternalFrame 제목 표시 줄에 탭을 배치하는 방법은 무엇입니까?

enter image description here

이 내가 (이클립스 IDE에서 찍은 스크린 샷)가 할 것입니다 :

내가 가진 무엇

enter image description here

모르겠다을 어떻게 이것을 달성 할 수 있습니다. 누구든지 올바른 방향으로 나를 가리켜 주시겠습니까?

편집 : UI 위임으로 보는 의견을 바탕으로

, 나는 메뉴를 제거 할 수있는 UI 위양의 서브 클래스를 생성하지만, 몇 가지 문제가이 함께있다 :

  1. 정상적인 JInternalFrame과 비교해 보면 재미있는 것처럼 보입니다. 아무 것도하지 않았지만 "createActionMap"및 "add (menuBar)"행을 주석 처리했습니다. 분명히 내가 제목 표시 줄을 겹쳐의 contentPane의 위치를 ​​이동할 -

    enter image description here

  2. 나는 제목 표시 줄 및 contentPane에 위치 설정 방법을 나타냅니다 아무 곳이나 라이브러리 코드에서 찾을 수 없습니다.

다음은 코드입니다 :

public class MyInternalFrameUI extends BasicInternalFrameUI { 

    public MyInternalFrameUI(JInternalFrame b) { 
     super(b); 
     // TODO Auto-generated constructor stub 
    } 

    public static ComponentUI createUI(JComponent b) { 
     return new MyInternalFrameUI((JInternalFrame)b); 
    } 

    protected JComponent createNorthPane(JInternalFrame w) { 
     titlePane = new MyBasicInternalFrameTitlePane(w); 
     return titlePane; 
     } 
} 

public class MyBasicInternalFrameTitlePane extends BasicInternalFrameTitlePane { 

    public MyBasicInternalFrameTitlePane(JInternalFrame f) { 
     super(f); 
    } 

    protected void installTitlePane() { 
     installDefaults(); 
     installListeners(); 

     createActions(); 
     enableActions(); 
     //createActionMap(); // This method is package protected and not visible 

     setLayout(createLayout()); 

     assembleSystemMenu(); 
     createButtons(); 
     addSubComponents(); 
    } 

    protected void addSubComponents() { 
     //add(menuBar); // Remove this to disable the menu 
     add(iconButton); 
     add(maxButton); 
     add(closeButton); 
    } 
} 
+0

당신은 자신의 내부 프레임 모양과 느낌을 작성해야합니다 ... – MadProgrammer

+0

연구의 무수한 시간 후에 LAF에 대해서는 단순한 요구 사항에 대해 매우 복잡해 보입니다. 라이브러리 파일 중 일부를 살펴 보았는데, 이로 인해 혼란이 더욱 커졌습니다. Synth LAF에 대해 알아 보는 것이 가장 쉬운가요? 그러나 모든 구성 요소에 대해 LAF를 제공하고 싶지 않습니다. 위키 백과에서 인용 : 그러나 synth는 기본보기를 제공하지 않으며 synth XML 파일에 정의되지 않은 구성 요소는 채색되지 않습니다. 그러나 다른 모든 위젯에는 기본 스타일을 할당하고 일부 특정 위젯에만 스타일을 사용자 정의 할 수 있습니다. - 그러나 그것은 어떻게 설명하지 않습니다. – user3804927

답변

0

는 닫기 버튼을 한 부분에 대답하기 위해. 해결 방법은 닫기 버튼을 직접 추가하는 것입니다 (스윙에 내장 된 옵션은 없습니다). 당신은 closeTab(…) 방법을 구현해야 또는

KeyStroke ctrlW = KeyStroke.getKeyStroke(KeyEvent.VK_W, 
     InputEvent.CTRL_DOWN_MASK); 
getRootPane() 
     .getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT) 
     .put(ctrlW, disposeAction.getValue(Action.NAME)); 

DisposeAction을 통해 입력지도에 추가 할 수 있습니다 키보드 단축키를 추가하려면

protected class CloseTabButton extends JPanel { 
    private JLabel   titleLabel; 

    protected CloseTabButton(JTabbedPane aTabbedPane, 
      final AbstractObservableObjectJPanel<M> aDetailPanel, 
      String aTitle, Icon anIcon) { 
     setOpaque(false); 

     titleLabel = new JLabel(aTitle, anIcon, JLabel.LEFT); 
     add(titleLabel); 
     ImageIcon closeImage = new ImageIcon(
       CloseTabButton.class.getResource("/images/icon_normal.png")); 
     Image img = closeImage.getImage(); 
     Image newimg = img.getScaledInstance(16, 16, 
       java.awt.Image.SCALE_SMOOTH); 
     ImageIcon closeIcon = new ImageIcon(newimg); 

     ImageIcon closeImageRollover = new ImageIcon(
       CloseTabButton.class.getResource("/images/icon_roll.png")); 
     Image imgRoll = closeImageRollover.getImage(); 
     Image newimgRoll = imgRoll.getScaledInstance(16, 16, 
       java.awt.Image.SCALE_SMOOTH); 
     ImageIcon closeIconRoll = new ImageIcon(newimgRoll); 

     JButton btClose = new JButton(closeIcon); 
     btClose.setPreferredSize(new Dimension(15, 15)); 

     add(btClose); 
     btClose.setOpaque(false); 
     btClose.setContentAreaFilled(false); 
     btClose.setBorderPainted(false); 

     btClose.setRolloverIcon(closeIconRoll); 
     btClose.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent aE) { 
       closeTab(aDetailPanel); 
      } 
     }); 
     aTabbedPane.setTabComponentAt(
       aTabbedPane.indexOfComponent(aDetailPanel), this); 
    } 

    public JLabel getTitleLabel() { 
     return titleLabel; 
    } 
} 

더 나은 솔루션이 콜백 핸들러에게 것은 액션이다 그 또한 전화가 closeTab(…)

+0

고마워, 나는 이걸 하나 줄 것이다. – user3804927