2016-05-10 27 views
1

ich wissen will, wie ich einen String oder Rechteck (die JFrame ist in einem Vollbild vollständig)Wie zeichnen Sie einen String oder Rechteck nach den Bildschirmen Breite und Höhe mit einer Leinwand in Java

Heres ziehen könnte was in meinem Main.java Klasse:

public static int WIDTH, HEIGHT; 
private Window window; 
... 
public Main() { 
    window = new Window("2D Shooter", this); 
... 
    private void render(){ 
    BufferStrategy bs = this.getBufferStrategy(); 

    if(bs == null){ 
     this.createBufferStrategy(3); 
     return; 
    } 

    Graphics g = bs.getDrawGraphics(); 

    g.setColor(Color.BLACK); 
    g.fillRect(0, 0, WIDTH, HEIGHT); 

    handler.render(g);//this calls the render method to render objects 

    g.dispose(); 
    bs.show(); 
} 

später in einer anderen Klasse I haben:

public void render(Graphics g){ 
    ... 
    g.setColor(Color.WHITE); 
    g.drawString("2D Shooter", ((Main.WIDTH)/2), (Main.HEIGHT/5)); 
    ... 

}

Dieser Code funktioniert und läuft ABER der Text ist nicht vollständig zentriert Ich möchte, dass es nicht in der Mitte zentriert ist. Danke!

Antwort

1

Verwenden Sie den Grafikkontext FontMetrics.

String s = "2D Shooter"; 
int w2 = g.getFontMetrics().stringWidth(s)/2; 
int h2 = g.getFontMetrics().getHeight(); 
g.drawString(s, getWidth()/2 - w2, h2); 

image

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.Graphics; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

/** 
* @see http://stackoverflow.com/a/37150783/230513 
*/ 
public class Test { 

    private void display() { 
     JFrame f = new JFrame("Test"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new JPanel() { 
      @Override 
      protected void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       g.setFont(getFont().deriveFont(Font.BOLD, 24f)); 
       String s = "2D Shooter"; 
       int w2 = g.getFontMetrics().stringWidth(s)/2; 
       int h2 = g.getFontMetrics().getHeight(); 
       g.drawString(s, getWidth()/2 - w2, h2); 
      } 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(320, 240); 
      } 
     }); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Test()::display); 
    } 
} 
+0

Was bedeutet die .stringWidth (n) tun, weil ich einen Fehler. –

+0

Ich habe das Fragment korrigiert und oben mehr Kontext hinzugefügt; Wenn Sie immer noch Probleme haben, bearbeiten Sie Ihre Frage mit einem [mcve] basierend auf dem obigen Beispiel. – trashgod

+0

Ah ich sehe, ich habe es. Noch eine Frage, wie würde ich das für ein Rectangle oder Sprite tun? –