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);
}
}