@roman3847

Java Swing кнопка, которая изменяет формы при наведении курсора

Нужна кнопка, которая изменяет форму с прямоугольной на круглую при наведении курсора.
Круглую кнопку не проблема создать, но вот кнопку, которая изменяет форму, никак не могу сделать.
Круглая кнопка:
public class RoundButton extends JButton
{
 public RoundButton(String label)
 {
  super(label); 
  Dimension size = getPreferredSize();
  // Делаем нашу кнопочку вписанной в квадрат.
  // Дабы не получился у нас овал:)
  size.width = size.height = Math.max(size.width, size.height);
  setPreferredSize(size);
  // Не закрашиваем кнопочку.
  setContentAreaFilled(false);
 }
 // Рисуем нашу кнопочку.
 protected void paintComponent(Graphics g)
 {
  if (getModel().isArmed())
  {
   // Устанавливаем цвет по умолчанию.
   g.setColor(Color.lightGray);
  } 
  else
  {
   g.setColor(getBackground());
  }
  // Рисуем окружность.
  g.fillOval(0, 0, getSize().width-1, getSize().height-1);
  // Прорисовываем сам JButton.
  super.paintComponent(g);
 }
 // Рисуем бордюр кнопочки.
 protected void paintBorder(Graphics g)
 {
  g.setColor(getForeground());
  g.drawOval(0, 0, getSize().width-1, getSize().height-1);
 }

 // Определяем принадлежность точки к нашей кнопочки.
 Shape shape;
 public boolean contains(int x, int y)
 {
  // Если кнопка изменилась в размере
  // создаем новый объект shape.
  if (shape == null ||!shape.getBounds().equals(getBounds()))
  {
   shape = new Ellipse2D.Float(0, 0, getWidth(), getHeight());
  }
  // Возвращаем true если точка принадлежит
  // и false если не принадлежит кнопке.
  return shape.contains(x, y);
 }


Как я понимаю, в класс нужно встроить MouseListener и должно быть что-то вроде этого:
class RoundButton extends JComponent implements MouseListener {
 
    public RoundButton() {
       ....
        addMouseListener(this);
    }

    public void paintComponent(Graphics g) {
        ....
    }

    @Override
    public void mouseClicked(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }
}

Как это сделать? Буду рад любой помощи.
  • Вопрос задан
  • 5421 просмотр
Решения вопроса 1
@Fil
У вас есть paintComponent, вызываемый при перерисовке, который рисует кнопку. Нужно сделать так, чтобы этот метод знал что ему сейчас рисовать, то есть, знал где мышь. В слушатель мыши (им может быть и сама кнопка, как вы привели в примере, а может и другой объект) можно добавить значение bool isMouseEntered; в mouseEntered() написать isMouseEntered = true, а в mouseExited() наоборот false. Останется добавить примерно такой код в paintComponent:
if(isMouseEntered){
  //рисуем круглую кнопку 
}else{
  //вызываем дефолтный рисовальщик или сами рисуем.
  super.paintComponent(g);
}

И не забудьте добавить в конструкторе кнопки addMouseListener(this)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы