2014-10-27 16 views
-1

我想只有菜單欄和可移動的主窗口。如何使窗口全部(1)無標題(2)可移動(3)僅限於菜單欄[如何通過菜單欄監聽鼠標事件]

這將是更好的有一些窗口框架,拖動。但看起來在Java中是不可能的。所以,我想直接聽鼠標事件,但不能聽到他們:

package tests.javax.swing; 

import java.awt.Dimension; 
import java.awt.Menu; 
import java.awt.MenuBar; 
import java.awt.MenuItem; 
import java.awt.Point; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

public class Try_NarrowWindow { 

    private static final Logger log = LoggerFactory.getLogger(Try_NarrowWindow.class); 

    public static void main(String[] args) { 




     SwingUtilities.invokeLater(new Runnable() { 

      @SuppressWarnings({ "serial" }) 
      @Override 
      public void run() { 


       JFrame frame = new JFrame() { 

        Point mouseDownCompCoords; 

        { 

        setDefaultCloseOperation(EXIT_ON_CLOSE); 
        setResizable(false); 
        setUndecorated(true); 

        setMenuBar(new MenuBar() {{ 

         add(new Menu("File") {{ 

          add(new MenuItem("Open...")); 
          add(new MenuItem("Close")); 
          addSeparator(); 
          add(new MenuItem("Exit") {{ 
           addActionListener(new ActionListener() { 
            @Override 
            public void actionPerformed(ActionEvent e) { 
             dispose(); 
            } 
           }); 
          }}); 

         }}); 

         add(new Menu("Edit") {{ 

          add(new MenuItem("Copy")); 
          add(new MenuItem("Cut")); 
          add(new MenuItem("Paste")); 

         }}); 


        }}); 


        addMouseListener(new MouseAdapter() { 

         public void mouseReleased(MouseEvent e) { 
          log.info("mouseReleased({})", e); 
          mouseDownCompCoords = null; 
         } 
         public void mousePressed(MouseEvent e) { 
          log.info("mousePressed({})", e); 
          mouseDownCompCoords = e.getPoint(); 
         } 
        }); 

        addMouseMotionListener(new MouseMotionAdapter() { 
         public void mouseDragged(MouseEvent e) { 
          log.info("mouseDragged({})", e); 
          Point currCoords = e.getLocationOnScreen(); 
          setLocation(currCoords.x - mouseDownCompCoords.x, currCoords.y - mouseDownCompCoords.y); 
         } 
        }); 


       }}; 


       frame.setLocation(0,0); 
       frame.pack(); 
       frame.setSize(new Dimension((int)Toolkit.getDefaultToolkit().getScreenSize().getWidth()*2/3, frame.getHeight())); 
       frame.setVisible(true); 

      } 
     }); 

    } 

} 

回答

4

退房Moving Windows

假設你必須在框架和菜單條的引用,所述ComponentMover類可以提供該功能與一個單一的代碼行:

ComponentMover cm = new ComponentMover(frame, menuBar); 

ComponentMover類爲s通用類移動拖動的任何組件,可以是桌面上的框架,也可以是面板上的組件。

+0

'MenuBar'不'擴展Component'。 – 2014-10-28 07:12:09

+1

@SuzanCioc,什麼?不要在Swing應用程序中使用AWT組件。 Swing組件以「J」開頭。 – camickr 2014-10-28 14:02:43

1

我在一個應用程序我做了最近做了這一點。我所做的是將MouseInputAdapter添加到背景中,在我的情況下,JPanel所有組件都坐在上面。然後,如果您點擊窗口中不是另一個組件的任何位置,則點擊會「穿過」到後臺,並且輸入適配器已將其獲取,從而允許拖動整個窗口。

爲了完成這項工作,您必須將輸入適配器添加爲MouseListener和MouseMotionListener。

這裏的控制器:

GuiController(SView sView, Window win) 
    { 
     view = sView; 
     ... 
     DragFrame dragListener = new DragFrame(win); 
     view.addMouseListener(dragListener); 
     view.addMouseMotionListener(dragListener); 
    } 

窗口是聽者需要移動頂層窗口。它實際上是一個我稱爲setUndecorated(true);的JFrame。 SView是一種JPanel的:

public class SView extends javax.swing.JPanel 
{ ... 

我輸入適配器:

private static class DragFrame extends MouseInputAdapter 
    { 
     private final Window window; 
     int originalX; 
     int originalY; 
     int frameX; 
     int frameY; 

     public DragFrame(Window win) 
     { 
     if(win == null) throw new IllegalArgumentException( 
       "window cannot be null here."); 
     window = win; 
     } 

     @Override 
     public void mousePressed(MouseEvent e) { 
     Point loc = window.getLocationOnScreen(); 
     frameX = loc.x; 
     frameY = loc.y; 
     originalX = e.getXOnScreen(); 
     originalY = e.getYOnScreen(); 
//   System.out.println(this); 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) 
     { 
     int newX = frameX + e.getXOnScreen() - originalX; 
     int newY = frameY + e.getYOnScreen() - originalY; 
     window.setLocation(newX, newY); 
//   System.out.println(this); 
     } 

     @Override 
     public String toString() 
     { 
     return "DragFrame{" + "originalX=" + originalX + 
       ", originalY=" + originalY + ", frameX=" + frameX + 
       ", frameY=" + frameY + '}'; 
     }  
    } 
相關問題