Swing/PressAndHoldButton のバックアップソース(No.9)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- バックアップ を表示
- Swing/PressAndHoldButton へ行く。
- 1 (2011-04-27 (水) 19:19:08)
- 2 (2013-01-12 (土) 21:44:48)
- 3 (2014-03-27 (木) 17:57:20)
- 4 (2014-11-19 (水) 20:16:50)
- 5 (2014-11-21 (金) 18:11:05)
- 6 (2015-12-18 (金) 16:30:28)
- 7 (2017-06-13 (火) 15:43:22)
- 8 (2017-11-07 (火) 13:02:39)
- 9 (2018-02-24 (土) 19:51:30)
- 10 (2019-06-14 (金) 20:37:19)
- 11 (2021-02-25 (木) 10:47:26)
--- category: swing folder: PressAndHoldButton title: JPopupMenuをボタンの長押しで表示 tags: [JToolBar, JButton, JPopupMenu, MouseListener, GridLayout, Timer] author: aterai pubdate: 2009-01-26T13:29:29+09:00 description: JToolBarに、長押しでJPopupMenu、クリックで選択されたメニューを表示するボタンを追加します。 image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTRIzHMLNI/AAAAAAAAAgs/0_PwsyZOl-I/s800/PressAndHoldButton.png hreflang: href: http://java-swing-tips.blogspot.com/2014/03/long-pressing-jbutton-to-get-jpopupmenu.html lang: en --- * 概要 [#summary] `JToolBar`に、長押しで`JPopupMenu`、クリックで選択されたメニューを表示するボタンを追加します。 #download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTRIzHMLNI/AAAAAAAAAgs/0_PwsyZOl-I/s800/PressAndHoldButton.png) * サンプルコード [#sourcecode] #code(link){{ class PressAndHoldHandler extends AbstractAction implements MouseListener { public final JPopupMenu pop = new JPopupMenu(); public final ButtonGroup bg = new ButtonGroup(); private AbstractButton arrowButton; private final Timer holdTimer = new Timer(1000, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("InitialDelay(1000)"); if (arrowButton != null && arrowButton.getModel().isPressed() && holdTimer.isRunning()) { holdTimer.stop(); pop.show(arrowButton, 0, arrowButton.getHeight()); pop.requestFocusInWindow(); } } }); public PressAndHoldHandler() { super(); holdTimer.setInitialDelay(1000); pop.setLayout(new GridLayout(0, 3, 5, 5)); for (MenuContext m: makeMenuList()) { AbstractButton b = new JRadioButton(m.command); b.setActionCommand(m.command); b.setForeground(m.color); b.setBorder(BorderFactory.createEmptyBorder()); b.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println(bg.getSelection().getActionCommand()); pop.setVisible(false); } }); pop.add(b); bg.add(b); } } private List<MenuContext> makeMenuList() { return Arrays.asList( new MenuContext("BLACK", Color.BLACK), new MenuContext("BLUE", Color.BLUE), new MenuContext("CYAN", Color.CYAN), new MenuContext("GREEN", Color.GREEN), new MenuContext("MAGENTA", Color.MAGENTA), new MenuContext("ORANGE", Color.ORANGE), new MenuContext("PINK", Color.PINK), new MenuContext("RED", Color.RED), new MenuContext("YELLOW", Color.YELLOW)); } @Override public void actionPerformed(ActionEvent e) { System.out.println("actionPerformed"); if (holdTimer.isRunning()) { ButtonModel model = bg.getSelection(); if (model != null) { System.out.println(model.getActionCommand()); } holdTimer.stop(); } } @Override public void mousePressed(MouseEvent e) { System.out.println("mousePressed"); Component c = e.getComponent(); if (SwingUtilities.isLeftMouseButton(e) && c.isEnabled()) { arrowButton = (AbstractButton) c; holdTimer.start(); } } @Override public void mouseReleased(MouseEvent e) { holdTimer.stop(); } @Override public void mouseExited(MouseEvent e) { if (holdTimer.isRunning()) { holdTimer.stop(); } } @Override public void mouseEntered(MouseEvent e) { /* not needed */ } @Override public void mouseClicked(MouseEvent e) { /* not needed */ } } }} * 解説 [#explanation] - 長押し -- ボタンクリックが`1000`ミリ秒以上継続されると、`JRadioButton`を配置した`JPopupMenu`を表示 --- `JPopupMenu`のレイアウトを`pop.setLayout(new GridLayout(0, 3))`で変更し、`JRadioButton`を`3`列並べて表示 - シングルクリック -- 現在選択されている`JRadioButton`の色をコンソールに出力 * 参考リンク [#reference] - [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/Timer.html#setInitialDelay-int- Timer#setInitialDelay(...) (Java Platform SE 8)] * コメント [#comment] #comment #comment