Создание невидимой кнопки в Java Swing - PullRequest
2 голосов
/ 01 января 2011

Я много раз видел в графических интерфейсах Java Swing кнопки, которые выглядят как изображения, пока на них не наведет курсор мыши.Похоже, они не заполнили свою область содержимого.Когда на них наведет курсор мыши, область содержимого заполняется, но кнопка выглядит так, как будто мышь над ней не зависает.Примером этого может служить панель инструментов кнопок, используемых для активации каждой демонстрации в SwingSet2.

Как этот эффект возможен?

РЕДАКТИРОВАТЬ: Вот изображения, которые иллюстрируют мойвопрос:

Состояние по умолчанию
button_default.png

Состояние при наведении
button_hover.png

Clicked (Active) State
button_active.png

Они используют Window Look & Feel в Vista.Изображения были получены с демонстрационной панели инструментов SwingSet2.

Спасибо!

Ответы [ 5 ]

1 голос
/ 09 марта 2012

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

 public JPanel hooverImages(){
        JPanel panel;
        ImageIcon icon;
        Image img;
        JButton button;
        String name = "image"


        icon = new ImageIcon(getClass().getResource("/gui/resources/"
                + name+".png"));
        img = icon.getImage(); 

        button = new JButton(new ImageIcon(img.getScaledInstance(30, 30
                , Image.SCALE_SMOOTH))); //adds resized image to button.
        button.setBounds(20, 0, 40, 40);
        button.setContentAreaFilled(false); //this is the piece of code you needed
        button.addMouseListener(new MouseAdapter(){
            @Override
            public void mouseEntered(MouseEvent event){
                JButton buton = (JButton)event.getSource();
                buton.setContentAreaFilled(true);  //when hoovered it will show borders and fill area.
            }

            @Override
            public void mouseExited(MouseEvent event){
                JButton buton = (JButton)event.getSource();
                buton.setContentAreaFilled(false); //when mouse is not on button then it will look the same.
            }
        });
        panel.add(button);

     return panel;
}
0 голосов
/ 16 марта 2013

щелкните правой кнопкой мыши на кнопке jButton, выберите «Свойства» и установите для параметра «Непрозрачность» значение falseИЛИ добавьте это в свой код.JButton.setvisible (ложь);

0 голосов
/ 01 января 2011

Обновление Это то, что вы хотите. Плоская кнопка

Я знаю, что это говорит о Windows L & F, которую вы можете установить в SwingSet2, но это не значит, что SwingSet2 не заменил некоторые из базовых обработчиков пользовательского интерфейса для получения эффектаони нужны вместе с использованием Windows L & F.

Оригинальный ответ

Грубая версия без картинок.Измените границы и цвета в соответствии с вашими потребностями.

 public static void main(String[] args) {
    JFrame frame = new JFrame("Example");
    frame.setLayout(null);
    frame.setSize(800, 600);
    JButton button = new JButton("Hover Me");
    button.setBackground(Color.LIGHT_GRAY);
    button.setBounds(10, 10, 60, 40);
    button.setBorder(BorderFactory.createEmptyBorder());
    button.addMouseListener(new MouseAdapter() {

        @Override
        public void mouseEntered(MouseEvent e) {
            JButton button = (JButton) e.getComponent();
            button.setBackground(Color.LIGHT_GRAY.brighter());
            button.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
        }

        @Override
        public void mouseExited(MouseEvent e) {
            JButton button = (JButton) e.getComponent();
            button.setBackground(Color.LIGHT_GRAY);
            button.setBorder(BorderFactory.createEmptyBorder());
        }
    });
    frame.add(button);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setVisible(true);
}
0 голосов
/ 03 января 2011

Если вы добавите JToggleButton со значком в JToolBar, он будет вести себя так.Если вы не хотите, чтобы он был на панели инструментов, попробуйте setBorderPainted(false).Я знаю, что это работает на GTK LaF, попробуйте это с Windows.

0 голосов
/ 01 января 2011

Прошло много времени с тех пор, как я играл с этим, но я полагаю, что это от setRolloverIcon JButton, унаследованного от AbstractButton.Я полагаю, что вы также должны включить опрокидывание.

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