2013-01-11 59 views
8

我使用drawString()方法使用Graphics绘制字符串,但我想将文本居中放在矩形中。我应该怎么做?矩形中的Java中心文本

+1

你的标题状态,使用了'JTextField',但不是你的题。那么这是真的吗? – Mordechai

+0

您的标题是:*文本字段中的Java中心文本*,但您的文章说:*我使用'drawString()'方法在Graphics上绘制字符串,但我想将文本居中放在一个矩形中。我应该怎么做?*这是如何对应的 –

+0

纠正我的问题: 我在JFrame的某个地方有一个矩形....我想绘制以矩形为中心的字符串。我应该怎么做? –

回答

27

我用这个来中心的文本上一个JPanel

 Graphics2D g2d = (Graphics2D) g; 
     FontMetrics fm = g2d.getFontMetrics(); 
     Rectangle2D r = fm.getStringBounds(stringTime, g2d); 
     int x = (this.getWidth() - (int) r.getWidth())/2; 
     int y = (this.getHeight() - (int) r.getHeight())/2 + fm.getAscent(); 
     g.drawString(stringTime, x, y); 
+2

垂直居中文本涉及很少,因为文本上升和文本呈现的方式。从内存来看,它应该更像y =((getHeight() - fm.getHeight())/ 2)+ fm.getAscent(); ...尝试在组件中心线上绘制一条线,并比较两种方法,如果我的记忆力很好,我相信这会更适合居中...... +1 – MadProgrammer

+0

你说得对。我确定了我的答案。 –

+0

您可能还想阅读[this](http://stackoverflow.com/questions/1055851/how-do-you-draw-a-string-centered-vertically-in-java) – MadProgrammer

15

居中文本有很多的“选项”。你是完全中心还是基于基线?

enter image description here

就个人而言,我更喜欢绝对的中心位置,但它取决于你在做什么?

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("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

     }); 
    } 

    public class TestPane extends JPanel { 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      int height = getHeight(); 
      String text = "This is a test xyx"; 

      g.setColor(Color.RED); 
      g.drawLine(0, height/2, getWidth(), height/2); 

      FontMetrics fm = g.getFontMetrics(); 
      int totalWidth = (fm.stringWidth(text) * 2) + 4; 

      // Baseline 
      int x = (getWidth() - totalWidth)/2; 
      int y = (getHeight() - fm.getHeight())/2; 
      g.setColor(Color.BLACK); 

      g.drawString(text, x, y + ((fm.getDescent() + fm.getAscent())/2)); 

      // Absolute... 
      x += fm.stringWidth(text) + 2; 
      y = ((getHeight() - fm.getHeight())/2) + fm.getAscent(); 
      g.drawString(text, x, y); 

     } 

    } 

} 
+0

+1作为对比。 – trashgod