tutorials.de Buch-Aktion 02/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
416
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    misterlister misterlister ist offline Grünschnabel
    Registriert seit
    Jan 2007
    Beiträge
    2
    Hallo ich bin derzeit dabei mich in SWING einzuarbeiten und habe folgendes versucht zu programmieren.

    Es soll ein Fenster dargestellt werden das einen Menüeintrag hat mit dem man ein beliebiges Bild laden kann. Dieses Bild wird dann anschließend in einem Panel dargestellt. Das Fenster ist so programmiert das es sich je nach Größe des Bildes anpasst. Das ganze funktioniert wenn ich das Fenster von Anfang an mit setSize so groß mache das es größer ist als das größte Bild das ich jemals darstellen will. Ist das Fenster aber zuerst sehr klein dann funktioniert das beim ersten Bild auch noch. Wenn ich jetzt aber ein größeres Bild öffne wird nur ein Ausschnitt der genauso hoch ist wie das alte Bild dargestellt.

    Die einzige Möglichkeit das es dann doch noch ganz dargestellt wird ist das Fenster mit der Maus minimal zu vergrößern.

    So nun meine Fragen:

    - Wieso hat mein Repaint des Panels und sogar des Fensters keine Wirkung aber das
    minimale verändern der Fenstergröße mit der Maus (siehe die 3 Zeilen kurz vor der Main Funktion). So wie ich das verstanden habe zeichnet doch die repaint()-Funktion die Komponente neu. Und wenn ich das Fenster neu Zeichne müssten doch auch alle Unterkomponenten neu gezeichnet werden (auch das Panel).

    - Wenn ich die prefered Size des Panels z.B. auf 100 x 100 setze müsste das Panel ja sehr klein sein. Wieso wird mit dem öffnen eines Bilder von z.B. 800 x 600 das Bild trozdem ganz angezeigt. Wird das Panel dann automatisch angepasst oder wie funktioniert das und wozu ist dann prefered size da?

    - Wozu ist super.paintComponent(g); in der repaint Methode des Panels gut.

    - Kennt jemand Informationen dazu wie in Windows das Windowing System funktioniert also Events, Fenstermanager, Zeichnen der Fenster. Damit mein ich jetzt nicht die Api-Schnittstellen sondern wie Windows das technisch umsetzt also wo werden die verschiedenen Fensterdaten gespeichert und woher weis Windows welches Event an welches Fenster geht etc. Ich suche danach schon ca. 4 Wochen, habe mir das Windows Internals Buch gekauft aber da ist auch nix drinn. Kann man das überhaupt rausbekommen oder ist das Betriebsgeheimnis von Microsoft und steht nirgendwo?



    Code :
    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
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    
     
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
     
    public class BildBetrachter extends JFrame {
     
        String dateiName;
        Image bild;
        int bildx=0,bildy=0;
        AnzeigeFlaeche anzeigeflaeche = new AnzeigeFlaeche();
        static BildBetrachter fenster;   
        //CBildLeinwand leinwand;
        
        class AnzeigeFlaeche extends JPanel
        {
            public void paintComponent(Graphics g)
            {
                //super.paintComponent(g);
                g.drawImage( bild, 0, 0, this );
                
                
            }
            
            /*public Dimension getMinimumSize()
            {
                return new Dimension(111,111);
            }
            public Dimension getPreferedSize()
            {
                System.out.println(fenster.getSize().height);
                System.out.println(fenster.getSize().width);
                return getMinimumSize();
            
            }*/
        }
        
        class MeinWindowLauscher extends WindowAdapter {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        }
     
        class MeinActionLauscher implements ActionListener 
        {
            public void actionPerformed(ActionEvent e) 
            {
                String Label;
     
                Label = e.getActionCommand();
     
                if (Label.equals("Programm beenden")) 
                {
                    System.exit(0);
                } else if (Label.equals("Bild laden")) 
                {
                    System.out.println("Bild laden");
                    bildLaden();
                }
            }
        }
     
        BildBetrachter(String titel) {
            
            super(titel);
            
            //getContentPane().setLayout(new FlowLayout());
            addButton("Bild laden",new MeinActionLauscher());
            addButton("Programm beenden",new MeinActionLauscher());
            addmenue();
            add(anzeigeflaeche);
            
            
            addWindowListener(new MeinWindowLauscher());
            
            }
        
        private void addButton(String titel,ActionListener listener)
        {
            JButton button;
            button=new JButton(titel);
            button.addActionListener(listener);
            this.getContentPane().add(button);
        }
        
        private void addmenue()
        {
    //      Menüleiste
            JMenuBar menueleiste = new JMenuBar();
            setJMenuBar(menueleiste);
            
            //Untermenüeinträge
            JMenuItem item1= new JMenuItem("Bild laden");
            JMenuItem item2= new JMenuItem("Programm beenden");
            item1.addActionListener(new MeinActionLauscher());
            item2.addActionListener(new MeinActionLauscher());
            
            //Menüeintrag
            JMenu menu1= new JMenu("Datei");
            
            //Untermenüeinträge unter Menüeintrag einhängen
            menu1.add(item1);
            menu1.add(item2);
            
            //Menüeintrag in Menüleiste einhängen
            menueleiste.add(menu1);
        
        }
        
        public void bildLaden()
        {
            Toolkit kit=Toolkit.getDefaultToolkit();
            MediaTracker ladeKontrolle= new MediaTracker(this);
            String dateiname;
            
            FileDialog d = new FileDialog(this,"Bilddatei laden...",FileDialog.LOAD);
            d.setVisible(true);
            dateiname = d.getDirectory();
            dateiname += d.getFile();
        
            if(dateiname == null)
            {
                
                return;
            }
            
            bild = kit.getImage(dateiname);
            ladeKontrolle.addImage(bild,0);
            
            try
            {
                ladeKontrolle.waitForID(0);
            }
            catch(InterruptedException e)
            {
            dateiname=null;
            bild=null;
            
            return;
            }
                
              fenster.setSize(bild.getWidth(anzeigeflaeche),bild.getHeight(anzeigeflaeche)+55);
            anzeigeflaeche.repaint();
            fenster.repaint();
            
        }
     
        public static void main(String[] args) {
     
            fenster = new BildBetrachter("Test");
            fenster.pack();
            fenster.setSize(100,100);
            fenster.setVisible(true);
            
        }
    }
     

  2. #2
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.960
    Mit dem Code den du hier gepostet hast funktioniert doch alles. Zumindest bei mir (Java 1.5). Größere und kleinere Bilder werden mit ihrer korrekten Größe dargestellt.
     

  3. #3
    misterlister misterlister ist offline Grünschnabel
    Registriert seit
    Jan 2007
    Beiträge
    2
    Hy, dann hast du wahrscheinlich das Fenster am Anfang etwas größer gezogen oder? Wenn ich das Fenster am Anfang nicht mindestens so groß mache wie die Grafik die angezeigt werden soll, vergrößert er zwar das JFrame aber das Bild wird trotzdem nur teilweise innerhalb eines bestimmten Ausschnitts welcher die Größe des Ursprungsfensters hat sichtbar.
     

Ähnliche Themen

  1. Viele kleine Objekte auf der Oberfläche eines großen Objekts
    Von bmxsteffen im Forum Autodesk Maya (ehemals Alias)
    Antworten: 0
    Letzter Beitrag: 27.03.08, 10:50
  2. Anpassung der Farben von verschieden Bildern
    Von barten im Forum Photoshop
    Antworten: 5
    Letzter Beitrag: 12.01.06, 09:48
  3. Wie reinigt ihr bei großen Bildern Haut?
    Von Ultraflip im Forum Photoshop
    Antworten: 6
    Letzter Beitrag: 23.09.05, 11:49
  4. Antworten: 4
    Letzter Beitrag: 28.12.04, 13:32
  5. Habe viele viele Fragen !
    Von ThePretender im Forum Videoschnitt, Videotechnik & -produktion
    Antworten: 8
    Letzter Beitrag: 06.05.02, 22:58