6

画像の中央にテキストを書く必要があります。書くテキストは必ずしも同じではありません。

私が使用しているコードはここにあります:

// Here I first draw the image
g.drawImage(img, 22, 15, 280, 225, null);
// I get the text 
String text = photoText.getText();
// Set the text color to black
g.setColor(Color.black);
// I draw the string 
g.drawString(text, 79.5F, 220.0F);

問題は、テキストが画像の中央にないことです。どうすればよいですか?

水平方向の中央にテキストを描画するだけです。

4

4 に答える 4

7

を使用するJLabelと作業が軽減されますが、ここFontMetricsに示すを使用すると、ジオメトリを直接管理できます。

于 2011-09-06T17:24:43.993 に答える
5

簡単な方法は、アイコンとテキストでJLabelを使用することです。次に、水平/垂直のテキスト位置をCENTERに設定すると、テキストが画像の中央に描画されます。

コードからは、画像の下部近くにテキストをペイントしようとしているように見えます。この場合、アイコン付きのJLabelをコンテナとして使用できます。次に、レイアウトをBoxLayoutのようなものに設定し、テキストを含む別のラベルを追加できます。

どちらのアプローチにもカスタムペイントは必要ありません。

import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;

public class LabelImageText extends JPanel
{
    public LabelImageText()
    {
        JLabel label1 = new JLabel( new ColorIcon(Color.ORANGE, 100, 100) );
        label1.setText( "Easy Way" );
        label1.setHorizontalTextPosition(JLabel.CENTER);
        label1.setVerticalTextPosition(JLabel.CENTER);
        add( label1 );

        //

        JLabel label2 = new JLabel( new ColorIcon(Color.YELLOW, 200, 150) );
        label2.setLayout( new BoxLayout(label2, BoxLayout.Y_AXIS) );
        add( label2 );

        JLabel text = new JLabel( "More Control" );
        text.setAlignmentX(JLabel.CENTER_ALIGNMENT);
        label2.add( Box.createVerticalGlue() );
        label2.add( text );
        label2.add( Box.createVerticalStrut(10) );

        //

        JLabel label3 = new JLabel( new ColorIcon(Color.GREEN, 200, 150) );
        add( label3 );

        JLabel text3 = new JLabel();
        text3.setText("<html><center>Text<br>over<br>Image<center></html>");
        text3.setLocation(20, 20);
        text3.setSize(text3.getPreferredSize());
        label3.add( text3 );

        //

        JLabel label4 = new JLabel( new ColorIcon(Color.CYAN, 200, 150) );
        add( label4 );

        JTextPane textPane = new JTextPane();
        textPane.setText("Add some text that will wrap at your preferred width");
        textPane.setEditable( false );
        textPane.setOpaque(false);
        SimpleAttributeSet center = new SimpleAttributeSet();
        StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
        StyledDocument doc = textPane.getStyledDocument();
        doc.setParagraphAttributes(0, doc.getLength(), center, false);
        textPane.setBounds(20, 20, 75, 100);
        label4.add( textPane );
    }

    public static class ColorIcon implements Icon
    {
        private Color color;
        private int width;
        private int height;

        public ColorIcon(Color color, int width, int height)
        {
            this.color = color;
            this.width = width;
            this.height = height;
        }

        public int getIconWidth()
        {
            return width;
        }

        public int getIconHeight()
        {
            return height;
        }

        public void paintIcon(Component c, Graphics g, int x, int y)
        {
            g.setColor(color);
            g.fillRect(x, y, width, height);
        }
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("LabelImageText");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new LabelImageText() );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

つまり、画像の中央にテキストを書き込んでから、画像を保存する必要があります

画面イメージを使用して、任意のコンポーネントのイメージを作成できます。これは、GUIに画像とテキストを表示していることを前提としています。

または、画像を読み込んで画像にテキストを追加してから保存する場合は、BufferedImageを作成し、その上に画像を描画してから、その上にテキストを描画する必要があります。Trashgodが述べているように、FontMetricsクラスを使用する必要があります。私の提案は役に立ちません。

于 2011-09-06T21:54:47.460 に答える
5

考えられる解決策の 1 つ: JPanel で画像を描画し、パネルの優先サイズを画像のサイズとして設定し、JPanel に GridBagLayout を使用させ、GridBagConstraints なしで、JPanel に追加された JLabel にテキストを配置します。これは、JPanel で JLabel を中央に配置する 1 つの方法です。

于 2011-09-06T17:12:33.710 に答える