2013-01-24 11 views
0

2 개의 JPanels-labelsPanel 및 subPanel로 구성된 JPanel을 확장하는 클래스 ExamplePanel이 있습니다. Labelspanel에는 임의의 JLabel이 포함되어 있으며 subPanel에는 ExamplePanel-Nested 인스턴스의 여러 인스턴스가 포함되어 있습니다.자바 드래그하는 동안 항상 JLabel을 JPanels 위에 두십시오.

중첩 된 인스턴스로 JLabel을 드래그 할 수 있기를 원하지만 그렇게하면 하위 패널로 이동하게됩니다. 그 대답은 setComponentZOrder 메서드에 있다고 믿습니다. 그러나 나는 그것에 대해 아무런 진전을 이루지 못하고 있습니다. JLabel이 labelsPanel의 다른 JLabel 위에 그려지지만 JLabel이 해당 Panel의 경계를 벗어나면 아무 효과가 없습니다. JLabel과 JPanel을 모두 Z 순서 0과 1로 가져 오려고 시도했으며 subPanel이 먼저 그려지지만 원하는 효과는 없었습니다. 간체 코드는 다음과 같습니다. (나는 가능한 한 많이 잘라하려고, 그래서에서 왼쪽 코드의 일부 비정상적인 부분이 있으면 용서 한) 다음과 같이

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Rectangle; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import java.util.ArrayList; 

import javax.swing.BorderFactory; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JPopupMenu; 


public class ExamplePanel extends JPanel implements MouseListener, 
    MouseMotionListener { 

public JPanel labelsPanel; 
public JPanel subPanel; 

public ArrayList<JLabel> labels; 
public ArrayList<ExamplePanel> panels; 


private int xOffset = 0, yOffset = 0; 
private Rectangle prevBounds = null; 

private boolean isDragged; 

public ExamplePanel(ArrayList<JLabel> labels, ArrayList<ExamplePanel> panels) { 
    this.invalidate(); 

    this.labels = labels; 
    this.panels = panels; 
    addMouseListener(this); 
    this.setBorder(BorderFactory.createCompoundBorder(
      BorderFactory.createLineBorder(Color.GRAY), 
      BorderFactory.createEmptyBorder(10, 10, 10, 10))); 
    this.setLayout(new BorderLayout()); 
    this.setAlignmentX(Component.LEFT_ALIGNMENT); 
    addLabels(); 
    addPanels(); 
    this.validate(); 

} 

public void addLabels() { 
    if (labelsPanel != null) { 
     this.remove(labelsPanel); 
    } 

    labelsPanel = new JPanel(new GridBagLayout()); 
    labelsPanel.setBorder(BorderFactory.createLineBorder(Color.GREEN)); 


    GridBagConstraints c = new GridBagConstraints(); 
    c.anchor = GridBagConstraints.CENTER; 
    c.ipadx = 50; 
    c.ipady = 30; 
    c.gridx = 0; 
    c.gridy = 0; 

    System.out.println("labels size: " + labels.size()); 

    for (int i = 0; i < labels.size(); i++) { 
     c.gridx = i; 

     labels.get(i).addMouseListener(this); 
     labels.get(i).addMouseMotionListener(this); 

     labelsPanel.add(labels.get(i), c); 
    } 

    this.add(labelsPanel, BorderLayout.NORTH); 
} 

public void addPanels() { 

    System.out.println("panels size: " + panels.size()); 
    if (subPanel != null) { 
     this.remove(subPanel); 
    } 

    subPanel = new JPanel(new BorderLayout()); 
    subPanel.setBorder(BorderFactory.createLineBorder(Color.RED)); 
    subPanel.setAlignmentX(Component.LEFT_ALIGNMENT); 

    subPanel.setOpaque(false); 

    for (ExamplePanel panel : panels) { 
     subPanel.add(panel); 
     this.validate(); 
    } 

    this.add(subPanel, BorderLayout.CENTER); 
} 

public void addLabel(JLabel label) { 
    labels.add(label); 
} 

public void addPanel(ExamplePanel panel) { 
    panels.add(panel); 
} 

@Override 
public void mouseDragged(MouseEvent e) { 
    isDragged = true; 
    JLabel dragged = (JLabel) e.getSource(); 

    int newX = (e.getX() + dragged.getBounds().x - xOffset < 0) ? 0 : e 
      .getX() + dragged.getBounds().x - xOffset; 
    int newY = (e.getY() + dragged.getBounds().y - yOffset < 0) ? 0 : e 
      .getY() + dragged.getBounds().y - yOffset; 
    dragged.setLocation(newX, newY); 

} 

@Override 
public void mouseMoved(MouseEvent e) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mouseClicked(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mouseEntered(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mouseExited(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mousePressed(MouseEvent arg0) { 
    System.out.println("++++++ Start Of Pressed ++++++"); 

    System.out.println("Mouse Pressed At: " + arg0.getX() + " " 
      + arg0.getY()); 

    // Collect the clicked source and return if it's 
    // not a JLabel (might have to be modified if we 
    // want to click on other things than JLabels. 
    Object source = (Object) arg0.getSource(); 

    if (source instanceof JLabel) { 
     JLabel jlb = (JLabel) arg0.getSource(); 
     prevBounds = jlb.getBounds(); 
     xOffset = arg0.getX(); 
     yOffset = arg0.getY(); 

     ((JLabel) arg0.getSource()).getParent().setComponentZOrder(
       ((JLabel) arg0.getSource()), 0); 

    } 
    JLabel clicked = null; 
    if (source instanceof JLabel) { 
     clicked = (JLabel) source; 
    } else { 
     System.out.println("++++++ End Of Pressed ++++++"); 
     return; 
    } 

    System.out.println("++++++ End Of Pressed ++++++"); 

} 

@Override 
public void mouseReleased(MouseEvent arg0) { 
    System.out.println("++++++ Start Of Released ++++++"); 


    if (!isDragged) { 
     System.out.println("++++++ End Of Released, not dragging ++++++"); 
     return; 
    } 

    isDragged = false; 
    xOffset = yOffset = 0; 

    // The object being dragged 
    JLabel source = (JLabel) arg0.getSource(); 
    System.out.println("Source is: " + source.toString()); 

    source.setBounds(prevBounds); 


    System.out.println("++++++ End Of Released ++++++"); 

} 
} 

기본 메인 클래스이다;

import java.awt.Dimension; 
import java.util.ArrayList; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 


public class Main extends JFrame { 

public Main() { 
    setSize(new Dimension(600, 600)); 

    ArrayList<JLabel> labels = new ArrayList<JLabel>(); 
    JLabel label1 = new JLabel("Example 1"); 
    JLabel label2 = new JLabel("Example 2"); 
    labels.add(label1); 
    labels.add(label2); 

    ArrayList<ExamplePanel> panels = new ArrayList<ExamplePanel>(); 
    ArrayList<ExamplePanel> panels2 = new ArrayList<ExamplePanel>(); 
    System.out.println("LAbels size = " + labels.size()); 
    ExamplePanel secondPanel = new ExamplePanel(labels, panels2); 
    panels.add(secondPanel); 

    ExamplePanel firstPanel = new ExamplePanel(labels, panels); 

    this.add(firstPanel); 
    this.setVisible(true); 
} 

public static void main (String [] args) { 
    Main main = new Main(); 
} 
} 

실제로이 JLabel을 subPanel에 추가하고이 질문에 필요하지 않으므로 패널을 새로 고치는 코드는 생략했습니다. 사전에 어떤 도움

감사합니다

+0

를 들어, [SSCCE] (http://sscce.org/) –

+0

(가) 코드는 내가 두려워 그것을 얻을 수있는 가장 작은도 포함되어 게시 할 수 있습니다. 이 두 클래스에서 문제를 실행할 수 있습니다. 답장을 보내 주셔서 감사합니다 – Bruce0

+0

* "포함 된 코드는 내가 얻을 수있는 가장 작은 코드입니다."* '짧음'은 SSCCE의 첫 번째 용어이며 사람들은 너무 집중합니다. SSCCE의 또 다른 조건 인 ** 소스 파일 ** 인 경우 해당 코드를 잠재적 SSCCE로 간주합니다. –

답변

3

간단한 선택은 현재 컨테이너에서 라벨을 제거하고 프레임 유리 창으로 이동, 라벨이 유리 창을 가로 질러 이동 될 수 있도록하고 다시 추가하는 것 컨테이너에 떨어 뜨렸다.

체크 아웃 how to use glass panes 빨리 더 나은 도움말을 보려면 자세한 내용

+2

+1 유리판을 제안했다. @ Bruce0이 답변을 볼 [여기] (http://stackoverflow.com/questions/14273923/how-can-i-set-the-priority- 마우스 수신기/14276466 # 14276466) (특히 코드의 마지막 배치), * glasspane *을 사용하는 사용자 정의 클래스를 보여 주므로 여러 컨테이너 위로 드래그 할 수 있습니다. –

+2

감사합니다. 이것은 내가 원하는 모든 것을 성취합니다. @DavidKroukamp 연결된 예가 실제로 도움이되었습니다. – Bruce0

관련 문제