在Panel中居中字符串

我正试图在一个Panel中居中一个String。

目前我这样做:

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

有没有一种方法可以用来简化这项任务?

例如:

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

看起来我只是为了集中文本做了很多工作。

在java标准库中? 不,你可以随时做点什么

 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 } 

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

试试像……

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

代替。

查看矩形中的Java中心文本以获取更多详细信息

此外,您可以使用带有GridBagLayoutJPanel上的JLabel实现相同的function

更新

刚注意到removeAll();paintComponent 。 这不是一个好主意,因为它可能导致新的重绘请求发布到事件队列,将您的代码放入一个可能消耗CPU的infinte循环…

更新了示例

并排比较drawStringJLabel …(左边是drawString ,右边是JLabel

在此处输入图像描述

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