JComponent Child не рисует после переопределения функции Parent PaintComponentJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 JComponent Child не рисует после переопределения функции Parent PaintComponent

Сообщение Anonymous »

У меня есть JButton, в котором я переопределил функцию PaintComponent(Graphics)с помощью дочерней JLabel (я понимаю, что это звучит глупо, обещаю, что это не так)
У меня есть mouseEntered(MouseEvent ) и mouseExited(MouseEvent) функции, которые изменяют видимость метки, а также устанавливают логическое значение, указывающее PaintComponent рисовать полупрозрачное наложение над кнопкой
Ожидаемое поведение заключается в том, что JLabel рисуется поверх наложения кнопки. Без наложения (переопределения PaintComponent) это работает отлично.
(Я предполагаю, что это не ограничивается только кнопками, хотя я не проверял эту теорию)
Класс кнопки:

Код: Выделить всё

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class HoverButton extends JButton {

private final JLabel label;
private final String title;

private boolean entered = false;

public HoverButton(String title) {
label = new JLabel(title);
this.title = title;
int startChar = title.indexOf(']') + 1;
String regex = new StringBuilder("\\[[a-zA-Z0-9]+\\]").append("| \\[[A-Za-z0-9]+ [A-Za-z0-9]+\\]")
.append("| \\(decen\\)").append("| \\(eng, decen\\)").append("| \\(eng\\)")
.append("|\\{.+\\}").toString();
String text = String.format("
%s[/b]
",
title.substring(startChar).replaceAll(regex, "").trim());
label.setVisible(false);
add(label);
addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
super.mouseEntered(e);
entered = true;
label.setVisible(true);
}

@Override
public void mouseExited(MouseEvent e) {
super.mouseExited(e);
entered = false;
label.setVisible(false);
}
});
}

public String getTitle() {
return title;
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (g instanceof Graphics2D g2d) {
getIcon().paintIcon(this, g, getInsets().left, getInsets().top);
int xMax = getWidth() - getInsets().right - getInsets().left;
int yMax = getHeight() - getInsets().top - getInsets().bottom;
if (entered) {
g2d.setColor(new Color(0x88000000, true));
g2d.fillRect(getInsets().left, getInsets().top, xMax, yMax);
}
g2d.dispose();
}
}

@Override
public void setPreferredSize(Dimension d) {
super.setPreferredSize(new Dimension((int) (d.getWidth() + getInsets().right + getInsets().left),
(int) (d.getHeight() + getInsets().top + getInsets().bottom)));
label.setMinimumSize(d);
}
}
setPreferredSize(Dimension) внизу предназначен для того, чтобы метка не изменяла размер кнопки

Код: Выделить всё

    button.setIcon(icon);
button.setPreferredSize(new Dimension(icon.getWidth(), icon.getHeight()));
должен находиться в вызывающем классе

Подробнее здесь: https://stackoverflow.com/questions/792 ... t-function
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • JComponent Child не рисует после переопределения функции Parent PaintComponent
    Anonymous » » в форуме JAVA
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Почему window.top.parent не является нулевым и почему window.top.parent - это window.top?
    Anonymous » » в форуме Javascript
    0 Ответы
    59 Просмотры
    Последнее сообщение Anonymous
  • В C# можно ли привести List к List?
    Anonymous » » в форуме C#
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Отображение значений в детализированном SelectOneMenus (Parent-Child)
    Anonymous » » в форуме JAVA
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Как настроить JComponent для перемещения с помощью TAB вместо CTRL+TAB без использования isManagingFocus()
    Anonymous » » в форуме JAVA
    0 Ответы
    38 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»