2013-06-26 4 views
0

Я использую мой вызов класса KButton, который простирается от JButton bui. Я добавляю код, который делает его более красивым, например, изменение шрифта, установка округлой границы, изменение фона с помощью Графика и графика2D. Однако это не работает, когда я хочу добавить код, чтобы он менял цвет при перемещении! мой код находится здесьКак изменить фон расширенного JButton в java, когда мышь над

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); 
    } 

} 

и кажется не работает!

+0

Вы можете изучить пользовательскую PLAF. –

ответ

0

Хотя @ MadProgrammer-х советы верно, вы можете пропустить всю эту нагрузку, установив кнопки опрокидывание изображения:

//In constructor 
setRolloverImage(myRolloverImage); 

Но я не уверен, что это точное название метода, сделать некоторые исследование.

1

Не использовать getGraphics. Предполагаемое место для выполнения пользовательской живописи находится в пределах метода paintComponent. getGraphics - это временная ссылка на контекст графики, используемый последним для рисования компонента, когда компонент перекрашивается, любые изменения будут переопределены теми, которые используются в различных методах paintXxx.

Вы не должны, кроме того, никогда не позвоните какому-либо из paintXxx методов самостоятельно (если вы не пытаетесь вынести компонент к изображению, конечно)

Вместо этого следует использовать государственный флаг для изменения так, что paintComponent работы и вызовите repaint, если вы хотите обновить состояние.

В вашем случае есть, по крайней мере, две вещи, которые разрушают ваши усилия по рисованию в вашем методе mouseMoved, setText и самом движении мыши. Оба из них вызовут repaint.

Лично я хотел бы использовать MouseListener#mouseEntered и MouseListener#mouseExited вместо этого и изменить состояние модели кнопки (для перевернулась, например), а затем изучить это значение в методе paintComponent, чтобы мои решения живописи

Кроме того, нужно учитывать, что super.paintComponent попытается очистить графический контекст, подготовиться к покраске и должен называться первым

0

Не выполняйте рисование в mouseMoved, просто установите свойства для рисования и затем перерисуйте компонент. Кроме того, 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 

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