2011-08-18 68 views
3

我嘗試使用右下角的調整大小手柄來創建窗口。 到目前爲止,我設法檢測到鼠標懸停和拖動。java狀態欄調整角落(句柄)

鼠標光標正在改變,以成功調整光標的大小。

但實際調整大小操作我不確定如何解決。 我首先想到的想法是在拖動調整大小句柄時僅對父級進行設置。 它的工作原理,但然後窗口立即調整大小,這不是標準調整大小的外觀。 標準調整大小是一個帶有白色邊框的透明窗口(可能在不同系統和外觀上有所不同)。

是否可以觸發/使用內置的調整大小機制? 下面你有一個示例代碼。

謝謝!

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Cursor; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Polygon; 
import java.awt.RenderingHints; 
import java.awt.event.InputEvent; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 

public class main extends JFrame { 

private JPanel contentPane; 

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       main frame = new main(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

public class StatusBar extends JPanel implements MouseListener, MouseMotionListener { 

    private Polygon resizeCorner = new Polygon(); 
    private int offsetX; 
    private int offsetY; 
    private Dimension offsetSize; 
    private Cursor resizeCursor = new Cursor(Cursor.SE_RESIZE_CURSOR); 
    private Cursor defaultCursor = new Cursor(Cursor.DEFAULT_CURSOR); 

    public StatusBar() { 
     super(); 
     setPreferredSize(new Dimension(200,40)); 
     this.addMouseListener(this); 
     this.addMouseMotionListener(this); 
    } 

    private void createResizeHandle() { 
     resizeCorner.reset(); 
     resizeCorner.addPoint(getWidth()-2, getHeight()-2); 
     resizeCorner.addPoint(getWidth()-40, getHeight()-2); 
     resizeCorner.addPoint(getWidth()-2, getHeight()-40); 
    } 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     Graphics2D g2; 
     g2 = (Graphics2D) g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setRenderingHint(RenderingHints.KEY_RENDERING, 
       RenderingHints.VALUE_RENDER_QUALITY); 
     g2.setColor(Color.red); 
     createResizeHandle(); 
     g2.drawPolygon(resizeCorner); 
    } 

    @Override 
    public void mouseDragged(MouseEvent e) { 
     if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != 0) { 
      int width = (int) (this.offsetSize.getWidth() - this.offsetX + e.getXOnScreen()); 
      int height = (int) (this.offsetSize.getHeight() - this.offsetY + e.getYOnScreen()); 
      this.getRootPane().getParent().setSize(width, height); 
      createResizeHandle(); 
     } 
    } 

    @Override 
    public void mouseMoved(MouseEvent e) { 
     if (resizeCorner.contains(e.getX(), e.getY())) { 
      setCursor(resizeCursor); 
     } else { 
      setCursor(defaultCursor); 
     } 
    } 

    @Override 
    public void mouseClicked(MouseEvent arg0) { 
    } 

    @Override 
    public void mouseEntered(MouseEvent arg0) { 
    } 

    @Override 
    public void mouseExited(MouseEvent arg0) { 
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     if (resizeCorner.contains(e.getX(), e.getY())) { 
      this.offsetX = e.getXOnScreen(); 
      this.offsetY = e.getYOnScreen(); 
      this.offsetSize = this.getRootPane().getParent().getSize(); 
     } 
    } 

    @Override 
    public void mouseReleased(MouseEvent arg0) { 
    } 
} 


public main() { 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 450, 300); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    contentPane.setLayout(new BorderLayout(0, 0)); 
    setContentPane(contentPane); 

    JLabel lblNewLabel = new JLabel("New label"); 
    StatusBar bar = new StatusBar(); 
    contentPane.add(lblNewLabel, BorderLayout.NORTH); 
    contentPane.add(bar, BorderLayout.SOUTH); 
} 
} 

回答

3

很多小錯誤,開始用正確的命名的類名...一端與類/空/方法的姓名(或名稱)

enter image description here

細微的變化使用java的保留字(現它爲我的作品),一個我的失誤對揮杆的規則,我就坐下來setPreferredSize(new Dimension(400, 300));,讓兒童返回PREFERREDSIZE集裝箱

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 
import javax.swing.border.EmptyBorder; 

public class MyToolBar extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private JPanel contentPane; 

    public class StatusBarX extends JPanel implements MouseListener, MouseMotionListener { 

     private static final long serialVersionUID = 1L; 
     private Polygon resizeCorner = new Polygon(); 
     private int offsetX; 
     private int offsetY; 
     private Dimension offsetSize; 
     private Cursor resizeCursor = new Cursor(Cursor.SE_RESIZE_CURSOR); 
     private Cursor defaultCursor = new Cursor(Cursor.DEFAULT_CURSOR); 

     public StatusBarX() { 
      super(); 
      setPreferredSize(new Dimension(200, 40)); 
      this.addMouseListener(this); 
      this.addMouseMotionListener(this); 
     } 

     private void createResizeHandle() { 
      resizeCorner.reset(); 
      resizeCorner.addPoint(getWidth() - 2, getHeight() - 2); 
      resizeCorner.addPoint(getWidth() - 40, getHeight() - 2); 
      resizeCorner.addPoint(getWidth() - 2, getHeight() - 40); 
     } 

     @Override 
     public void paint(Graphics g) { 
      super.paint(g); 
      Graphics2D g2; 
      g2 = (Graphics2D) g; 
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); 
      g2.setColor(Color.red); 
      createResizeHandle(); 
      g2.drawPolygon(resizeCorner); 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 
      if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != 0) { 
       int width = (int) (this.offsetSize.getWidth() - this.offsetX + e.getXOnScreen()); 
       int height = (int) (this.offsetSize.getHeight() - this.offsetY + e.getYOnScreen()); 
       this.getRootPane().getParent().setSize(width, height); 
       createResizeHandle(); 
      } 
     } 

     @Override 
     public void mouseMoved(MouseEvent e) { 
      if (resizeCorner.contains(e.getX(), e.getY())) { 
       setCursor(resizeCursor); 
      } else { 
       setCursor(defaultCursor); 
      } 
     } 

     @Override 
     public void mouseClicked(MouseEvent arg0) { 
     } 

     @Override 
     public void mouseEntered(MouseEvent arg0) { 
     } 

     @Override 
     public void mouseExited(MouseEvent arg0) { 
     } 

     @Override 
     public void mousePressed(MouseEvent e) { 
      if (resizeCorner.contains(e.getX(), e.getY())) { 
       this.offsetX = e.getXOnScreen(); 
       this.offsetY = e.getYOnScreen(); 
       this.offsetSize = this.getRootPane().getParent().getSize(); 
      } 
     } 

     @Override 
     public void mouseReleased(MouseEvent arg0) { 
     } 
    } 

    public MyToolBar() { 
     JLabel lblNewLabel = new JLabel("New label"); 
     StatusBarX bar = new StatusBarX(); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 
     contentPane.add(lblNewLabel, BorderLayout.NORTH); 
     contentPane.add(bar, BorderLayout.SOUTH); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocation(100, 100); 
     setPreferredSize(new Dimension(400, 300)); 
     add(contentPane); 
     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        MyToolBar frame = new MyToolBar(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
} 
3

標準調整大小是一個帶有白色邊框的透明窗口(可能在不同的系統和外觀上有所不同)。

使用Windows XP時,標準是立即調整頂層組件(框架,對話框等)的大小。 LAF是什麼並不重要。

一般來說,其他組件沒有內置調整大小的功能。我能想到的唯一例外是JInternalFrame。在這種情況下,它確實支持組件的「輪廓」大小調整。

所以,如果你想添加這種類型的功能到你的組件,那麼你需要看看內部框架UI來找到調整大小的代碼。

我猜測代碼會在拖動開始時顯示玻璃窗格,然後在玻璃平面上執行大綱自定義繪製。然後在mouseReleased框架大小將被改變。

如果您有興趣,Component Resizing顯示我如何爲任何組件調整大小。它會立即調整大小,而不是調整大小。