Mouslistener造成问题

时间:2015-05-26 00:11:06

标签: java swing mouseevent mouselistener

我已经在我的代码中创建了一个GoInvisible类,它实现了一个鼠标监听器,我尝试使用鼠标按下和鼠标释放的方法让我的框架变得透明,然后在按下并释放时恢复正常框架上的按钮。我正在一个内部类中调用这些方法,这个方法实现了一个处理按钮事件的动作监听器,但由于某种原因,当我运行应用程序时,框架永远不会出现。

这是框架代码;

public class FNAFrame extends JFrame {

public FNAFrame()
{
    super ("FNA Comments Generator");
    setLayout(new BorderLayout());

    setResizable(false);
    TextFrame comps = new TextFrame();
    add(comps);
    pack();
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}


/**
 * @param args the command line arguments
 */
  public static void main(String[] args) {

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
                // 
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) 
            {
                ex.printStackTrace();
            }


            new FNAFrame();

        }
    });
  }  
} // end of class FNA Frame

这是组件类;

public class TextFrame extends JPanel 
{
    private JButton Go_Shadow;

public TextFrame()
{
    super(new GridBagLayout());

    setPreferredSize(new Dimension(300,200));
    setBackground(Color.white);

    init();  
   } // end of class constructor

    private void init()
    { 
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(10,10,10,10);

        // button to display date in textarea
        Go_Shadow = new JButton("Shadow");
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.anchor = GridBagConstraints.WEST;
        add(Go_Shadow, gbc);


        // adding listeners to components
        // registering all components with their respective listeners
        CompHandler compHandler = new CompHandler();
        Go_Shadow.addActionListener(compHandler);
    }

    // class to handle text fields
    private class CompHandler implements ActionListener
    {    
        private MouseEvent me;

        @Override
        public void actionPerformed(ActionEvent e)  
        {
            Object button_command = e.getActionCommand();



                if (button_command.equals("Go_Shadow"))
                { 
                    GoInvisible invisy = new GoInvisible();

                    invisy.mousePressed(me);
                    invisy.mouseReleased(me);    
                }

        }
    } // end component handler class 
} // end of TextFrame class

这是鼠标监听器类

 public class GoInvisible implements MouseListener {


 FNAFrame Parentpane = new FNAFrame();
 TextFrame compPanel = new TextFrame();


@Override
public void mouseClicked(MouseEvent e) {

    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void mousePressed(MouseEvent e) {
    Parentpane.setUndecorated(true);
    Parentpane.setOpacity(0.5f);
    compPanel.setOpaque(true);
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void mouseReleased(MouseEvent e) {
    Parentpane.setUndecorated(false);
    compPanel.setOpaque(true);
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void mouseEntered(MouseEvent e) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void mouseExited(MouseEvent e) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}   
}

1 个答案:

答案 0 :(得分:1)

有一系列问题......

  1. 你需要从你的方法中删除throw new UnsupportedOperationException("Not supported yet.");,这些会导致问题并阻止你的代码执行
  2. 按钮的actionCommand不是"Go_Shadow",它将是按钮的文本,除非您另外指定。
  3. 您不应该使用MouseListenerActionListener添加,而应该监控ButtonModel的状态
  4. 您正在FNAFrame处理程序中创建TextFrameGoInvisible的新实例,这些实例与屏幕上实际存在的实例无关!
  5. 相反,您应该监控ButtonModel的状态,例如......

    Go_Shadow.getModel().addChangeListener(new ChangeListener() {
        @Override
        public void stateChanged(ChangeEvent e) {
            ButtonModel model = (ButtonModel) e.getSource();
            JFrame window = (JFrame) SwingUtilities.getWindowAncestor(TextFrame.this);
            if (model.isArmed() && model.isPressed()) {
                window.setUndecorated(true);
                window.setOpacity(0.5f);
                setOpaque(false);
            } else if (model.isArmed() && !model.isPressed()) {
                setOpaque(true);
                window.setOpacity(1f);
                window.setUndecorated(false);
            }
        }
    });
    

    但是,您仍然会发现这会导致问题,因为框架边框的状态一旦显示就无法更改

    更好的解决方案可能是使用JToggleButton,例如

    public class TextFrame extends JPanel {
    
        private JToggleButton Go_Shadow;
    
        public TextFrame() {
            super(new GridBagLayout());
    
            setPreferredSize(new Dimension(300, 200));
            setBackground(Color.white);
    
            init();
        } // end of class constructor
    
        private void init() {
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.insets = new Insets(10, 10, 10, 10);
    
            // button to display date in textarea
            Go_Shadow = new JToggleButton("Shadow");
            gbc.gridx = 0;
            gbc.gridy = 1;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.anchor = GridBagConstraints.WEST;
            add(Go_Shadow, gbc);
    
            // adding listeners to components
            // registering all components with their respective listeners
            Go_Shadow.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    JFrame window = (JFrame) SwingUtilities.getWindowAncestor(TextFrame.this);
                    Point location = window.getLocation();
                    if (Go_Shadow.isSelected()) {
                        window.dispose();
                        window.setUndecorated(true);
                        window.setOpacity(0.5f);
                        setOpaque(false);
                    } else {
                        window.dispose();
                        window.setOpacity(1f);
                        window.setUndecorated(false);
                        setOpaque(true);
                    }
                    window.setLocation(location);
                    window.setVisible(true);
                }
            });
    
        }
    
    } // end of TextFrame class
    

    您可能希望阅读Code Conventions for the Java TM Programming Language,这样可以让人们更轻松地阅读您的代码并让您阅读其他代码