Java качели JComponent "размер" - PullRequest
       43

Java качели JComponent "размер"

3 голосов
/ 13 ноября 2010

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

РЕДАКТИРОВАТЬ: Вот демонстрация моей проблемы. Как вы можете видеть (вроде цвета очень похожи) нижняя правая кнопка подсвечивается путем ввода ее раздела 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);

}

РЕДАКТИРОВАТЬ: добавлен раздел кода

Ответы [ 3 ]

8 голосов
/ 13 ноября 2010

В качестве альтернативы рассмотрим API кнопки , который включает метод 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);
    }
}
3 голосов
/ 13 ноября 2010

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

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

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

0 голосов
/ 13 ноября 2010

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

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

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

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

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

...