绘制自定义JButton和文本行

时间:2010-10-31 22:41:25

标签: java swing jbutton

我正在设计一个大城市公共交通的优化系统。所以我有一张地图上有一些点,但不关心它)
我所需要的只是:我自己的JButton,看起来像一个颜色填充的圆圈和靠近它的小文本标签。我在覆盖paintComponent()方法时遇到了一些问题。圆形按钮被正确绘制,但不是文本 但是,当我手动调整窗口大小时,文本会显示一秒钟,然后再次重新绘制并消失。 希望你们了解我的需求,谢谢你的帮助;)

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


public class JRoundButton extends JButton { 

String label;
Color color;
int x,y;
public JRoundButton(Color color,int x,int y,String str)
{
    label=str;
    this.x=x;
    this.y=y;   
    this.color=color;       
}

protected void paintComponent(Graphics g)  
    {
    super.paintComponent(g);
    Dimension size = getPreferredSize();
    setPreferredSize(size);
    this.setBounds(0, 0, 10, 10);
    setContentAreaFilled(false);

    g.setFont(new Font("Arial",Font.BOLD,14));
    g.drawChars(label.toCharArray(), 0, label.length(), 12,12);
    g.fillOval(0,0,8,8);
}

public void paintBorder(Graphics g)
    {
    g.setColor(Color.white);
    g.drawOval(0,0, 9, 9);
}
public static void main(String[] args)  
    {
    JButton button = new JRoundButton(Color.GRAY,150,150,"Times Square");

    JFrame frame = new JFrame();
    frame.getContentPane().setBackground(Color.black);
    frame.setSize(300, 300);
    frame.setVisible(true);
    frame.add(button);
}

}

3 个答案:

答案 0 :(得分:1)

似乎调用'setBounds(0,0,10,10)'设置的组件足迹太小而无法容纳文本字符串。将边界扩展到100px宽并将点大小降低到6看起来可以正常工作。

答案 1 :(得分:1)

1)永远不要在paintComponent()方法中设置按钮的属性。

Dimension size = getPreferredSize(); 
setPreferredSize(size); 
this.setBounds(0, 0, 10, 10); 
setContentAreaFilled(false); 

摆脱上述代码。

2)不要在paintComponent()方法中设置Graphics对象的Font。这就是setFont(...)方法的用途。

3)没有必要做任何自定义绘画。如果你想要一个圆圈,那么在JLabel上添加一个Icon。

4)不要覆盖paintBorder()方法。如果你想要一个Border,那么创建一个自定义边框并使用setBorder()方法将其添加到按钮。

简而言之,无需延长按钮。摆脱你的JRoundButton课程。您的代码应该看起来像:

JButton = new JButton("Times Square");
button.setFont( new Font("Arial",Font.BOLD,14) );
button.setIcon( new OvalIcon(Color.WHITE, iconSize) );

当然,您需要创建一个OvalIcon类,但这很容易实现,因为只有三种方法,您已经知道绘制代码应该是什么。

答案 2 :(得分:0)

我只是在JButton的文本中作弊并使用unicode圈。 E.g:

import javax.swing.*;

JFrame frame = new JFrame();
frame.getContentPane().add(new JButton("<html><font size='+10' color='red'>&#x25CF;</font> I'm next to a red circle!</html>"));
frame.pack();
frame.show();