Java 将字符串置于自定义组件的中心

Java 将字符串置于自定义组件的中心,java,swing,Java,Swing,因此,我有一个定制的JComponent(一个几乎完成的按钮,如果您愿意的话)。以下是该类的源代码: import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.util.ArrayList; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swin

因此,我有一个定制的JComponent(一个几乎完成的按钮,如果您愿意的话)。以下是该类的源代码:

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class LukeButton extends JComponent implements MouseListener{
    //ArrayList of listeners
    private final ArrayList<ActionListener> listeners = new  ArrayList<ActionListener>();
    Shape rec = new RoundRectangle2D.Float(10, 10, 110, 60, 50, 75);
    BasicStroke border = new BasicStroke(5);
    SpringLayout layout = new SpringLayout();
    private String text;

public LukeButton(String text){
    this.text = text;
    this.setLayout(layout);
    this.addMouseListener(this);
}
//Adds a listeners to the list
public void addActionListener(ActionListener e){
    listeners.add(e);
}
//Called when button is provoked
public void fireActionListeners(){
    if(!listeners.isEmpty()){
        ActionEvent evt = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "LukeButton");
        for(ActionListener l: listeners){
            l.actionPerformed(evt);
        }
    }
}
//Listens for click on my component
public void mousePressed(MouseEvent e){
    if(rec.contains(e.getPoint())){
        rec = new RoundRectangle2D.Float(10, 10, 100, 55, 50, 75);
        repaint();
        fireActionListeners();
    }
}
public void mouseReleased(MouseEvent e){
    if(rec.contains(e.getPoint())){
        rec = new RoundRectangle2D.Float(10, 10, 110, 60, 50, 75);
        repaint();
    }
}
//When mouse enters, make border bigger
public void mouseEntered(MouseEvent e){
    border = new BasicStroke(8);
    repaint();
}
//When mouse leaves, make border smaller
public void mouseExited(MouseEvent e){
    border = new BasicStroke(5);
    repaint();
}
public Dimension getPreferredSize(){
    return new Dimension(130, 80);
}
//Draws my button
public void paintComponent(Graphics g){

    super.paintComponent(g);

    Graphics2D g2 = (Graphics2D)g;
    g2.setRenderingHint(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
    g2.setColor(Color.BLACK);
    g2.setStroke(border);
    g2.draw(rec);
    g2.setColor(new Color(0, 204, 204));
    g2.fill(rec);
    g2.setColor(Color.BLACK);
    g2.drawString(text, 47, 45);
}
//Methods that must be over written.
public void mouseClicked(MouseEvent e){
    }
}
import java.awt.*;
导入java.awt.event.*;
导入java.awt.geom.*;
导入java.util.ArrayList;
导入javax.swing.JButton;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类LukeButton扩展JComponent实现MouseListener{
//侦听器数组列表
私有最终ArrayList侦听器=新ArrayList();
Shape rec=新的圆形矩形2D.浮动(10,10,110,60,50,75);
基本行程边界=新的基本行程(5);
SpringLayout布局=新的SpringLayout();
私有字符串文本;
公共按钮(字符串文本){
this.text=文本;
这个.setLayout(布局);
这个。addMouseListener(这个);
}
//将侦听器添加到列表中
public void addActionListener(ActionListener e){
添加(e);
}
//触发按钮时调用
public void fireActionListeners(){
如果(!listeners.isEmpty()){
ActionEvent evt=新的ActionEvent(这是ActionEvent.ACTION_执行的“LukeButton”);
for(ActionListener l:侦听器){
l、 执行的行动(evt);
}
}
}
//侦听是否单击我的组件
公共无效鼠标按下(MouseEvent e){
if(rec.contains(如getPoint())){
rec=新的圆形矩形2D.浮动(10,10,100,55,50,75);
重新油漆();
fireActionListeners();
}
}
公共无效MouseEvent(MouseEvent e){
if(rec.contains(如getPoint())){
rec=新的圆形矩形2D.浮动(10,10,110,60,50,75);
重新油漆();
}
}
//当鼠标进入时,使边框变大
公共无效鼠标事件(鼠标事件e){
边界=新的基本行程(8);
重新油漆();
}
//当鼠标离开时,使边框变小
公共无效mouseExited(MouseEvent e){
边界=新的基本行程(5);
重新油漆();
}
公共维度getPreferredSize(){
返回新维度(130,80);
}
//画我的按钮
公共组件(图形g){
超级组件(g);
图形2d g2=(图形2d)g;
g2.setRenderingHint(
RenderingHists.KEY\u抗锯齿,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.设置颜色(颜色为黑色);
g2.设定行程(边界);
g2.绘制(rec);
g2.setColor(新颜色(0,204,204));
g2.填充(rec);
g2.设置颜色(颜色为黑色);
g2.抽绳(文本,47,45);
}
//必须重写的方法。
公共无效mouseClicked(MouseEvent e){
}
}

我的问题是,我不知道如何根据字符串的大小将文本变量居中(该变量大致由什么组成)。弦的弯曲总是在一个固定点上。例如,如果文本变量等于某个较短的值,则字符串将位于左侧较远的位置。但是如果字符串太长,它会远离组件的右侧。是否有人知道如何将我的文本变量居中,使其根据字符串的大小改变其位置(或使用不同/更好的粗略解决方案)?感谢您花时间阅读:)

您可以使用以下方法获得绘制文本所需的矩形:

FontMetrics fm = g2d.getFontMetrics();
Rectangle2D rect = fm.getStringBounds(text, g2d);
然后,要使文本居中,您可以使用以下方法获得x/y位置:

int x = (getSize().width - rect.width) / 2;
int y = ((getSize().height - rect.height / 2) + rect.height;

简单的方法是使用组合,在JComponent的顶部放置一个JLabel,并将其文本居中。谢谢,帮了大忙。