2016-12-20 3 views
0

Also arbeite ich an einem Projekt, bei dem zwischen Bildern gewechselt werden muss. Die Bilder müssen im Vollbildmodus sein. Es scheint mir zwei Probleme zu geben. Zuerst ist mit dem Bildwechsel. Wenn ich zwischen den Bildern wechsle, erscheinen einige Bilder beim Wechsel OK. Andere scheinen überhaupt nicht auf dem Bildschirm zu erscheinen. Ich scheine nur einen leeren Rahmen zu bekommen. Zweitens scheint die richtige Taste jedes Mal zu funktionieren, aber nur für meinen Verstand, habe ich Systemdrucke. Die Systemausgänge scheinen nicht auf der Konsole zu erscheinen, aber sie wechseln die Bilder im Rahmen (obwohl ich manchmal einen leeren Rahmen bekomme). Alle Vorschläge/Lösungen würden sehr geschätzt.JFrame zeigt nicht alle Bilder im Vollbild an

Hinweis zum Code: Die Zeichenfolgen, die ich habe, dienen zum Testen der Koordinaten. Ich benutze einen Eyetribe, also um zu zeigen, wo ich hinschaue. Der Kordelzug scheint perfekt zu funktionieren. Außerdem rufe ich switchImage sehr schnell, fast 22 Mal in einer Sekunde. Könnte das ein Problem sein? Obwohl es mich wundern lässt, warum es für einige Bilder funktioniert und nicht für andere. UPDATE: Das Problem scheint in g.drawImage zu sein. Es scheint nicht für einige Bilder zu zeichnen, aber ich kann nicht herausfinden, warum das passiert. Derzeit ist dies mein Code für Vollbild-Bilder.

public void showFrame(){ 

    //jL -> JLabel 
    //jF -> JFrame 
    //jP -> Panel 
    jF.setTitle("Test"); 
    jF.setUndecorated(true); 
    jF.setResizable(false); 
    jF.setVisible(true); 

    Toolkit tk = Toolkit.getDefaultToolkit(); 
    int xsize = (int)tk.getScreenSize().getWidth(); 
    int ysize = (int)tk.getScreenSize().getHeight(); 
    jF.setSize(xsize, ysize); 
    jF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 



    if(testImagesList != null){ 
     img = new ImageIcon(testImagesList.get(0)); 
    } 
    Image imag = img.getImage(); 
    bi = new BufferedImage(1280, 800, BufferedImage.TYPE_INT_ARGB); 
    Graphics g = bi.createGraphics(); 
    g.drawImage(imag, 0, 0, 1280, 800, null); 

    ImageIcon newIcon = new ImageIcon(bi); 
    jL.setIcon(newIcon); 
    jF.add(jL); 
    jP.add(jL); 
    jF.add(jP); 
    jF.validate(); 
} 

Um zwischen Bildern zu wechseln, verwende ich einen Schlüsselhörer. Der keyListner ruft den Switch-Bildcode auf. Beide sind unten angegeben.

public void switchImage(ImageIcon image, JFrame jF, JLabel jL, JPanel jP, GazeData gazeData){ 
    Image imag = image.getImage(); 

    BufferedImage bi = new BufferedImage(1280, 800, BufferedImage.TYPE_INT_ARGB); 
    Graphics g = bi.getGraphics(); 

    g.drawImage(imag, 0, 0, 1280, 800, null); 
    g.setColor(Color.black); 
    int x = (int) gazeData.smoothedCoordinates.x; 
    int y = (int) gazeData.smoothedCoordinates.y; 
    Font font = new Font("Verdana", Font.BOLD, 16); 
    g.setFont(font); 


    String text = "hello(" + gazeData.smoothedCoordinates.x + gazeData.smoothedCoordinates.y + ")"; 
    g.drawString(text, x, y); 
    g.drawString("Fixed Coordinate at (400, 500)", 400, 500); 
    ImageIcon newIcon = new ImageIcon(bi); 
    jL.setIcon(newIcon); 
    jP.add(jL); 
    jF.validate(); 
} 

@Override 
public void keyPressed(KeyEvent e) { 
    // TODO Auto-generated method stub 
    if(e.getKeyCode() == KeyEvent.VK_RIGHT){ 
     // j.switchImage(image, jF, jL, jP, gazeData); 
     System.out.println("RightDetected"); 
     imageIndex++; 

     ImageIcon newImage = new ImageIcon(imageList.get(imageIndex)); 

     if(newImage != null){ 
      this.currentImage = newImage; 
      System.out.println("IMAGE SWITCHED!!!! Current Image="+imageList.get(imageIndex)); 
      j.switchImage(currentImage, j.jF, j.jL, j.jP, currentGazeData); 


     } 

    } 
} 

Antwort

2

Wahrscheinlich wird Ihr Problem nicht beheben, aber Sie haben eine falschen Swing-Codierung Praktiken:

jL.setIcon(newIcon); 
//jF.add(jL); // remove 
jP.add(jL); 
jF.add(jP); 
jF.validate(); 

Eine Swing-Komponente kann nur einen einzelnen Elternteil hat. Zuerst fügen Sie das Etikett dem Rahmen und dem Panel hinzu. Das Label wird also immer nur auf dem Panel erscheinen. Befreie dich von der ersten Aussage.

Alle Swing-Komponenten sollten dem Rahmen hinzugefügt werden, BEVOR der Rahmen gültig ist. Löschen Sie also die validate() -Anweisung und verschieben Sie die setVisible (...) nach unten.

Wenn Sie eine Eigenschaft einer Swing-Komponente ändern, ist die Komponente intelligent genug, um sich neu zu streichen. Sie müssen lediglich das Symbol des Etiketts ändern. Es ist nicht nötig, das Etikett wieder in das Panel einzufügen oder den Rahmen zu validieren().

Andere scheinen nicht bei allen

auf dem Bildschirm zu zeigen Vielleicht wird das Bild nicht gefunden?

Der Kordelzug scheint perfekt zu funktionieren.

Anstatt alle BufferedImages zu erstellen und benutzerdefinierte Bilder zu erstellen, können Sie einfach ein Etikett auf Ihrem Etikett anzeigen.

So würde der Grund Code sein:

imageLabel = new JLabel(); 
imageLabel.setLayout(new FlowLayout()); 
textLabel = new JLabel(); 
imageLabel.add(textLabel); 
frame.add(imageLabel); 

Hinweis:

  1. Die imageLabel direkt mit dem Rahmen hinzugefügt werden können.Ich sehe keinen Grund für Ihr Panel.
  2. Um das Bild zu ändern, die Sie gerade die SetIcon() -Methode auf der den Text zu ändern
  3. imageLabel aufrufen Ihr nur die setText aufgerufen() -Methode für den textlabel
+0

Danke für mich dort zu korrigieren. Entschuldige, ich habe eine Pause von diesem Projekt gemacht, aber ich bin jetzt zurück. Also, was ich gerade realisiert habe, ist, wenn ich ein Bild in einem anderen Programm zeichne und nichts anderes mache, d. H. DrawImage nur einmal aufruft, scheint es das Bild zu zeichnen. Danach zeichnet es auch das Bild in meinem Hauptprogramm. Dies scheint mir, dass ich es nicht genug Zeit gebe, um zu rendern, und ich versuche wieder zu zeichnen. Ich versuche einen Weg zu finden, damit ich es einmal kennenlernen kann. Ich habe gewechselt, also zeichne ich nur einmal wenn ich umstelle und nicht 22 mal in einer Sekunde. Das hat aus irgendeinem Grund immer noch nicht geholfen. – paddy

Verwandte Themen