【问题标题】:ToolTipManager in JavaJava 中的工具提示管理器
【发布时间】:2012-06-23 09:37:23
【问题描述】:

我正在实现一个MVC,并且我想在我看来在JLabel 上有一个JToolTip。我成功了,但现在我想设置解雇和初始计时器。

我阅读了JToolTipTollTipManager 的Javadoc。我在 ToolTipManager 中找到了我想要的东西,但现在我不明白如何使用它。

JToolTip 没有设置为ToolTipManager 并且在他们说的文档中:

管理系统中的所有工具提示。

我真的不明白我应该如何使用ToolTipManager。我的视图应该扩展ToolTipManager 还是我完全误导?

【问题讨论】:

    标签: java swing model-view-controller tooltip


    【解决方案1】:

    ToolTipManager 是一个单例。要使用它,您需要调用一个静态的sharedInstance 方法,该方法返回该类的实例。

    ToolTipManager 管理所有工具提示 - 它是一个全局配置类,对 sharedInstance 所做的更改将应用​​于您应用程序中的每个工具提示。

    【讨论】:

    • 嗯,它也适用于我。但是有没有其他方法可以做到这一点?在我的应用程序中,我希望有两种不同的工具提示行为。在我的 JList 中,它们应该很快消失。但在按钮上它应该持续更长时间。我必须为此使用(奇怪的)鼠标侦听器吗??
    【解决方案2】:

    这是一个展示如何使用 ToolTipManager 的示例:

    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.SwingUtilities;
    import javax.swing.ToolTipManager;
    
    public class TestTooltips {
    
        protected static void initUI() {
            ToolTipManager.sharedInstance().setInitialDelay(0);
            ToolTipManager.sharedInstance().setDismissDelay(500);
            JFrame frame = new JFrame("test");
            JLabel label = new JLabel("Label text");
            label.setToolTipText("My cool nice and fun tooltip");
            frame.add(label);
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    initUI();
                }
            });
        }
    }
    

    【讨论】:

      【解决方案3】:

      不知道您尝试了什么以及您真正想要什么...,您是否通过以下代码成功

      import java.awt.*;
      import java.awt.event.MouseWheelEvent;
      import java.awt.event.MouseWheelListener;
      import javax.swing.*;
      import javax.swing.table.DefaultTableCellRenderer;
      
      public class JScrollableToolTip extends JToolTip {
      
          private static final long serialVersionUID = 1L;
          private final MouseWheelListener mouseWheelListener;
          private final JTextArea tipArea;
      
          public JScrollableToolTip(final int rows, final int columns) {
              setLayout(new BorderLayout());
              mouseWheelListener = createMouseWheelListener();
              tipArea = new JTextArea(rows, columns);
              tipArea.setLineWrap(true);
              tipArea.setWrapStyleWord(true);
              tipArea.setEditable(false);
              LookAndFeel.installColorsAndFont(tipArea, "ToolTip.background",
                      "ToolTip.foreground", "ToolTip.font");
              JScrollPane scrollpane = new JScrollPane(tipArea);
              scrollpane.setBorder(null);
              scrollpane.getViewport().setOpaque(false);
              add(scrollpane);
          }
      
          private MouseWheelListener createMouseWheelListener() {
              return new MouseWheelListener() {
      
                  @Override
                  public void mouseWheelMoved(final MouseWheelEvent e) {
                      JComponent component = getComponent();
                      if (component != null) {
                          tipArea.dispatchEvent(new MouseWheelEvent(tipArea, e.getID(),
                                  e.getWhen(), e.getModifiers(), 0, 0, e.getClickCount(),
                                  e.isPopupTrigger(), e.getScrollType(), e.getScrollAmount(),
                                  e.getWheelRotation()));
                      }
                  }
              };
          }
      
          @Override
          public void addNotify() {
              super.addNotify();
              JComponent component = getComponent();
              if (component != null) {
                  component.addMouseWheelListener(mouseWheelListener);
              }
          }
      
          @Override
          public void removeNotify() {
              JComponent component = getComponent();
              if (component != null) {
                  component.removeMouseWheelListener(mouseWheelListener);
              }
              super.removeNotify();
          }
      
          @Override
          public void setComponent(JComponent c) {
              JComponent component = getComponent();
              if (component != null) {
                  component.removeMouseWheelListener(mouseWheelListener);
              }
              super.setComponent(c);
          }
      
          @Override
          public void setTipText(final String tipText) {
              String oldValue = this.tipArea.getText();
              tipArea.setText(tipText);
              tipArea.setCaretPosition(0);
              firePropertyChange("tiptext", oldValue, tipText);
          }
      
          @Override
          public Dimension getPreferredSize() {
              return getComponent(0).getPreferredSize();
          }
      
          @Override
          public String getTipText() {
              return tipArea == null ? "" : tipArea.getText();
          }
      
          @Override
          protected String paramString() {
              String tipTextString = (tipArea.getText() != null ? tipArea.getText() : "");
              return super.paramString() + ",tipText=" + tipTextString;
          }
      
          //for testing only:
          public static void main(final String args[]) {
              EventQueue.invokeLater(new Runnable() {
      
                  public void run() {
                      try {
                          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                      } catch (Exception e) {
                          e.printStackTrace();
                      }
                      JFrame f = new JFrame("JScrollableToolTip");
                      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                      f.setSize(300, 200);
                      f.setLocationRelativeTo(null);
                      ToolTipManager.sharedInstance().setInitialDelay(500);
                      ToolTipManager.sharedInstance().setDismissDelay(10000);
                      ToolTipManager.sharedInstance().mousePressed(null);
                      JTable table = new JTable(50, 4) {
      
                          private static final long serialVersionUID = 1L;
      
                          @Override
                          public JToolTip createToolTip() {
                              JScrollableToolTip tip = new JScrollableToolTip(3, 20);
                              tip.setComponent(this);
                              return tip;
                          }
                      };
                      table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
      
                          private static final long serialVersionUID = 1L;
      
                          @Override
                          public Component getTableCellRendererComponent(JTable table, Object value,
                                  boolean isSelected, boolean hasFocus, int row, int column) {
                              super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                              setToolTipText("Row " + row + " Column " + column
                                      + "\nUsed to display a 'Tip' for a Component. "
                                      + "Typically components provide api to automate the process of "
                                      + "using ToolTips. For example, any Swing component can use the "
                                      + "JComponent  setToolTipText method to specify the text for a standard tooltip.");
      
                              return this;
                          }
                      });
                      f.add(new JScrollPane(table));
                      f.setVisible(true);
                  }
              });
          }
      }
      

      【讨论】:

      • +1 例如,但我只是在搜索使用ToolTipManager 作为其方法setDismissDelaysetInitialDelay。我的观点已经奏效了。
      • 请注意,可能与您的情况无关,不要将 JToolTip 用于生产代码,对于奇怪的问题,有基于 JWindow +1 的自定义工具提示
      猜你喜欢
      • 2023-03-07
      • 1970-01-01
      • 2015-08-03
      • 2010-10-26
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多