2015-07-03 118 views
2

我想制作一个可拖动和可调整大小的面板,也可以关闭/删除。拖动面板工作正常,但是在调整大小的代码中存在一些错误。它工作但不是很好。也许有人可以帮我解决它。问题是设置标签的正确位置“关闭”和“调整大小”。使JPanel可调整大小

谢谢大家帮忙

public class PanelDraggable extends JPanel { 

    private Point pointPressed; 
    int width1; 
    int height1; 
    int headerHeight; 
    int closeDim; 

    JLabel close; 
    JLabel resize; 
    JPanel cs; 
    JLabel header; 

    public PanelDraggable(int x, int y, int width, int height, String lblName) { 

     //  draggable.setCursor(draggable.getCursor()); 
     //  setCursor(new Cursor(Cursor.HAND_CURSOR)); 

     width1 = width; height1 = height; 
     closeDim = 15; 

     headerHeight = 20; 

     setBounds(x, y, width, height); 
     this.setLayout(null); 
     setBorder(new LineBorder(new Color(147, 147, 255), 3, true)); 
     this.setOpaque(true); 


     //header 
     header = new JLabel(lblName); 
     this.add(header); 
     header.setBounds(0, 0, width-(closeDim + 2), headerHeight); 
     header.setBorder(new LineBorder(new Color(147, 147, 255), 3, true)); 
     header.setBackground(new Color(147, 147, 255)); 
     header.setOpaque(true); 
     MouseInputAdapter mouseAdapter = new HeaderMouseHandler(); 
     header.addMouseMotionListener(mouseAdapter); 
     header.addMouseListener(mouseAdapter); 

     //close Button 
     close = new JLabel("cx"); 
     close.setIcon(new ImageIcon("icons/close_16x16.png")); 
     close.setBounds((width- (closeDim + 2)) , 2, closeDim, closeDim); 
     close.setCursor(new Cursor(Cursor.HAND_CURSOR)); 
     this.add(close); 

     //Container 
     cs = new JPanel(); 
     cs.setBounds(0, headerHeight, width, (height-headerHeight)); 
     cs.setOpaque(false); 
     cs.setBackground(Color.red); 
     this.add(cs); 

     //Resise 
     resize = new JLabel("re"); 
     resize.setBounds((width-closeDim), (height-closeDim) , closeDim, closeDim); 
     resize.setCursor(new Cursor(Cursor.SE_RESIZE_CURSOR)); 
     this.add(resize); 

     MouseInputAdapter resizeMouseAdapter = new ResizeMouseHandler(); 
     resize.addMouseMotionListener(resizeMouseAdapter); 
     resize.addMouseListener(resizeMouseAdapter); 

    } 


    private class HeaderMouseHandler extends MouseInputAdapter { 

     public void mouseDragged(final MouseEvent e) { 
      Point pointDragged = e.getPoint(); 
      Point loc = getLocation(); 
      loc.translate(pointDragged.x - pointPressed.x, 
       pointDragged.y - pointPressed.y); 
      setLocation(loc); 

     } 

     public void mousePressed(final MouseEvent e) { 

       pointPressed = e.getPoint(); 

     } 
    } 

    private class ResizeMouseHandler extends MouseInputAdapter { 

     public void mouseDragged(final MouseEvent e) { 
      Point pointDragged = e.getPoint(); 

      int w = width1 + pointDragged.x; 
      int h = height1 + pointDragged.y; 

      setSize(w , h); 
      cs.setSize(w, (h-headerHeight)); 
      header.setSize(w -(closeDim + 2), headerHeight); 

      //Point loc = getLocation(); 
      //loc.translate(pointDragged.x - pointPressed.x, 
       //pointDragged.y - pointPressed.y); 

      //System.out.println("p: "+Integer.toString((pointDragged.x - pointPressed.x)) + "/" + Integer.toString((pointDragged.y - pointPressed.y))); 
      //System.out.println("n: "+Integer.toString(w) + "/" + Integer.toString(h)); 
      //System.out.println("o: "+Integer.toString(width1) + "/" + Integer.toString(height1)); 

      Point resizeloc = new Point(); 
      resizeloc.translate(w-closeDim, h-closeDim); 
      resize.setLocation(resizeloc); 

      //Point closeloc = new Point(); 
      //closeloc.translate((w - (closeDim + 2)) , 2); 
      //close.setLocation(closeloc); 


      revalidate(); 
      repaint(); 
     } 

     public void mousePressed(final MouseEvent e) { 

       pointPressed = e.getPoint(); 

     } 
    } 
} 
+0

如果你想要一个内部框架,有一个办法做到这一点很容易:如何使用内部框架(https://docs.oracle.com/javase/tutorial/uiswing/components/internalframe的.html)。除非你正在寻找别的东西,否则应该这样做。 – Obicere

+0

我不想要一个框架。我想在这个面板中添加一个JList – coo12

回答

0

现在解决了。问题在于面板的尺寸(这是我对标签新位置的引用)没有变化。

int w = width1 + pointDragged.x; 
     int h = height1 + pointDragged.y;