2012-05-27 58 views
2

我创建了一个'日期选择器'组件,它只是一个控制器(JComponent)和一个显示器(JPopupMenu扩展)。我希望显示弹出窗口在用户使用箭头控制日期时保持显示。我试着拨popup.show(...)mouseReleased按钮试图重置弹出窗口,但它不像往常一样隐藏。如何在保持JPopupMenu的通常行为的同时实现此目标?如何保持JPopupMenu关闭?

当然我可以使用JWindow,但后来我不得不担心使用焦点等模拟显示/隐藏行为,我非常想避免这种行为。

谢谢。 :)

enter image description here

SSCCEE

import java.awt.Dimension; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.*; 

public class PopupSSCCE { 

    private JFrame frame = new JFrame(); 
    private JPanel controller = new JPanel(); 
    private JLabel controllerLabel = new JLabel("Controller"); 
    private JLabel display = new JLabel("Display"); 
    private JPopupMenu popup = new JPopupMenu(); 
    private JButton prev = new JButton("<"); 
    private JButton next = new JButton(">"); 

    private PopupSSCCE() { 
     controllerLabel.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseReleased(MouseEvent e) { 
       if (controllerLabel.contains(e.getPoint())) 
        popup.show(controllerLabel, -50, controllerLabel.getHeight()); 
      } 
     }); 

     frame.setPreferredSize(new Dimension(250, 300)); 
     popup.setPreferredSize(new Dimension(200, 200)); 
     controller.setPreferredSize(new Dimension(200, 50)); 
     prev.setPreferredSize(new Dimension(50, 50)); 
     next.setPreferredSize(new Dimension(50, 50)); 
     controllerLabel.setPreferredSize(new Dimension(100, 50)); 

     controller.add(prev); 
     controller.add(controllerLabel); 
     controller.add(next); 
     popup.add(display); 
     frame.getContentPane().add(controller); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     new PopupSSCCE(); 
    } 
} 
+1

的[SSCCE]( http://sscce.org/)比截图更有用。 –

+0

@AndrewThompson确定SSCCE会很有用,但从应用程序中提取组件并不容易。如果没有SSCCE,建议的方法肯定会很容易。 – rtheunissen

+0

我(一般)不建议任何东西,除非我可以先在代码中测试它。特别是我以前没有尝试过的'有点不同寻常'。嘿,但这是你的问题和你的选择。 –

回答

3
  • 不使用JPopupPopup容器作为基地non_homework代码,

  • Java4不可能管理“保持在屏幕上弹出”f ROM的JComboBox,JMenu的,JPopupMenu的,more here

  • 使用存在和non_buggy代码由ToedterSwingX通过kleopatra

  • 重要作出不尝试重新发明轮子