tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Fabio Hellmann
ERLEDIGT
JA
ANTWORTEN
7
ZUGRIFFE
451
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Hallo!

    Ich hab ein simples Frame mit einem Textfield. Rechts vom Textfield soll durch ein Popup ein Label angezeigt werden(so wie ein Tooltip). Dieser ist aber leider nicht "verbunden" mit dem frame.

    Das heißt wenn ich das Frame verschiebe, so bleibt das popup-Label wo es ist.
    Sobald das popup-Label komplett inerhalb des Frames liegt, wird es mitverschoben.

    Kan mir da einer helfen?

    Hier der code:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    
    import java.awt.Color;
    import java.awt.FlowLayout;
     
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.Popup;
    import javax.swing.PopupFactory;
    import javax.swing.UIManager;
     
    public class Beispiel5
    {
        public Beispiel5()
        {
            try
            {
                UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
            }
            catch (Exception e)
            {
            }
     
            JFrame frame = new JFrame("Beispiel 5");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(500, 300);
     
            JPanel panel = new JPanel();
            panel.setLayout(new FlowLayout());
            JLabel label = new JLabel("Datum");
            JTextField field = new JTextField(30);
     
            PopupFactory factory = PopupFactory.getSharedInstance();
     
            panel.add(label);
            panel.add(field);
            frame.add(panel);
            frame.setSize(350, 250);
     
            frame.setVisible(true);
     
            int x = field.getLocationOnScreen().x + field.getPreferredSize().width - 2;
            int y = field.getLocationOnScreen().y - field.getPreferredSize().height + 2;
     
            JPanel errorPanel = new JPanel();
            JLabel errorLabel = new JLabel("Falsches Datum");
            errorPanel.setBorder(BorderFactory.createLineBorder(Color.black));
            errorPanel.add(errorLabel);
            Popup popup = factory.getPopup(frame, errorPanel, x, y);
            popup.show();
     
        }
     
        public static void main(String[] args)
        {
            Beispiel5 beispiel = new Beispiel5();
        }
    }
     

  2. #2
    genodeftest genodeftest ist offline Mitglied Brillant
    Registriert seit
    Jun 2009
    Beiträge
    870
    Warum verwendest du nicht gleich einen ToolTip?
     
    Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  3. #3
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Weil ich eine Fehlerausgabe für ein JTextField erzeugen will.

    Aber ich bin drauf gekommen dass wenn das popup innerhalb des Frames gezeichnet wird, dann liegt es auf dem glass-pane und wird somit beim verschieben des Frames mitverschoben.

    Liegt es nur ein wenig außerhalb, dann wird ein eigenständiges JWindow gemacht was dann natürlich stehen bleibt.
     

  4. #4
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Hi,
    wenn du den Popup lieber auserhalb von deinem Fenster haben willst, musst du das "externe" JWindow mit setLocation relativ zum "Haupt"-Fenster ausrichten. Dann sollte das auch so funktionieren.

    Gruß

    Fabio
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  5. #5
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Aber wird es dann auch mit verschoben wenn man das Hauptfenster verschiebt?
    (Kann es gerade nicht testen)
     

  6. #6
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Nachdem ich da ein wenig rumgespielt habe, funktioniert es jetzt.
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    
    import java.awt.Color;
    import java.awt.FlowLayout;
    import java.awt.Window;
    import java.awt.event.ComponentAdapter;
    import java.awt.event.ComponentEvent;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowFocusListener;
    import java.awt.event.WindowStateListener;
     
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.Popup;
    import javax.swing.PopupFactory;
    import javax.swing.UIManager;
     
    public class Beispiel5
    {
        public Beispiel5() {
            try {
                UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
            } catch(final Exception e) {
            }
            
            final JFrame frame = new JFrame("Beispiel 5");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(500, 300);
            
            final JPanel panel = new JPanel();
            panel.setLayout(new FlowLayout());
            final JLabel label = new JLabel("Datum");
            final JTextField field = new JTextField(30);
            
            final PopupFactory factory = PopupFactory.getSharedInstance();
            
            panel.add(label);
            panel.add(field);
            frame.add(panel);
            frame.setSize(350, 250);
            
            frame.setVisible(true);
            
            final int x = field.getLocationOnScreen().x + field.getPreferredSize().width - 2;
            final int y = field.getLocationOnScreen().y - field.getPreferredSize().height + 2;
            
            final JPanel errorPanel = new JPanel();
            final JLabel errorLabel = new JLabel("Falsches Datum");
            errorPanel.setBorder(BorderFactory.createLineBorder(Color.black));
            errorPanel.add(errorLabel);
            final Popup popup = factory.getPopup(frame, errorPanel, x, y);
            popup.show();
            
            frame.addComponentListener(new ComponentAdapter()
            {
                @Override
                public void componentResized(final ComponentEvent e) {
                    final Window currentPopup = findCurrentPopup();
                    if(currentPopup != null) {
                        final int x = field.getLocationOnScreen().x + field.getPreferredSize().width - 2;
                        final int y = field.getLocationOnScreen().y - field.getPreferredSize().height + 2;
                        currentPopup.setLocation(x, y);
                    }
                }
                
                @Override
                public void componentMoved(final ComponentEvent e) {
                    final Window currentPopup = findCurrentPopup();
                    if(currentPopup != null) {
                        final int x = field.getLocationOnScreen().x + field.getPreferredSize().width - 2;
                        final int y = field.getLocationOnScreen().y - field.getPreferredSize().height + 2;
                        currentPopup.setLocation(x, y);
                    }
                }
            });
            frame.addWindowListener(new WindowAdapter()
            {
                @Override
                public void windowClosing(final WindowEvent e) {
                    final Window currentPopup = findCurrentPopup();
                    if(currentPopup != null) {
                        currentPopup.dispose();
                    }
                }
            });
            frame.addWindowStateListener(new WindowStateListener()
            {
                @Override
                public void windowStateChanged(final WindowEvent e) {
                    final Window currentPopup = findCurrentPopup();
                    if(currentPopup != null) {
                        currentPopup.setVisible(e.getWindow().isVisible());
                    }
                }
            });
            frame.addWindowFocusListener(new WindowFocusListener()
            {
                @Override
                public void windowLostFocus(final WindowEvent e) {
                    final Window currentPopup = findCurrentPopup();
                    if(currentPopup != null) {
                        currentPopup.setVisible(false);
                    }
                }
                
                @Override
                public void windowGainedFocus(final WindowEvent e) {
                    final Window currentPopup = findCurrentPopup();
                    if(currentPopup != null) {
                        currentPopup.setVisible(true);
                    }
                }
            });
        }
        
        /**
         * {@link javax.swing.Popup.HeavyWeightWindow#HeavyWeightWindow(Window)}
         * 
         * @return
         */
        public static Window findCurrentPopup() {
            final Window[] windows = JFrame.getWindows();
            for(final Window window : windows) {
                // Der Name steht in der Klasse, die im Kommentar als Link markiert ist
                if(window.getName().equals("###overrideRedirect###")) {
                    return window;
                }
            }
            return null;
        }
        
        public static void main(final String[] args) {
            new Beispiel5();
        }
    }

    Gruß

    Fabio
    hesk bedankt sich. 
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  7. #7
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Danke, das ist einmal ein Ansatz

    Was ich noch nicht ganz verstehe...woher bekomme ich den Window-Name des Popups?

    Wenn ich deinen Code einfach ausführe, funktioniert es noch nicht.

    Ich muss erst bei

    Code java:
    1
    
    if(window.getName().equals("###overrideRedirect###")) {

    win0 eintragen.
     

  8. #8
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Der name wird in der Java-Library eingetragen. Die Klasse befindet sich innerhalb der Popup Klasse.
    Code java:
    1
    
    javax.swing.Popup.HeavyWeightWindow
    Im Konstruktor wird der Name des Fensters gesetzt. Ich war eigentlich der Meinung, dass der Name überall gleich sein müsste, da er schließlich in der Java-Library fest verankert ist.
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

Ähnliche Themen

  1. URLs in Anchor umwandeln
    Von ropueh im Forum PHP
    Antworten: 4
    Letzter Beitrag: 24.02.11, 17:05
  2. [SEO] - Ajax Anchor Navigation
    Von Primus852 im Forum Javascript & Ajax
    Antworten: 10
    Letzter Beitrag: 09.01.11, 18:56
  3. Anchor Text und Backlinks
    Von jimboo im Forum .NET Web und Kommunikation
    Antworten: 2
    Letzter Beitrag: 17.05.07, 15:17
  4. Antworten: 2
    Letzter Beitrag: 07.09.05, 12:16
  5. include mit anchor
    Von jenno im Forum PHP
    Antworten: 4
    Letzter Beitrag: 18.05.05, 09:25