Java swing JComponent “размер”

Я делаю проект, где мне нужны некоторые настраиваемые компоненты swing. До сих пор я создал новую кнопку с серией изображений (внешний вид Java Metal не соответствует моему пользовательскому интерфейсу). Ive внедрил MouseListener в этот новый компонент, и именно здесь возникает моя проблема. Мой виджет меняет изображение при наведении, нажимает и т. Д., За исключением того, что мой MouseListener берет запись мыши во весь контейнер GridLayout вместо изображения. Таким образом, у меня есть изображение около 200 * 100, а окружающий контейнер составляет около 400 * 200, а метод mouseEntered запускается, когда он входит в этот раздел GridLayout (даже пустые части пространства) вместо изображения. Как я могу сделать это так, чтобы он срабатывал только при наведении курсора на изображение? Ive попытался установить размер, границы и другие атрибуты безрезультатно.

EDIT: Вот демонстрация моей проблемы. Как вы можете видеть (вроде, цвета очень похожи) нижняя правая кнопка подсвечивается просто путем ввода ее раздела GridlLayout . Я хочу, чтобы это было подчеркнуто, когда я нахожусь над изображением, а не с разделом GridLayout .

alt text

Я не буду добавлять методы MouseListener потому что они просто include в себя отображение отображаемого изображения.

 public customWidget() { this.setLayout(new FlowLayout()); try { imageDef=ImageIO.read(new File("/home/x101/Desktop/buttonDef.png")); imageClick=ImageIO.read(new File("/home/x101/Desktop/buttonClick.png")); imageHover=ImageIO.read(new File("/home/x101/Desktop/buttonHover.png")); current=imageDef; } catch (IOException e) { e.printStackTrace(); } this.addMouseListener(this); } protected void paintComponent(Graphics g) { super.paintComponents(g); g.drawImage(current, 0, 0, current.getWidth(), current.getHeight(), null); } 

EDIT: добавлен раздел кода

Я предполагаю, что ваше изображение содержит ТОЛЬКО 4 объекта customWidget (в сетке 2×2).

Ваш код работает так, как я ожидал. Ваши методы MouseListener отвечают на MouseEvents для «customWidget» (а не изображение, нарисованное в «customWidget»), размер которого составляет 1/4 изображения, поэтому они будут отвечать, когда он войдет в расширенную область. Ошибка на самом деле в вашей тестовой программе, потому что вы позволяете виджет пользовательской кнопки быть больше, чем изображение.

Если вы хотите, чтобы тестовая программа обеспечивала изображение, подобное вашему, вы должны создать большую сетку (скажем, 4×4), а затем размещать свои кнопки только в каждом другом узле сетки. Поместите пустой компонент в промежутки.

В качестве альтернативы рассмотрим API-интерфейс Button , который включает в себя метод setRolloverIcon() чтобы кнопка отображала указанный значок, когда курсор проходит над ним ».

Приложение: Например ,

 import java.net.MalformedURLException; import java.net.URL; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class ButtonIconTest { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGui(); } }); } private static void createAndShowGui() { String base = "http://download.oracle.com/" + "javase/tutorial/uiswing/examples/components/" + "RadioButtonDemoProject/src/components/images/"; ImageIcon dog = null; ImageIcon pig = null; try { dog = new ImageIcon(new URL(base + "Dog.gif")); pig = new ImageIcon(new URL(base + "Pig.gif")); } catch (MalformedURLException ex) { ex.printStackTrace(System.err); return; } JFrame frame = new JFrame("Rollover Test"); JPanel panel = new JPanel(); panel.add(new JLabel(dog)); panel.add(new JLabel(pig)); JButton button = new JButton(dog); button.setRolloverIcon(pig); panel.add(button); frame.add(panel); frame.pack(); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } 

Хотя я не буду отвечать на ваш конкретный вопрос, я надеюсь, что это поможет:

Если компоненты просто выглядят неправильно, возможно, вам следует повторно использовать компоненты Swing и просто написать пользовательский Look & Feel или тему.

Это, безусловно, помогло бы гарантировать, что внешний вид приложения согласован и по крайней мере вы используете правильный инструмент для задачи, которую вы хотите выполнить.

Помните, что Java поставляется с несколькими Look & feel, включая Look & Feels, чтобы имитировать тему родной ОС.

См. http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html.

  • Один или несколько ресурсов имеют цель «голова», но не «головной» компонент был определен в представлении
  • GUI работает со скоростью 30 кадров в секунду?
  • Доступ к компонентам GUI из другого classа
  • java - Как бы я динамически добавлял компонент swing в gui при нажатии?
  • Добавление JPanels от других classов к cardLayout
  • Создание пользовательской кнопки в Java с помощью JButton
  • Как установить размер изображения с помощью RescaleOp
  • JTable Right Align Header
  • Установить альфа / непрозрачность макета
  • Как подключить одну панель к другой
  • Какова связь между ContentPane и JPanel?
  • Interesting Posts

    Туннелирование FTP-соединения из дома, где сервер принимает только локальные IP-адреса

    Java 8 Список в карту

    Java: как найти элемент через строку xpath на org.w3c.dom.document

    Джерси + jackson JSON формат даты формат – как изменить формат или использовать пользовательские JacksonJsonProvider

    Как установить текст панели инструментов и цвет стрелки назад

    Запрос пользователей, которые «любят» мою страницу в Facebook

    Ресурсы для создания компьютеров

    Скриптинг Bitlocker Расшифровка локального жесткого диска

    Укладка стрелки на всплывающих подсказках бутстрапа

    Замените места тире и сделайте все буквы в нижнем регистре

    Предоставить пароль SU в сценарии bash, в скрипте?

    Дата прибытия в Windows 10

    Ошибка конфигурации: этот раздел конфигурации не может использоваться на этом пути

    Почему микрофонный звук не работает в одностороннем режиме в Google Hangouts в Windows 7 и Chrome

    Ошибка резервного копирования Windows с помощью 0x80070002: «Система не может найти указанный файл»

    Давайте будем гением компьютера.