在 Java GUI 中的矩形内显示代码

Displaying code inside rectangle in Java GUI

// Eine einfache grafische Benutzeroberfläche mit Swing
    //von der Zeile 3 bis zur Zeile 5; Impotieren von Bibliothek
    import java.awt.*;
    import javax.swing.*;
    import java.awt.Graphics;
     
     
    public class HelloGUI extends JFrame { //  public class HelloGui
        public HelloGUI (String title) {
        super(title);
            getContentPane().add("North",new JButton("Hello World"));
            setSize(400,400);
            setVisible(true);
        setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        
        }
     
        
        public void paint (Graphics g) {
     
            /* Das Verwenden von pain Methode
            * Graphics ist ein Parameter 
            * in g ist das Parameter Graphics gespeichert 
            */
            String insideRect = "Hello World!";
            //this String should be displayed inside of the rectangel
        
            
        }
        public static void main(String args[]) {
            new HelloGUI("Hello World ");
        }
    }

0 Antworten

我想写一个简单的 java gui 应用程序,它显示 Strin“Hello world”,但对我来说非常重要的是“Hello world”必须在一个矩形内。 所以使用方法 g.drawRect() 绘制矩形,使用方法 g.drawString() 显示字符串“Hello World!”或任何其他消息。 代码有效,但 Hello World 没有显示在 reactangle 旁边。 谁能帮我在矩形内显示字符串“Hello Wolrd!”……我试过了,但没用。那是我的代码!发件人 所以这是我的结果的截图

enter image description here

您的 String 实际上在矩形内,在左上角。但是它没有考虑字体大小。下面的代码应该将文本放在矩形的边界内:

    public void paint (Graphics g) {
 
        /* Das Verwenden von pain Methode
        * Graphics ist ein Parameter 
        * in g ist das Parameter Graphics gespeichert 
        */
        String insideRect = "Hello World!";
        //this String should be displayed inside of the rectangel
        int x = 100;
        int y = 100;
        g.drawRect(100,100,200,200);
        g.setColor(Color.RED);

        // add an offset to y coordinate
        Font font = g.getFont();
        g.drawString(insideRect, x ,y + font.getSize());
    }

编辑:要使文本居中,您应该调整矩形和文本的高度和宽度,更改文本 xy 坐标.下面我根据矩形和文本的 width/height 创建了 widthOffsetheightOffset

    public void paint (Graphics g) {
 
        /* Das Verwenden von pain Methode
        * Graphics ist ein Parameter 
        * in g ist das Parameter Graphics gespeichert 
        */
        String insideRect = "Hello World!";
        //this String should be displayed inside of the rectangel
        int x = 100;
        int y = 100;
        g.drawRect(100,100,200,200);
        g.setColor(Color.RED);

        // center the text inside the rectangle
        Font font = g.getFont();
        FontRenderContext frc = new FontRenderContext(new AffineTransform(), true, true);
        Rectangle2D textRectangle = font.getStringBounds(insideRect, frc);
        int textWidth = (int) textRectangle.getWidth();
        int textHeight = (int) textRectangle.getHeight();

        int widthOffset = 100 - textWidth/2; // 100 = rectangle width / 2
        int heightOffset = 100 + textHeight/2; // 100 = rectangle height / 2

        g.drawString(insideRect, x + widthOffset ,y + heightOffset);
    }

对于 运行 上面的代码片段,您还应该导入:

import java.awt.font.FontRenderContext;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;

我建议您先看看 Working with Text APIs

绘制文字时,文字从基线向上绘制(即y位置代表基线,(大部分)文字绘制在其上方)

* 来自 Measuring Text

为了绘制文本使其显示在 y 位置“下方”,您需要将 y 位置偏移字体的 ascent 高度.

例如...

FontMetrics fm = g2d.getFontMetrics();
g2d.drawRect(100, 100, 200, 200);
g2d.setColor(Color.RED);
g2d.drawString(insideRect, x, y + fm.getAscent());

But why not use Font#getSize?

Font#getSize "Returns 这个字体的磅值" (来自JavaDocs), 字体的物理要求可能因渲染工作流程而异,并不是字体物理高度(或渲染属性)的“真实”度量。

您还应该仔细看看 Painting in AWT and Swing and Performing Custom Painting 以更好地了解绘画在 Swing 中的工作方式以及您应该如何使用它,因为您最终将无休止地您当前的方法存在问题。

可运行示例

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main {
    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
        }

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

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            String insideRect = "Hello World!";
            //this String should be displayed inside of the rectangel
            int x = 100;
            int y = 100;

            FontMetrics fm = g2d.getFontMetrics();
            g2d.drawRect(100, 100, 200, 200);
            g2d.setColor(Color.RED);
            g2d.drawString(insideRect, x, y + fm.getAscent());
            g2d.dispose();
        }

    }
}

如果要使文本居中(水平和垂直),您需要了解“绝对”居中或“基线”居中(在垂直轴上)的区别,也就是说,您是否尝试基于文本居中在它的基线或它的整体高度上?两者有细微差别

例如...

  • Java center text in rectangle
  • Java - How to visually center a specific string (not just a font) in a rectangle