ToolTip scrollen: Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen
(Änderung 4462 von AndreUhres (Diskussion) wurde rückgängig gemacht.)
K (L-ectron-X verschob die Seite JScrollableToolTip nach ToolTip scrollen)
 
(4 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 
JScrollableToolTip
 
JScrollableToolTip
  
Dieser Quellcode eines "scrollable tooltip" enthält eine "main" Methode zum Testen und um zu zeigen, wie wir "JScrollableToolTip" benutzen können.
+
[[Datei:JScrollableToolTip.jpg]]
  
Wir können die Quellkomponente im Konstruktor übergeben. In dem Fall wird die Komponente an das Mausrad gebunden, so dass wir den Tooltip "scrollen" können, sogar wenn die Maus noch über der Quellkomponente ist. Damit lösen wir gleichzeitig das Problem, das entsteht, wenn der Tooltip einer Komponente ausserhalb der Grenzen dieser Komponente erscheint: wenn wir in dem Fall die Maus von der Komponente zum Tooltip hin bewegen, um nach unten "scrollen" zu können, verschwindet der Tooltip!
+
Dieser Quellcode eines "scrollable tooltip" enthält eine main()-Methode zum Testen, um zu zeigen, wie wir die [[Klasse]] "JScrollableToolTip" benutzen können.
 +
 
 +
Wir können die Quellkomponente im [[Konstruktor (Java)]] übergeben (im Beispiel eine {{JAPI|JTable}}). In dem Fall wird die Komponente an das Mausrad gebunden, so dass wir den {{JAPI|JTooltip}} "scrollen" können, sogar wenn die Maus noch über der Quellkomponente ist. Damit lösen wir gleichzeitig das Problem, das entsteht, wenn der Tooltip einer Komponente außerhalb der Grenzen dieser Komponente erscheint: wenn wir in dem Fall die Maus von der Komponente zum Tooltip hin bewegen, um nach unten "scrollen" zu können, verschwindet der Tooltip!
  
 
Im Fall eines "mouseWheelMoved" über der Quellkomponente, wird ein "reset" des "DismissDelay" ausgelöst.
 
Im Fall eines "mouseWheelMoved" über der Quellkomponente, wird ein "reset" des "DismissDelay" ausgelöst.
  
ANMERKUNG für Tooltip in einer JTable:
+
'''ANMERKUNG für Tooltip in einer JTable:'''
Wenn wir "JScrollableToolTip" für die Zellen einer JTable benutzen möchten, dann müssen wir wissen, dass der "cell renderer" nur indirekt betroffen ist. In erster Linie ist die JTable für den Tooltip verantwortlich. JTable benutzt lediglich den Text vom Renderer. Also müssen wir JTable#createTooltip() überschreiben um eine Instanz von "JScrollableToolTip" zurückzugeben und nicht die Methode "createTooltip" der "renderer component" (sie wird nie aufgerufen).
+
Wenn wir "JScrollableToolTip" für die Zellen einer JTable benutzen möchten, dann müssen wir wissen, dass der "cell renderer" nur indirekt betroffen ist. In erster Linie ist die JTable für den Tooltip verantwortlich. JTable benutzt lediglich den Text vom Renderer. Also müssen wir {{JAPI|JTable#createTooltip()}} überschreiben, um eine [[Instanz]] von "JScrollableToolTip" zurückzugeben und nicht die [[Methode]] <code>createTooltip()</code> der "renderer component" (sie wird nie aufgerufen).
 
 
<code=java>/*
 
* JScrollableToolTip.java
 
*/
 
  
import java.awt.*;
+
<syntaxhighlight lang="java">import java.awt.*;
 
import java.awt.event.*;
 
import java.awt.event.*;
 
import javax.swing.*;
 
import javax.swing.*;
 +
import javax.swing.event.*;
  
public class JScrollableToolTip extends JToolTip implements MouseWheelListener {
+
public class JScrollableToolTip extends JToolTip implements MouseWheelListener, AncestorListener {
  
 
     private JTextArea tipArea;
 
     private JTextArea tipArea;
Zeile 42: Zeile 41:
 
         scrollpane.addMouseWheelListener(new MouseWheelListener() {
 
         scrollpane.addMouseWheelListener(new MouseWheelListener() {
  
 +
            @Override
 
             public void mouseWheelMoved(MouseWheelEvent e) {
 
             public void mouseWheelMoved(MouseWheelEvent e) {
 
                 if (comp != null) {
 
                 if (comp != null) {
Zeile 49: Zeile 49:
 
             }
 
             }
 
         });
 
         });
         if (comp != null) {
+
         addAncestorListener(this);
            comp.addMouseWheelListener(this);
 
        }
 
 
     }
 
     }
  
 +
    @Override
 
     public void mouseWheelMoved(final MouseWheelEvent e) {
 
     public void mouseWheelMoved(final MouseWheelEvent e) {
 
         scrollpane.dispatchEvent(e);
 
         scrollpane.dispatchEvent(e);
 
         MouseEvent e2 = new MouseEvent(comp, MouseEvent.MOUSE_MOVED, 0, 0, 0, 0, 0, false);
 
         MouseEvent e2 = new MouseEvent(comp, MouseEvent.MOUSE_MOVED, 0, 0, 0, 0, 0, false);
         comp.dispatchEvent(e2);
+
    }
 +
 
 +
    @Override
 +
    public void ancestorRemoved(AncestorEvent e) {
 +
        System.out.println("hidden");
 +
        comp.removeMouseWheelListener(this);
 +
    }
 +
 
 +
    @Override
 +
    public void ancestorAdded(AncestorEvent e) {
 +
        System.out.println("shown");
 +
         comp.addMouseWheelListener(this);
 +
    }
 +
 
 +
    @Override
 +
    public void ancestorMoved(AncestorEvent e) {
 
     }
 
     }
  
Zeile 77: Zeile 91:
 
         String tipTextString = (tipArea.getText() != null ? tipArea.getText() : "");
 
         String tipTextString = (tipArea.getText() != null ? tipArea.getText() : "");
  
         return super.paramString() +
+
         return super.paramString()
                 ",tipText=" + tipTextString;
+
                 + ",tipText=" + tipTextString;
 
     }
 
     }
  
Zeile 85: Zeile 99:
 
         JFrame f = new JFrame();
 
         JFrame f = new JFrame();
 
         f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
         f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         f.setSize(300, 100);
+
         f.setSize(300, 200);
 
         f.setLocationRelativeTo(null);
 
         f.setLocationRelativeTo(null);
 
         ToolTipManager.sharedInstance().setDismissDelay(10000);
 
         ToolTipManager.sharedInstance().setDismissDelay(10000);
         JButton button = new JButton("Used to display...") {
+
         JTable table = new JTable(50, 4) {
  
 
             @Override
 
             @Override
Zeile 97: Zeile 111:
 
             }
 
             }
 
         };
 
         };
         button.setToolTipText("Used to display a 'Tip' for a Component. " +
+
         table.setToolTipText("Used to display a 'Tip' for a Component. "
                 "Typically components provide api to automate the process of " +
+
                 + "Typically components provide api to automate the process of "
                 "using ToolTips. For example, any Swing component can use the " +
+
                 + "using ToolTips. For example, any Swing component can use the "
                 "JComponent  setToolTipText method to specify the text for a standard tooltip.");
+
                 + "JComponent  setToolTipText method to specify the text for a standard tooltip.");
         f.add(button);
+
         f.add(new JScrollPane(table));
 
         f.setVisible(true);
 
         f.setVisible(true);
 
     }
 
     }
}</code=java>
+
}
[[Kategorie:Java]]
+
</syntaxhighlight>
 +
 
 
[[Kategorie:Swing]]
 
[[Kategorie:Swing]]
 
[[Kategorie:Java-Codeschnipsel]]
 
[[Kategorie:Java-Codeschnipsel]]

Aktuelle Version vom 30. Mai 2019, 08:32 Uhr

JScrollableToolTip

JScrollableToolTip.jpg

Dieser Quellcode eines "scrollable tooltip" enthält eine main()-Methode zum Testen, um zu zeigen, wie wir die Klasse "JScrollableToolTip" benutzen können.

Wir können die Quellkomponente im Konstruktor (Java) übergeben (im Beispiel eine JTable). In dem Fall wird die Komponente an das Mausrad gebunden, so dass wir den JTooltip "scrollen" können, sogar wenn die Maus noch über der Quellkomponente ist. Damit lösen wir gleichzeitig das Problem, das entsteht, wenn der Tooltip einer Komponente außerhalb der Grenzen dieser Komponente erscheint: wenn wir in dem Fall die Maus von der Komponente zum Tooltip hin bewegen, um nach unten "scrollen" zu können, verschwindet der Tooltip!

Im Fall eines "mouseWheelMoved" über der Quellkomponente, wird ein "reset" des "DismissDelay" ausgelöst.

ANMERKUNG für Tooltip in einer JTable:
Wenn wir "JScrollableToolTip" für die Zellen einer JTable benutzen möchten, dann müssen wir wissen, dass der "cell renderer" nur indirekt betroffen ist. In erster Linie ist die JTable für den Tooltip verantwortlich. JTable benutzt lediglich den Text vom Renderer. Also müssen wir JTable#createTooltip() überschreiben, um eine Instanz von "JScrollableToolTip" zurückzugeben und nicht die Methode createTooltip() der "renderer component" (sie wird nie aufgerufen).
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class JScrollableToolTip extends JToolTip implements MouseWheelListener, AncestorListener {

    private JTextArea tipArea;
    private JScrollPane scrollpane;
    private JComponent comp;

    /** Creates a tool tip. */
    public JScrollableToolTip(final int width, final int height) {
        this(width, height, null);
    }

    public JScrollableToolTip(final int width, final int height, final JComponent comp) {
        this.comp = comp;
        setPreferredSize(new Dimension(width, height));
        setLayout(new BorderLayout());
        tipArea = new JTextArea();
        tipArea.setLineWrap(true);
        tipArea.setWrapStyleWord(true);
        tipArea.setEditable(false);
        tipArea.setBackground(new Color(255, 255, 204));
        scrollpane = new JScrollPane(tipArea);
        add(scrollpane);
        scrollpane.addMouseWheelListener(new MouseWheelListener() {

            @Override
            public void mouseWheelMoved(MouseWheelEvent e) {
                if (comp != null) {
                    MouseEvent e2 = new MouseEvent(comp, MouseEvent.MOUSE_MOVED, 0, 0, 0, 0, 0, false);
                    comp.dispatchEvent(e2);
                }
            }
        });
        addAncestorListener(this);
    }

    @Override
    public void mouseWheelMoved(final MouseWheelEvent e) {
        scrollpane.dispatchEvent(e);
        MouseEvent e2 = new MouseEvent(comp, MouseEvent.MOUSE_MOVED, 0, 0, 0, 0, 0, false);
    }

    @Override
    public void ancestorRemoved(AncestorEvent e) {
        System.out.println("hidden");
        comp.removeMouseWheelListener(this);
    }

    @Override
    public void ancestorAdded(AncestorEvent e) {
        System.out.println("shown");
        comp.addMouseWheelListener(this);
    }

    @Override
    public void ancestorMoved(AncestorEvent e) {
    }

    @Override
    public void setTipText(final String tipText) {
        String oldValue = this.tipArea.getText();
        tipArea.setText(tipText);
        tipArea.setCaretPosition(0);
        firePropertyChange("tiptext", oldValue, tipText);
    }

    @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[]) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(300, 200);
        f.setLocationRelativeTo(null);
        ToolTipManager.sharedInstance().setDismissDelay(10000);
        JTable table = new JTable(50, 4) {

            @Override
            public JToolTip createToolTip() {
                JScrollableToolTip tip = new JScrollableToolTip(200, 80, this);
                tip.setComponent(this);
                return tip;
            }
        };
        table.setToolTipText("Used 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.");
        f.add(new JScrollPane(table));
        f.setVisible(true);
    }
}