在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中心文本以获取更多详细信息
此外,您可以使用带有GridBagLayout
的JPanel
上的JLabel
实现相同的function
更新
刚注意到removeAll();
在paintComponent
。 这不是一个好主意,因为它可能导致新的重绘请求发布到事件队列,将您的代码放入一个可能消耗CPU的infinte循环…
更新了示例
并排比较drawString
和JLabel
…(左边是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); } }