2016-05-20 8 views
1

Wenn ich eine Aktion ausführen möchte, kann ich bei Betätigung einer Taste einen ActionListener verwenden. Aber jetzt, wenn ich mehr Tasten aktivieren möchte, indem ich die Maustaste gedrückt halte. Wie kann ich das umsetzen?Java Swing-GUI. Aktivieren/Feuern weiterer Tasten bei gedrückter Maustaste

Dank

+1

Abonnieren Sie die Schaltflächen zum 'MouseOver' Ereignis (oder etwas Ähnliches). Wenn das Ereignis ausgelöst wird und die Maustaste gedrückt ist, führen Sie Ihre Logik aus. – npinti

+0

Oh okay, danke. – Alex

Antwort

3

für eine Änderung des isPressed Zustand ein ChangeListener die Tasten ButtonModel, überwacht hinzufügen.

Der Trick dann einen Prozess einrichten, die die anderen Komponenten dann hinzufügen können, in diesem einfachen Beispiel, ich habe eine Schaukel Timer verwendet haben, die in etwa 40 neue Komponenten eine zweite hinzufügen, während die Taste gedrückt wird

public class TestPane extends JPanel { 

    private Timer timer = new Timer(25, new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      add(new JButton("...")); 
      revalidate(); 
      repaint(); 
     } 
    }); 

    public TestPane() { 
     JButton btn = new JButton("Help"); 
     btn.getModel().addChangeListener(new ChangeListener() { 
      @Override 
      public void stateChanged(ChangeEvent e) { 
       ButtonModel model = (ButtonModel) e.getSource(); 
       if (model.isPressed()) { 
        timer.start(); 
       } else { 
        timer.stop(); 
       } 
      } 
     }); 
     add(btn); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(200, 200); 
    } 

} 

Danke, das funktioniert, wenn ich einen Knopf drücke. Aber wenn ich einen Knopf drücken und die Maus mit gedrückter Maustaste auf einen anderen Knopf bewegen die secound Schaltfläche tut nichts

Nur so sind wir klar, ich denke, das ist eine schlechte Benutzererfahrung, aber das ist mir

public class Test { 

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

    private boolean pressed = false; 

    public Test() { 
     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 { 

     public TestPane() { 
      add(makeButton("1")); 
      add(makeButton("2")); 
     } 

     protected JButton makeButton(String text) { 
      JButton btn = new JButton(text); 
      MouseAdapter ma = new MouseAdapter() { 
       @Override 
       public void mousePressed(MouseEvent e) { 
        pressed = true; 
       } 

       @Override 
       public void mouseReleased(MouseEvent e) { 
        pressed = false; 
       } 

       @Override 
       public void mouseEntered(MouseEvent e) { 
        if (pressed) { 
         JButton btn = (JButton) e.getComponent(); 
         System.out.println("Entered " + btn.getText()); 
         btn.doClick(); 
        } 
       } 

      }; 
      btn.addMouseListener(ma); 
      btn.addMouseMotionListener(ma); 
      return btn; 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

    } 

} 
+0

Danke, das funktioniert, wenn ich einen Button drücke. Aber wenn ich eine Taste drücke und die Maus mit gedrückter Maustaste zu einer anderen Taste bewege, macht die zweite Taste nichts – Alex

+0

OP möchte keine neuen Tasten erstellen, sondern einen * ziehen *, der jede Taste auslöst, die er bewegt. –

+0

@ Jean-BaptisteYunès * "gedrückt Ich kann einen ActionListener benutzen. Aber jetzt möchte ich weitere Buttons aktivieren, indem ich die Maustaste gedrückt halte" * Verzeih mir, wenn die Frage unklar ist – MadProgrammer

0

@npinti Jetzt kann ich eine Aktion für jede Schaltfläche, über die ich mit meiner Maus schweben. Aber wenn ich versuche, die Implementierung zu ändern, so dass die Aktion nur ausgeführt wird, wenn die Maus auch angeklickt wird, funktioniert die Aktion nur, wenn ich einen Knopf drücke und über die gleiche Taste erneut. `JButton b = new JButton(); if (a == 1) { b.setBackground (Farbe.WHITE);
} sonst { b.setBackground (Color.BLACK);
} b.addActionListener (new Action() { public void actionPerformed (Action arg0) { matrix.activate (x, y); } });

b.addMouseListener(new MouseListener() { 
      int pressed =0; 
      @Override 
      public void mouseReleased(MouseEvent e) { 
       pressed =0; 

      } 

      @Override 
      public void mousePressed(MouseEvent e) { 
       pressed =1; 

      } 

      @Override 
      public void mouseExited(MouseEvent e) { 


      } 

      @Override 
      public void mouseEntered(MouseEvent e) { 
       if (e.getComponent().equals(b) && pressed ==1){ 
        b.setBackground(Color.BLACK); 
       } 

      } 
      public void mouseClicked(MouseEvent e) { 
       pressed =1; 

      } 
     });` 
+0

Basierend auf diesem Beispiel würde nur die ursprüngliche Schaltfläche, auf die geklickt wurde, wissen, wenn sie gedrückt wird – MadProgrammer

0

Fang mouseEntered auf Tasten und, wenn eine globale boolean pressed wahr ist (es auf true gesetzt, wenn Sie eine Maustaste und falsch auf Freigabe drücken), eine Aktion mit JButton.doClick() Feuer, das ein Klickereignis simuliert auf die Taste.

+0

Vielen Dank. Dies könnte das Problem lösen – Alex

+0

Aber wie implementiere ich die globale Klickprüfung? – Alex

+0

Wählen Sie, wie die Klickprüfung gestartet werden soll. Auf Knopfdruck drücken? An jeder Stelle nur durch Drücken der Maus? ... –