2010-11-13 3 views
3

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

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

alt text

Я не буду добавлять MouseListener метод, потому что они просто связаны с переключением изображений на экране.

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: добавлен раздел кода

+0

, пожалуйста, разместите самодостаточный образец кода ...упрощает просмотр того, что вы пытаетесь сделать ... и проще найти проблему ... –

+0

Что такое суперкласс «customWidget»? Кроме того, где ваш контейнер «GridLayout» настроен? –

+0

customWidget расширяет JComponent. GridLayout настраивается в тестовой программе im, используемой для проверки виджета. Поставит изображение, чтобы продемонстрировать. – Alex

ответ

3

Я предполагаю, что ваше изображение содержит только 4 объектов 'customWidget' (в 2х2 сетки).

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

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

+0

Вы точно в моем движении мысли. есть ли менеджер компоновки, который упростит настройку раздела на экране, скажем, бар высотой 110, а не все пропорциональные вещи, которые выполняют gridlayout и flowlayout? – Alex

+0

'BoxLayout' включает такие невидимые компоненты наполнителя: http://download.oracle.com/javase/tutorial/uiswing/layout/box.html#filler – trashgod

+0

Кроме того, если вы можете использовать метод trashgod, я бы настоятельно рекомендовал использовать стандартный подход. :) –

0

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

Если компоненты просто выглядеть неправильно, может быть, вы должны повторно использовать компоненты Swing, и просто напишите продавцу, чтобы узнать обо всем. & Почувствуй или измените тему.

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

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

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

+0

Thats im осознает внешний вид, но его проект команды, и я работаю над чьим-то дизайном, и они сделали все это сияющим с помощью кнопки ect с эффектом стекла. Итак, это путь, который решил принять. привет всем! – Alex

8

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

Добавление: Для example,

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); 
    } 
} 
Смежные вопросы