2015-08-15 3 views
1

Итак, у меня есть пользовательский 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){ 
    } 
} 

Моя проблема заключается в том, что я не знаю, как центрировать текстовую переменную (более или менее то, что переменная состоит из) на основе размера строки. Первоначальная строка String всегда находится в фиксированной точке. Например, если текстовая переменная равна чем-то коротким, строка будет далеко слева. Но если строка слишком длинная, она идет далеко от правой части компонента. Кто-нибудь знает, как центрировать мою текстовую переменную, чтобы она меняла свою позицию на основе размера строки (или другого/лучшего решения грубого)? Спасибо за ваше время, чтобы прочитать :)

+0

Простой способ - используйте композицию и поместите JLabel поверх своего JComponent и центрируйте его текст. –

ответ

1

Вы можете получить прямоугольник требуется, чтобы нарисовать текст с помощью:

FontMetrics fm = g2d.getFontMetrics(); 
Rectangle2D rect = fm.getStringBounds(text, g2d); 

Тогда центрировать текст, который вы получили бы х/у позиции, используя что-то вроде:

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

Спасибо, помогли тонну. –

Смежные вопросы