Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/40: Рейтинг темы: голосов - 40, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 17.03.2018
Сообщений: 108

Смена цвета при наведении

12.03.2019, 23:21. Показов 8521. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добрый вечер, форумчане! Прошу помощи, не понимаю.

Само задание:

1) Создайте свою собственную кнопку.
2) Кнопка должна иметь форму окружности: заливка красная, а контур чёрный.
3) Размер окружности должен определяться текстом на ней.
4) При наведении курсора мыши цвет заливки окружности должен измениться на
жёлтый.
5) При отводе курсора мыши цвет заливки окружности должен вернуться обратной
на красный.


В классе JComponent имеется метод setBackground(Color bg). Он задаёт цвет
фона данного компонента. Я решил использовать его для изменения цвета
заливки кнопки. В классе MyButton добавляю:

Java
1
Public static Color bg = Color.BLUE;
и метод

Java
1
2
3
public void setBackground(Color bg) { 
this.bg = bd; 
repaint(); }
Затем в классе MyComponent в методе Public static void main(……) устанавливаю цвет фона кнопки button :

Java
1
Button.setBackground (bg);
Однако цвет фона не устанавливается.

Затем в методе Public void mousedEntered(MouseEvent me) я пытался изменить цвет фона кнопки при наведении курсора мыши на кнопку:
Button.setBackground(Color.YELLOW);

Однако цвет фона кнопки не изменился.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.03.2019, 23:21
Ответы с готовыми решениями:

Постепенная смена цвета
Всем привет! Подскажите, как можно постепенно сменить цвет с красного до белого, например. Пробовал сделать статичную функцию с...

Смена цвета круга по нажатию кнопки
import java.awt.event.*; import java.awt.*; import javax.swing.*; public class Gitis implements ActionListener{ JFrame...

Смена цвета сторон куба по таймеру и источник света [OpenGL]
Здравствуйте, я новичок изучаю OpenGL и не получается реализовать две функции: смена цвета сторон куба по событию и добавления источника...

3
0 / 0 / 0
Регистрация: 17.03.2018
Сообщений: 108
14.03.2019, 12:22  [ТС]
Код:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package mycomponent; 
 
import java.awt.Color; 
import static java.awt.Color.RED; 
import java.awt.Cursor; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.JFrame; 
 
 
public class MyComponent { 
 
/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
// создание своей собственной кнопки со своим внешним видом 
 
JFrame frame = new JFrame("Изображение"); 
frame.setBounds(600, 400, 850, 400); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.setVisible(true); 
 
frame.setLayout(new FlowLayout()); 
MyButton button = new MyButton("Моя хор. кнопка", Color.BLUE); 
button.setPreferredSize(new Dimension(200, 100)); 
 
button.setBackground(Color.GRAY); 
 
System.out.println(MyButton.bg); 
button.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); // устанавливаем форму курсора при наведении на кнопку 
 
button.addMouseListener(new MouseListener() { //установка обработчика событий на кнопку 
@Override 
public void mouseClicked(MouseEvent me) { 
MyButton button = (MyButton) me.getSource(); 
System.out.println("Кнопка нажата"); 
button.setBackground(Color.CYAN); 
 
} 
@Override 
public void mousePressed(MouseEvent me) { 
} 
 
@Override 
public void mouseReleased(MouseEvent me) { 
} 
 
@Override 
public void mouseEntered(MouseEvent me) { 
MyButton button = (MyButton) me.getSource(); // получаем объект, на котором произошло событие с помощью метода getSource() объекта me 
button.setColor(Color.RED); 
// System.out.println("Указатель над кнопкой"); 
// Color newColor = new Color(255, 0, 0); 
button.setBackground(Color.BLUE); 
 
} 
 
@Override 
public void mouseExited(MouseEvent me) { 
MyButton button = (MyButton) me.getSource(); 
button.setColor(Color.BLACK); 
button.setBackground(Color.YELLOW); 
} 
 
}); 
frame.add(button); 
}

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package mycomponent; 
 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.FontMetrics; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import javafx.scene.layout.Background; 
import javax.swing.JComponent; 
 
/** 
* 
* @author Admin 
*/ 
public class MyButton extends JComponent { 
 
private String title; 
private Color color = Color.BLACK; 
 
public static Color bg = Color.BLUE; 
 
public MyButton(String title, Color bg) { 
this.title = title; 
this.bg = bg; 
} 
 
 
 
public void setColor(Color color) { 
this.color = color; 
repaint(); 
} 
public void setBackgroud(Color bg) { 
this.bg = bg; 
repaint(); 
 
} 
 
@Override 
public void paint(Graphics g) { 
super.paint(g); 
Graphics2D g2 = (Graphics2D) g; 
Font font = new Font("Arial", Font.BOLD, 20); 
FontMetrics metrics = g.getFontMetrics(font); 
int x = (getWidth() - metrics.stringWidth(title)) / 2; 
int y = ((getHeight() - metrics.getHeight()) / 2) + metrics.getAscent(); 
g2.setFont(font); 
g2.setBackground(Color.DARK_GRAY); 
// g2.drawRect(0, 0, getWidth() -1 , getHeight() - 1 ); 
// Color bg = new Color(0, 255, 0); 
g2.drawOval(0, 0, getWidth() -1 , getHeight() - 1 ); 
g2.setColor(bg); 
g2.setColor(Color.CYAN); 
// g2.fillOval(1, 1, getWidth() -2 , getHeight()- 2 ); 
// Color orig = getBackground(); 
// g2.drawOval(60, 30, 90, 60); 
g2.setColor(color); 
g2.drawString(title, x, y); 
} 
 
}
0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
14.03.2019, 14:08
так у вас ничего не получится.

Посмотрите пример:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package base;
 
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
 
 
public class NextColor
{
    public JFrame win;
    
    
    public NextColor()
    {
        makeWindow();
        makeButton();
    }
 
    
    private void makeWindow()
    {
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(800, 600));
        panel.setOpaque(false);
        win = new JFrame("Кнопка");
        win.add(panel);
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        win.setResizable(false);
        win.pack();
        win.setLayout(null);
        win.setLocationRelativeTo(null);
        win.setVisible(true);
    }
    
    
    private void makeButton()
    {
        JButton jb = new JButton("Кнопка");
        jb.setBounds(350, 250, 100, 100);
        jb.addMouseListener(new MouseListener()
        {
            public void mouseClicked(MouseEvent e)
            {
                //...
            }
 
             
            public void mouseEntered(MouseEvent e)
            {
                makeCircle(((JButton) e.getSource()), 255, 160, 122);
            }
 
             
            public void mouseExited(MouseEvent e)
            {
                makeCircle(((JButton) e.getSource()), 205, 92, 92);
            }
 
             
            public void mousePressed(MouseEvent e)
            {
                //...
            }
 
             
            public void mouseReleased(MouseEvent e)
            {
                //...
            }
        });
        jb.setMargin(new Insets(0,0,0,0));
        jb.setHorizontalTextPosition(SwingConstants.CENTER);
        jb.setForeground(Color.BLACK);
        jb.setOpaque(false);
        jb.setContentAreaFilled(false);
        jb.setBorderPainted(false);
        jb.setFocusPainted(false);
        jb.setLayout(null);
        win.add(jb);
        
        makeCircle(jb, 205, 92, 92);
    }
    
    
    private void makeCircle(JButton jb, int red, int green, int blue)
    {
        int sizeLine = 3;
        
        BufferedImage bf = new BufferedImage(jb.getWidth(), jb.getHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics g = bf.createGraphics();
        Graphics2D g2 = (Graphics2D)g;
 
        g2.setColor(new Color(red,green,blue,255));
        g2.fillOval(sizeLine, sizeLine, jb.getWidth()-sizeLine*2, jb.getHeight()-sizeLine*2);
        g2.setColor(new Color(0,0,0,255));
        g2.setStroke(new BasicStroke((float) sizeLine, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
        g2.drawOval(sizeLine, sizeLine, jb.getWidth()-sizeLine*2, jb.getHeight()-sizeLine*2);
        g2.dispose();
        
        jb.setIcon(new ImageIcon(bf));
        jb.repaint();
 
        bf.flush();
    }
    
    
    public static void main(String[] args)
    {
        new NextColor();
    }
}
Не дробите код на классы если четко не можете сделать его универсальным, так вы для себя создаёте больше путаницы. Всю графику без исключений рисуйте в bitmap, конечно работать будет если как у вас в классе рисовать, но такой метод сильно перегружает поток если вы используете прозрачность, это я к тому, если вы шагнете дальше кнопки.
1
0 / 0 / 0
Регистрация: 07.08.2020
Сообщений: 1
07.08.2020, 22:35
Чтобы работал метод
Java
1
public void setBackground(Color bg)
нужно в
Java
1
2
3
4
5
public void paint(Graphics g) {
  ...
  g2.setBackground(Color.DARK_GRAY); // этот метод здесь не работает
  ...
}
вместо
Java
1
g2.setBackground(Color.DARK_GRAY);
написать метод с которым работает Graphics2D g2:
Java
1
2
        g2.setColor(bg);
        g2.fillOval(0, 0, getWidth() - 1, getHeight() - 1);
у меня так работает:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2 = (Graphics2D) g;
        Font font = new Font("Arial", Font.BOLD, 20);
        FontMetrics metrics = g.getFontMetrics(font);
        int x = (getWidth() - metrics.stringWidth(title)) / 2;
        int y = ((getHeight() - metrics.getHeight()) / 2) + metrics.getAscent();
        g2.setFont(font);
        g2.setColor(bg);
        g2.fillOval(0, 0, getWidth() - 1, getHeight() - 1);
        g2.setColor(Color.BLACK);
        g2.drawOval(0, 0, getWidth() - 1, getHeight() - 1);
        g2.setColor(color);
        g2.drawString(title, x, y);
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.08.2020, 22:35
Помогаю со студенческими работами здесь

Смена цвета при наведении
Перепробовал несколько способов, но при наведении цвет не меняется на более светлый. Помогите, пожалуйста:( <a...

Смена цвета autocomplete при наведении
Подскажите, пожалуйста, как сменить цвет при наведении? Использую стандартный плагин jQuery autocomplete...

Смена цвета текста при наведении курсором
Привет. На форуме нашел не одному подобную тему ,но они мне не помогли. Есть САЙТ ( не реклама ) На главной странице есть...

Смена цвета панели при наведении курсора
Здравствуйте! На форме расположено несколько панелей, допустим 20, называются они допустим p1,p2..p20 Как сделать, чтобы при наведении...

Смена цвета текста и фона при наведении на кнопки
Создайте HTML страницу ,в которой задать две кнопки "Основная" и "Дополнительная" при наведении мыши на которые менялся бы цвет текста...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru