ejemplo java swing text graphics java-2d

ejemplo - draw text java



Centrado de cadena en el panel (3)

Estoy tratando de centrar una Cadena en un Panel.

Actualmente estoy haciendo esto:

public void paintComponent(Graphics g) { super.paintComponent(g); int stringWidth = 0; int stringAccent = 0; int xCoordinate = 0; int yCoordinate = 0; // get the FontMetrics for the current font FontMetrics fm = g.getFontMetrics(); /** display new message */ if (currentMessage.equals(message1)) { removeAll(); /** Centering the text */ // find the center location to display stringWidth = fm.stringWidth(message2); stringAccent = fm.getAscent(); // get the position of the leftmost character in the baseline xCoordinate = getWidth() / 2 - stringWidth / 2; yCoordinate = getHeight() / 2 + stringAccent / 2; // draw String g.drawString(message2, xCoordinate, yCoordinate); currentMessage = message2; // alternate message } }

¿Hay algún método que pueda usar para simplificar esta tarea?

Por ejemplo:

public void paintComponent(Graphics g) { super.paintComponent(g); if (currentMessage.equals(message1)) { removeAll(); // draw String centered (with one line of code) } }

Parece que estoy haciendo mucho trabajo solo para centrar el texto.


En la biblioteca estándar de Java? No, siempre puedes hacer algo a lo largo de este

private void drawStringMiddleOfPanel(String string, Graphics g) { String message2 = string; int stringWidth = 0; int stringAccent = 0; int xCoordinate = 0; int yCoordinate = 0; // get the FontMetrics for the current font FontMetrics fm = g.getFontMetrics(); /** display new message */ /** Centering the text */ // find the center location to display stringWidth = fm.stringWidth(message2); stringAccent = fm.getAscent(); // get the position of the leftmost character in the baseline xCoordinate = getWidth() / 2 - stringWidth / 2; yCoordinate = getHeight() / 2 + stringAccent / 2; // draw String g.drawString(message2, xCoordinate, yCoordinate); currentMessage = message2; // alternate message }

Con

public void paintComponent(Graphics g) { super.paintComponent(g); if (currentMessage.equals(message1)) { removeAll(); drawStringMiddleOfPanel(message1, g); } }


Pruebe algo como ...

xCoordinate = (getWidth() - stringWidth) / 2; yCoordinate = ((getHeight() - fm.getHeight) / 2) + stringAccent;

En lugar.

Eche un vistazo al texto del centro de Java en rectángulo para obtener detalles adicionales

Además, podría lograr lo mismo utilizando un JLabel en un JPanel con un GridBagLayout

Actualizado

Recién noté removeAll(); en paintComponent . Esta no es una buena idea, ya que puede provocar que una nueva solicitud de repintado se publique en la cola de eventos, colocando su código en un bucle infinte que podría consumir su CPU ...

Actualizado con un ejemplo

Comparación lado a lado de drawString y JLabel ... ( drawString a la izquierda, JLabel a la derecha)

import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridBagLayout; import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class CenterText { public static void main(String[] args) { new CenterText(); } public CenterText() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new GridLayout(1, 2)); frame.add(new CenterStringPane()); frame.add(new CenterLabelPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class CenterStringPane extends ReferencePane { public CenterStringPane() { setFont(UIManager.getFont("Label.font")); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); String text = "In the center"; FontMetrics fm = g2d.getFontMetrics(); int x = (getWidth() - fm.stringWidth(text)) / 2; int y = ((getHeight() - fm.getHeight()) / 2) + fm.getAscent(); g2d.drawString(text, x, y); g2d.dispose(); } } public class CenterLabelPane extends ReferencePane { public CenterLabelPane() { setLayout(new GridBagLayout()); add(new JLabel("In the center")); } } public class ReferencePane extends JPanel { public ReferencePane() { } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); int halfX = getWidth() / 2; int halfY = getHeight() / 2; g2d.drawLine(halfX, 0, halfX, getHeight()); g2d.drawLine(0, halfY, getWidth(), halfY); g2d.dispose(); } } }


public void paintComponent(Graphics g) { super.paintComponent(g); if (currentMessage.equals(message1)) { removeAll(); int x= (panel.getWidth() / 2) - str.length()/2; int y = (panel.getHeight() / 2); graphics.drawString(str, x, y); } }