Java - 如何创建可移动菜单

时间:2013-11-15 16:27:21

标签: java

有没有人有任何示例代码来制作可拖动的菜单?

我是Java的新手,我正试图找到一种方法来制作一个可用鼠标拖动的菜单。就像很多节目一样。您可以在屏幕上拖动顶部菜单栏,以便将其放在其他位置。我认为Java也可以这样做,因为我看到一些我认为用Java编写的应用程序也是这样做的。

问题:如何在Java中的JFrame中创建可拖动菜单?

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;

public class MyExample extends JFrame {

    public MyExample() {
        initUI();
    }

    public final void initUI() {

        JMenuBar menubar = new JMenuBar();

        JMenu file = new JMenu("File");
        file.setMnemonic(KeyEvent.VK_F);

        JMenuItem eMenuItem = new JMenuItem("Exit");
        eMenuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                System.exit(0); //exit the system
            }
        });

        file.add(eMenuItem);
        menubar.add(file);
        setJMenuBar(menubar);

        setTitle("My Menu");
        setSize(300, 100);
        setLocationRelativeTo();  //I tried draggable
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
                MyExample e = new MyExample();
                e.setVisible(true);
    }
}

我希望能够将菜单从JFrame顶部拖到窗外的另一个位置并将其保留在那里。我已经使用了工具栏并且工作得很好,但我试图看看是否可以通过菜单完成。如果您查看任何软件应用程序,通常是文件位置旁边的可抓取区域。您可以单击并拖动该区域。

 ImageIcon icon = new ImageIcon(getClass().getResource("10cd.jpg"));
  JMenu file1 = new JMenu("File");
  file1.setMnemonic(KeyEvent.VK_F);
  JMenu file2 = new JMenu("Open");
  file2.setMnemonic(KeyEvent.VK_F);
  JMenu file3 = new JMenu("A");
  file3.setMnemonic(KeyEvent.VK_F);
  JMenu file4 = new JMenu("B");
  file4.setMnemonic(KeyEvent.VK_F);
  JMenu file5 = new JMenu("C");
  file5.setMnemonic(KeyEvent.VK_F);
  JMenu file6 = new JMenu("D");
  file6.setMnemonic(KeyEvent.VK_F);

  JMenuItem eMenuItem1a = new JMenuItem("File 1"/*, icon*///);
  /*eMenuItem1a.setMnemonic(KeyEvent.VK_E);
  eMenuItem1a.setToolTipText("Exit application");

  JMenuItem eMenuItem1b = new JMenuItem("File 2"/*, icon*///);
 /* eMenuItem1b.setMnemonic(KeyEvent.VK_E);
  eMenuItem1b.setToolTipText("Exit application");

  JMenuItem eMenuItem1c = new JMenuItem("File 3"/*, icon*///);
 /* eMenuItem1c.setMnemonic(KeyEvent.VK_E);
  eMenuItem1c.setToolTipText("Exit application");

  JMenuItem eMenuItem2 = new JMenuItem("Exit"/*, icon*///);
 /* eMenuItem2.setMnemonic(KeyEvent.VK_E);
  eMenuItem2.setToolTipText("Exit application");

  JMenuItem eMenuItem3 = new JMenuItem("Exit"/*, icon*///);
  /*eMenuItem3.setMnemonic(KeyEvent.VK_E);
  eMenuItem3.setToolTipText("Exit application");

  JMenuItem eMenuItem4 = new JMenuItem("Exit"/*, icon*///);
  /*eMenuItem4.setMnemonic(KeyEvent.VK_E);
  eMenuItem4.setToolTipText("Exit application");

  eMenuItem1a.addActionListener(new myListenerOne());
  eMenuItem1b.addActionListener(new myListenerTwo());
  eMenuItem1c.addActionListener(new myListenerThree());
  eMenuItem2.addActionListener(new myListenerOne());
  eMenuItem3.addActionListener(new myListenerTwo());
  eMenuItem4.addActionListener(new myListenerThree());

  file1.add(eMenuItem1a);
  file1.add(eMenuItem1b);
  file1.add(eMenuItem1c);
  file2.add(eMenuItem2);
  file3.add(eMenuItem3);
  file4.add(eMenuItem4);

  menubar.add(file1);
  menubar.add(file2);
  menubar.add(file3);
  menubar.add(file4);
  menubar.add(file5);
  menubar.add(file6);

  setJMenuBar(menubar);

//下面的Actionlisteners

class myListenerOne implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Action Class Listener 1");
        System.exit(0);
    }
}

class myListenerTwo implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Action Class Listener 2");
        System.exit(0);
    }
}

class myListenerThree implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Action Class Listener 3");
        System.exit(0);
    }
}

这是我今天早上忘记包含的另一个菜单示例。生病了,实际上并没有想到它。无论如何,我想知道的是如果菜单可以设置为可移动菜单,那么当你点击它并拖动它时它可以移动到框架中的任何位置。我已经在我使用的一些java应用程序上看到了这个,但是暂时还没有看到它。

import javax.swing.JToolBar;
import javax.swing.JButton;
import javax.swing.ImageIcon;

import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

import java.net.URL;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ToolBarDemo extends JPanel
                         implements ActionListener {
    protected JTextArea textArea;
    protected String newline = "\n";
    static final private String PREVIOUS = "previous";
    static final private String UP = "up";
    static final private String NEXT = "next";

    public ToolBarDemo() {
        super(new BorderLayout());

        //Create the toolbar.
        JToolBar toolBar = new JToolBar("Still draggable");
        addButtons(toolBar);

        //Create the text area used for output.  Request
        //enough space for 5 rows and 30 columns.
        textArea = new JTextArea(5, 30);
        textArea.setEditable(false);
        JScrollPane scrollPane = new JScrollPane(textArea);

        //Lay out the main panel.
        setPreferredSize(new Dimension(450, 130));
        add(toolBar, BorderLayout.PAGE_START);
        add(scrollPane, BorderLayout.CENTER);
    }

    protected void addButtons(JToolBar toolBar) {
        JButton button = null;

        //first button
        button = makeNavigationButton("Back24", PREVIOUS,
                                      "Back to previous something-or-other",
                                      "Previous");
        toolBar.add(button);

        //second button
        button = makeNavigationButton("Up24", UP,
                                      "Up to something-or-other",
                                      "Up");
        toolBar.add(button);

        //third button
        button = makeNavigationButton("Forward24", NEXT,
                                      "Forward to something-or-other",
                                      "Next");
        toolBar.add(button);
    }

    protected JButton makeNavigationButton(String imageName,
                                           String actionCommand,
                                           String toolTipText,
                                           String altText) {
        //Look for the image.
        String imgLocation = imageName + ".gif";
        URL imageURL = ToolBarDemo.class.getResource(imgLocation);

        //Create and initialize the button.
        JButton button = new JButton();
        button.setActionCommand(actionCommand);
        button.setToolTipText(toolTipText);
        button.addActionListener(this);

        if (imageURL != null) {                      //image found
            button.setIcon(new ImageIcon(imageURL, altText));
        } else {                                     //no image found
            button.setText(altText);
            System.err.println("Resource not found: "
                               + imgLocation);
        }

        return button;
    }

    public void actionPerformed(ActionEvent e) {
        String cmd = e.getActionCommand();
        String description = null;

        // Handle each button.
        if (PREVIOUS.equals(cmd)) { //first button clicked
            description = "taken you to the previous <something>.";
        } else if (UP.equals(cmd)) { // second button clicked
            description = "taken you up one level to <something>.";
        } else if (NEXT.equals(cmd)) { // third button clicked
            description = "taken you to the next <something>.";
        }

        displayResult("If this were a real app, it would have "
                        + description);
    }

    protected void displayResult(String actionDescription) {
        textArea.append(actionDescription + newline);
        textArea.setCaretPosition(textArea.getDocument().getLength());
    }

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event dispatch thread.
     */
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("Doug's Test ToolBarDemo!!!!");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Add content to the window.
        frame.add(new ToolBarDemo());

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event dispatch thread:
        //creating and showing this application's GUI.
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                //Turn off metal's use of bold fonts
            UIManager.put("swing.boldMetal", Boolean.FALSE);
            createAndShowGUI();
            }
        });
    }
}

以下代码将JToolBar添加到框架中。我喜欢这个,因为它是可拖动的,但它看起来不同于常规菜单。如果您可以将菜单设置为可拖动,我会更感兴趣。

1 个答案:

答案 0 :(得分:2)

如果您不想创建自己的浮动窗口,请尝试使用JToolBar。

http://docs.oracle.com/javase/tutorial/uiswing/components/toolbar.html