Creating a string inside a Rectangle

前端 未结 1 1851
后悔当初
后悔当初 2020-12-22 10:59

Hello i\'m trying to do a string inside a rectangle to make custom menus in java I\'m using a canvas and doing the following method, but I can\'t seem to get it right!

相关标签:
1条回答
  • 2020-12-22 11:42

    The basic problem you have is that you are using the components x/y position where the Graphics context is already translated so that 0x0 is the top/left corner of the component.

    Center Text

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Font;
    import java.awt.FontMetrics;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class DrawText {
    
        public static void main(String[] args) {
            new DrawText();
        }
    
        public DrawText() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class TestPane extends JPanel {
    
            public TestPane() {
                setBackground(Color.BLACK);
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(200, 200);
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g.create();
                g2d.setColor(Color.RED);
                g2d.drawLine(0, getHeight() / 2, getWidth(), getHeight() / 2);
                g2d.drawLine(getWidth() / 2, 0, getWidth() / 2, getHeight());
                render(g);
                g2d.dispose();
            }
    
            public void render(Graphics g) {
                Graphics2D g2d = (Graphics2D) g;
                g2d.setColor(Color.WHITE);
                Font font = new Font("Verdana", Font.PLAIN, 20);
                g2d.setFont(font);
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                                RenderingHints.VALUE_ANTIALIAS_ON);
                FontMetrics fm = g2d.getFontMetrics();
    
                String option = "This is a test";
    
                int x = (getWidth() - fm.stringWidth(option)) / 2;
                int y = ((getHeight() - fm.getHeight()) / 2);
                g2d.drawString(option, x, y + fm.getAscent());
                g2d.drawRect(
                                (int)x - 20, 
                                (int)y - 10, 
                                (int)fm.stringWidth(option) + 40, 
                                (int)fm.getHeight() + 20);
            }
        }
    
    }
    

    For example...

    • Centering String in Panel
    • Java center text in rectangle

    Updated...

    If, each menu item is printed within a single component, then the concept provided above should work. If you are printing multiple items within a single component, you could use something like...

    enter image description here

    public void render(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.WHITE);
        Font font = new Font("Verdana", Font.PLAIN, 20);
        g2d.setFont(font);
    
        int x = 0;
        int y = 0;
    
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);
        FontMetrics fm = g2d.getFontMetrics();
    
        String option = "This is a test";
    
        while (x < getWidth()) {
    
            while (y < getHeight()) {
    
                int width = fm.stringWidth(option);
                int height= fm.getHeight();
    
                g2d.drawString(option, x + 20, y + fm.getAscent() + 10);
                width += 40;
                height += 20;
                g2d.drawRect(
                                (int) x,
                                (int) y,
                                (int) width,
                                (int) height);
    
                x += width;
                y += height;
    
            }
    
        }
    }
    
    0 讨论(0)
提交回复
热议问题