2015-05-26 2 views
0

Я создал класс GoInvisible в своем коде, который реализует прослушиватель мыши, я пытаюсь использовать нажатую мышь, а мышь выпустила методы, чтобы мой кадр стал прозрачным, а затем вернулся к нормальному состоянию на нажмите и отпустите кнопку на кадре. Я вызываю эти методы во внутреннем классе, который реализует прослушиватель действий, который обрабатывает события кнопок, но по какой-то причине, когда я запускаю приложение, кадр никогда не появляется.Mouslistener вызывает проблемы

Код кадра;

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

Вы думаете, что 'throw new UnsupportedOperationException (« Не поддерживается пока »); быть проблемой ...? – MadProgrammer

+0

Также ... вы никогда не добавляете MouseListener или MouseMotionListener в * anything *. т. е. где у вас есть 'addMouseListener (...)' где угодно? –

+1

Вы добавляете MouseListener к некоторым из ваших классов? – Smallware

ответ

1

Есть целый ряд вопросов, ...

  1. Вы должны избавиться от throw new UnsupportedOperationException("Not supported yet."); от ваших методов, это может вызвать проблемы и прекратите выполнение кода
  2. actionCommand вашей кнопки не "Go_Shadow", это будет текст , если вы не указали это иначе.
  3. Вы не должны быть добавление с использованием MouseListener или ActionListener, но вместо этого должны быть контроля за состоянием ButtonModel
  4. Вы создаете новые экземпляры FNAFrame и TextFrame в вашем GoInvisible обработчика, которые не имеют никакого отношения к тем случаям, которые на самом деле находятся на экране!

Вместо этого, вы должны следить за состоянием 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, это облегчит для людей чтение вашего кода и чтение вами других.

+0

спасибо большое madpro .. не могу попробовать, теперь нужно идти на работу, но это определенно выглядит многообещающим – Juice

+0

, поэтому я попробовал его в своем тестовом программном обеспечении, он отлично работает, но когда я подключаю его к своему программному обеспечению, кадр не отображается и выплескивает ошибки нулевого указателя. эти ошибки нулевого указателя указывают на строку: -> Go_Shadow.addActionListener (новый ActionListener() {и -> Point Location = window.getLocation(); – Juice

+0

Без рабочего примера я бы угадал компонент, который вы передаете 'SwingUtilities.getWindowAncestor' не привязан ни к одному окну – MadProgrammer