2015-07-06 2 views
0

Приветствую вас, я работаю над простым приложением, чтобы получить обратную связь от беспилотника. Итак, вот моя проблема. Я понятия не имею, почему я не могу показать строковые слова «Нет видеосвязи» на моей панели. Любая идея, что здесь происходит? Когда я запускаю этот фрейм, он просто показывает мне простой пустой кадр без чего-либо. Благодарю.Как нарисовать строку с использованием класса Graphics2D?

Код:

package dronetest; 

import com.codeminders.ardrone.ARDrone; 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.image.BufferedImage; 
import java.util.concurrent.atomic.AtomicBoolean; 
import java.util.concurrent.atomic.AtomicReference; 
import javax.swing.*; 

public class testStringVideo extends javax.swing.JFrame { 

    private AtomicReference<BufferedImage> image = new AtomicReference<BufferedImage>(); 
    private AtomicBoolean preserveAspect = new AtomicBoolean(true); 
    private BufferedImage noConnection = new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB); 
    /** 
    * Creates new form testStringVideo 
    */ 
    public testStringVideo() { 
     initComponents(); 

     Graphics2D g2d = (Graphics2D) noConnection.getGraphics(); 
     Font f = g2d.getFont().deriveFont(24.0f); 
     System.err.println(f); 

     g2d.drawString("No video connection", 40, 100); 
     image.set(noConnection); 
     System.err.println(image); 
    } 

    public void setDrone(ARDrone drone) { 
     drone.addImageListener(this); 
    } 

    public void setPreserveAspect(boolean preserve) { 
     preserveAspect.set(preserve); 
    } 

    public void frameReceived(BufferedImage im) { 
     image.set(im); 
     repaint(); 
    } 

    public void paintComponent(Graphics g) { 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     int width = getWidth(); 
     int height = getHeight(); 
     drawDroneImage(g2d, width, height); 
    } 

    private void drawDroneImage(Graphics2D g2d, int width, int height) { 
     BufferedImage im = image.get(); 
     if (im == null) { 
      return; 
     } 
     int xPos = 0; 
     int yPos = 0; 
     if (preserveAspect.get()) { 
      g2d.setColor(Color.BLACK); 
      g2d.fill3DRect(0, 0, width, height, false); 
      float widthUnit = ((float) width/4.0f); 
      float heightAspect = (float) height/widthUnit; 
      float heightUnit = ((float) height/3.0f); 
      float widthAspect = (float) width/heightUnit; 

      if (widthAspect > 4) { 
       xPos = (int) (width - (heightUnit * 4))/2; 
       width = (int) (heightUnit * 4); 
      } else if (heightAspect > 3) { 
       yPos = (int) (height - (widthUnit * 3))/2; 
       height = (int) (widthUnit * 3); 
      } 
     } 
     if (im != null) { 
      g2d.drawImage(im, xPos, yPos, width, height, null); 
     } 
    } 

    public static void main(String args[]) { 
     /* Set the Nimbus look and feel */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
         javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(testStringVideo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(testStringVideo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(testStringVideo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(testStringVideo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new testStringVideo().setVisible(true); 
      } 
     }); 
    } 
    // Variables declaration - do not modify      
    private javax.swing.JPanel jPanel1; 
    // End of variables declaration     
} 
+0

Вы хотите назвать super.paintComponent – Shrey

+0

Привет, Shrey, могу я знать, где я должен назвать super.paintComponent? Извините, поскольку я совершенно новичок в этом. Благодарю. –

+0

Это стандарт, чтобы назвать классы с капюшоном с верблюдом, то есть «TestStringVideo». Вы затрудняете для себя и других читать свой код, когда не выполняете ожидаемые соглашения об именах. – dimo414

ответ

1

Я не знаком с Java 2D, но альтернативой было бы создать JTextArea и добавить его в testStringVideo. Если вы заинтересованы в том, как сделать так, вот некоторые общие инструкции:

  1. переменная член Declare JTextArea connectionMessage;

  2. Инициировать его: connectionMessage = new JTextArea("No video connection");

  3. создать метод, который добавляет connectionMessage к testStringVideo когда это это необходимо

Сообщите мне, если эта работа или если вам все еще нужна помощь!

2

Вообще вы не вызываете getGraphics() непосредственно:

Graphics2D g2d = (Graphics2D) noConnection.getGraphics(); 

это дает указатель на Graphics объекта, но не в то время как окно втягивается.

Вместо этого, вы должны переопределить paintComponent() метод внутренней JLabel, как this tutorial демонстрирует (обратите внимание на super.paintComponent() вызов, предлагали другие).

public void paintComponent(Graphics g) { 
    super.paintComponent(g);  

    // Draw Text 
    g.drawString("This is my custom Panel!",10,20); 
} 

Метод paintComponent() вызывается свинг Event Dispatch Thread и прошел Graphics случай, когда Качели готов к покраске этот компонент.

Там есть ряд полезных руководств на сайте компании Oracle (как и в других местах), что вдаваться в подробности:

Обязательно прочитайте через них; Swing делает много работы за кулисами для вас. Это экономит вам много времени, но если вы не понимаете, что он делает, вы будете бороться с ним, а не позволять ему работать с вами.

 Смежные вопросы

  • Нет связанных вопросов^_^