2013-05-24 3 views
2

JPanel (이미지 참조)을 사용하여 Mac에서 툴바를 확장했지만 실제로 툴바 인 부분 (JPanel이 아님) 만 클릭하고 끌 수 있습니다. 툴바처럼 JPanel을 클릭하고 드래그하여 창을 이동할 수있게하는 방법JPanel을 드래그 가능하게 만들기

이미지의 상단 ㎜ 정도가 실제 툴바 (텍스트 포함)이고 나머지는 JPanel입니다. (버튼 포함).

package gui; 
import java.awt.Color; 
import java.awt.GradientPaint; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Window; 
import java.awt.event.WindowEvent; 
import java.awt.event.WindowFocusListener; 
import java.awt.event.WindowListener; 

import javax.swing.BorderFactory; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.border.Border; 

import com.jgoodies.forms.factories.Borders; 

public class UnifiedToolbarPanel extends JPanel implements WindowFocusListener { 

    public static final Color OS_X_UNIFIED_TOOLBAR_FOCUSED_BOTTOM_COLOR = 
      new Color(64, 64, 64); 
    public static final Color OS_X_UNIFIED_TOOLBAR_UNFOCUSED_BORDER_COLOR = 
      new Color(135, 135, 135);  

    public static final Color OS_X_TOP_FOCUSED_GRADIENT = new Color(214+8, 214+8, 214+8); 
    public static final Color OS_X_BOTTOM_FOCUSED_GRADIENT = new Color(217, 217, 217); 
    public static final Color OS_X_TOP_UNFOCUSED_GRADIENT = new Color(240+3, 240+3, 240+3); 
    public static final Color OS_X_BOTTOM_UNFOCUSED_GRADIENT = new Color(219, 219, 219); 


    public UnifiedToolbarPanel() { 
     // make the component transparent 
     setOpaque(true); 
     Window window = SwingUtilities.getWindowAncestor(this); 
     // create an empty border around the panel 
     // note the border below is created using JGoodies Forms 
     setBorder(Borders.createEmptyBorder("3dlu, 3dlu, 1dlu, 3dlu")); 
    } 


    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     Window window = SwingUtilities.getWindowAncestor(this); 
     Color color1 = window.isFocused() ? OS_X_TOP_FOCUSED_GRADIENT 
       : OS_X_TOP_UNFOCUSED_GRADIENT; 
     Color color2 = window.isFocused() ? color1.darker() 
       : OS_X_BOTTOM_UNFOCUSED_GRADIENT; 
     int w = getWidth(); 
     int h = getHeight(); 
     GradientPaint gp = new GradientPaint(
      0, 0, color1, 0, h, color2); 
     g2d.setPaint(gp); 
     g2d.fillRect(0, 0, w, h); 
    } 

    @Override 
    public Border getBorder() { 
     Window window = SwingUtilities.getWindowAncestor(this); 
     return window != null && window.isFocused() 
       ? BorderFactory.createMatteBorder(0,0,1,0, 
         OS_X_UNIFIED_TOOLBAR_FOCUSED_BOTTOM_COLOR) 
       : BorderFactory.createMatteBorder(0,0,1,0, 
         OS_X_UNIFIED_TOOLBAR_UNFOCUSED_BORDER_COLOR); 
    } 


    @Override 
    public void windowGainedFocus(WindowEvent e) { 
     repaint(); 
    } 


    @Override 
    public void windowLostFocus(WindowEvent e) { 
     repaint(); 
    } 
} 

답변

2

가 어떻게 이동하는 JPanel의를 클릭하고 드래그하여 사용자를 허용 않습니다 여기 enter image description here

는 JFrame의 국경 레이아웃의 북쪽에 설정되어 UnifiedToolPanel, 코드입니다

private int x; 
    private int y; 
    //..... 
    //On mouse pressed: 
    jpanel.addMouseListener(new MouseAdapter(){ 
     public void mousePressed(MouseEvent ev){ 
     x = ev.getX(); 
     y = ev.getY(); 
     } 
    }); 
    //.... 
    //on mouse dragged 
    jpanel.addMouseMotionListener(new MouseMotionAdapter() { 
       public void mouseDragged(MouseEvent evt) { 
        int x = evt.getXOnScreen()-this.x; 
        int y = evt.getYOnScreen -this.y; 
        this.setLocation(x,y); 

       } 
      }); 

this.setLocation(x,y)프레임을 이동합니다 : 창 여기
는 방법입니다
패널이이 아니므로 클래스가 JFrame으로 확장되었다고 생각합니다.
그러나 점 (x, y)을 반환하는 메서드를 만들고 으로 설정할 수 있습니다.

+0

downvote의 이유가 무엇인지 말해 주실 수 있습니까? – Azad

+0

이것은 매우 어색한 방법입니다. 이유에 대한'JSeparator' 클래스가 있습니다. –

+0

@Legend : * 매우 조잡한 방법입니다. * 모르겠다는 말을 해 주셔서 감사합니다. * JSeparator *에 대한 예를 보여주세요. – Azad

관련 문제