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);
}
}
}
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
Oh okay, danke. – Alex