0

我正在使用从 JButton bui 扩展的类调用 KButton 我添加了一些代码使其更美观,例如更改字体、设置圆角边框、使用 Graphics 和 Graphics2D 更改背景。但是,当我想添加代码以使其在移动时改变颜色时,它不起作用!我的代码在这里

public class KButton extends JButton implements MouseMotionListener{

    private static final long serialVersionUID = 1L;
    public KButton(){
        setStyle();
    }
    public KButton(String text){        
        super(text);
        this.setText(text);
        setStyle();
        addMouseMotionListener(this);
    }
    public void setStyle(){
        setFont(new Font("San Serif",Font.PLAIN,12));
        setContentAreaFilled(false);
        setBorder(new RoundedBorder(3));
    }
    @Override
    protected void paintComponent(Graphics g){
        Graphics2D g2 = (Graphics2D)g.create();
        g2.setPaint(new GradientPaint(new Point(0, 0), Color.WHITE, new Point(0, getHeight()), Color.LIGHT_GRAY));
        g2.fillRect(0, 0, getWidth(), getHeight());
        g2.dispose();
        super.paintComponent(g);
    }
    @Override
    public void mouseDragged(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mouseMoved(MouseEvent arg0) {
        Graphics g=this.getGraphics();
        Graphics2D g2 = (Graphics2D)g.create();
        g2.setPaint(new GradientPaint(new Point(0, 0), Color.WHITE, new Point(0, getHeight()), Color.BLUE.brighter()));
        g2.fillRect(0, 0, getWidth(), getHeight());
        g2.dispose();
        super.setText(getText());
        setBorder(new RoundedBorder(3));
        super.paintComponent(g);
    }

}

它似乎不起作用!

4

3 回答 3

1

不要使用getGraphics. 执行自定义绘画的适当位置在paintComponent方法内。 getGraphics是对上次用于绘制组件的图形上下文的临时引用,当重新绘制组件时,任何更改都将被各种paintXxx方法中的更改覆盖。

您也应该永远不要自己调用任何paintXxx方法(当然,除非您尝试将组件渲染为图像)

相反,使用状态标志来更改paintComponent工作方式,并repaint在您想要更新状态时调用。

在您的情况下,至少有两件事会破坏您的mouseMoved方法中的绘画工作,setText以及鼠标移动本身。两者都会导致 arepaint发生。

就个人而言,我会使用MouseListener#mouseEnteredandMouseListener#mouseExited来更改按钮模型的状态(例如翻转),然后在paintComponent方法中检查该值以做出我的绘画决定

另外,请注意super.paintComponent将尝试清除图形上下文,准备绘画并且应该首先调用

于 2013-06-26T03:12:14.583 回答
0

尽管@MadProgrammer 的建议是正确的,但您可以通过设置按钮翻转图像来省略所有这些负担:

//In constructor
setRolloverImage(myRolloverImage); 

但我不确定这是确切的方法名称,做一些研究。

于 2013-06-26T04:02:45.997 回答
0

不做painting mouseMoved,只需设置属性为paint,然后重新绘制组件。此外,MouseListener 提供了 mouseEntered 和 mouseExited 事件,它们更适合这个用例。:

public class KButton extends JButton {
  private Color bottomBg = Color.LIGHT_GRAY;

  public KButton(String text) {
    super(text);
    addMouseListener(this);
  }

  @Override
  protected void paintComponent(Graphics g){
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D)g;
    g2.setPaint(new GradientPaint(new Point(0, 0), Color.WHITE, new Point(0, getHeight()), this.bottomBg));
    g2.fillRect(0, 0, getWidth(), getHeight());
  }

  public void mouseEntered(MouseEvent evt) {
    this.bottomBg = Color.BLUE.brighter();
    this.repaint();
  }

  public void mouseExited(MouseEvent evt) {
    this.bottomBg = Color.LIGHT_GRAY;
    this.repaint();
  }

  // add other MouseListener methods, or use a MouseAdapter 
  // with just those two methods overridden

}
于 2013-06-26T03:19:52.213 回答