LookAndFeel行为之间的区别

时间:2014-07-07 21:12:22

标签: java swing jpopupmenu windows-look-and-feel

我创建了一个JPopupmenu并添加了一个JTextField。当我使用金属或灵气时,一切都很好。问题是当我将LookAndFeel切换到Windows时。我不能按ALT键,因为如果按下此键,JPopupmenu将隐藏。

我可以使用正确的ALT在Windows LookAndFeel中编写国家标志吗?

import javax.swing.*;
import java.awt.event.*;

public class Popup extends JFrame {

    JPopupMenu popup;
    JPanel panel;
    JTextField field;

    public Popup(){
        setSize(500,400);
        try {
            //UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        } catch (ClassNotFoundException | InstantiationException
                | IllegalAccessException | UnsupportedLookAndFeelException e1) {
            e1.printStackTrace();
        }
        SwingUtilities.updateComponentTreeUI(this);

        popup = new JPopupMenu();
        field = new JTextField(10);
        popup.add(field);
        JButton button = new JButton("Options");
        button.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                popup.show(e.getComponent(), e.getX(), e.getY());
            }
        });        

        panel = new JPanel();
        panel.add(button);
        add(panel);
    }

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

}

1 个答案:

答案 0 :(得分:4)

JPopupMenu有一套非常具体的操作要求,是的,它们确实在外观和感觉之间发生变化,这就是重点。

您可以使用未修饰的JFrame创建自己的弹出窗口。这里的诀窍是尽可能多地模仿弹出窗口,例如,当另一个组件获得焦点时自动关闭,使用转义键关闭弹出窗口的能力......等等......

这只是提供概念验证的一个简单示例,我个人还为转义键添加了一个键绑定,某种监听器接口允许搜索窗格请求弹出窗口被取消和当窗口可见时自动聚焦某些组件的能力,但那只是我......

Popup

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestPopup {

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

    public TestPopup() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JButton show;

        public TestPane() {
            setLayout(new GridBagLayout());
            show = new JButton("...");
            show.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    PopupWindow window = new PopupWindow();
                    window.show(show, 0, show.getHeight());
                }
            });
            add(show);
        }

    }

    public class SearchPane extends JPanel {

        private JList list;
        private JTextField search;

        public SearchPane() {
            setLayout(new BorderLayout());
            list = new JList();
            list.setPrototypeCellValue("This is just a test");
            list.setVisibleRowCount(20);
            search = new JTextField(10);
            add(new JScrollPane(list));
            add(search, BorderLayout.SOUTH);
        }

    }

    public class PopupWindow extends JFrame {

        private SearchPane searchPane;

        public PopupWindow() {
            setUndecorated(true);
            setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            addWindowFocusListener(new WindowFocusListener() {

                @Override
                public void windowGainedFocus(WindowEvent e) {
                }

                @Override
                public void windowLostFocus(WindowEvent e) {
                    dispose();
                }
            });
            searchPane = new SearchPane();
            add(searchPane);
            pack();
        }

        public void show(JComponent parent, int x, int y) {
            Point point = new Point(x, y);
            SwingUtilities.convertPointToScreen(point, parent);
            setLocation(point);
            setVisible(true);
        }

    }

}