JButton с градиентом и закругленными краями на JPanel с фоновым изображением - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь использовать округленный JButton с градиентом на JPanel с фоновым изображением.У меня есть фоновое изображение, загружаемое в JPanel, и у меня есть показ JButton с градиентом и закругленными краями.Однако, когда я перемещаю мышь над кнопкой, углы показывают границу основной прямоугольной области кнопки.Я попытался добавить пустые события mouseEntered и mouseExited в мой класс JGradientButton, но это не помогло.Я получаю одинаковый результат на Windows 10 Pro и Raspbian на Raspberry Pi 3.

Вот мой код ...

package roundbutton;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Point;
import java.io.InputStream;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class RoundButton {
    private static JFrame homeFrame;
    private static JPanel homePanel;
    private static JGradientButton homeGetStartedButton;
    private static InputStream isBackground;

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                try {
                    isBackground = this.getClass().getResourceAsStream("Beautiful-Gradient-Wallpaper.jpg");
                    //https://wallpaper.wiki/wp-content/uploads/2017/06/Beautiful-Gradient-Wallpaper.jpg
                } catch (Exception ex) {
                    isBackground = null;
                    System.out.println("getResource exception: " + ex.getMessage());
                }
                createAndShowGUI();
            }
        });
    }
    private static class JGradientButton extends JButton {
        private JGradientButton() {
            super("Gradient Button");
        }

        @Override
        protected void paintComponent(Graphics g) {
            Color blueGradientTop = new Color(0,55,128);
            Color blueGradientBottom = new Color(0,177,224);
            final Graphics2D g2 = (Graphics2D) g.create();
            g2.setPaint(new GradientPaint(
                    new Point(0, 0), blueGradientTop,
                    new Point(getWidth(), getHeight()), blueGradientBottom));
            g2.fillRoundRect(0, 0, getWidth(), getHeight(), 100, 100);
            //g2.fillRect(0, 0, getWidth(), getHeight());
            g2.dispose();
            super.paintComponent(g);
        }

        protected void mouseEntered(java.awt.event.MouseEvent evt) {
        }

        protected void mouseExited(java.awt.event.MouseEvent evt) {
        }

        public static JGradientButton newInstance() {
            return new JGradientButton();
        }
    }

    private static class myPanel extends JPanel {
        public myPanel() {
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if(isBackground != null) {
                try {
                    Image backImage = ImageIO.read(isBackground);
                    final Graphics2D g2 = (Graphics2D) g.create();
                    g2.drawImage(backImage, 0, 0, getWidth(), getHeight(), this);
                    g2.dispose();
                } catch (Exception ex) {
                    System.out.println("backImage exception: " + ex.getMessage());
                }
            }
        }
    }
    private static void createAndShowGUI() {
        homeFrame = new JFrame("Rounded Button Test");
        homeFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        homeFrame.setBounds(0, 0, 1024, 768);

        homePanel = new myPanel();
        homePanel.setLayout(new GridBagLayout());
        homePanel.setOpaque(false);
        homePanel.setFocusable(false);
        homePanel.setMaximumSize(new Dimension(1024, 768));
        homePanel.setMinimumSize(new Dimension(1024, 768));
        homePanel.setPreferredSize(new Dimension(1024, 768));
        homeFrame.add(homePanel);

        homeGetStartedButton = new JGradientButton();
        homeGetStartedButton.setText("<html><p align=\"center\">Touch Here To<br>Get Started</p></html>");
        homeGetStartedButton.setFont(new java.awt.Font("Arial", 0, 72));
        homeGetStartedButton.setForeground(Color.white);
        homeGetStartedButton.setContentAreaFilled(false);
        homeGetStartedButton.setBorderPainted(false);
        homeGetStartedButton.setFocusPainted(false);
        homeGetStartedButton.setFocusable(false);
        homeGetStartedButton.setMaximumSize(new Dimension(676, 507));
        homeGetStartedButton.setMinimumSize(new Dimension(676, 507));
        homeGetStartedButton.setPreferredSize(new Dimension(676, 507));
        homePanel.add(homeGetStartedButton);

        homeFrame.setVisible(true);
     }    
}

Вот что показывает, когда я запускаю программу ... Снимок экрана при запуске программы

Как только мышь перемещается по кнопке, вот как это выглядит ... Снимок экрана после перемещения мыши по кнопке

Я делаю работу с кодом в Windows 10, но программа, над которой я работаю, будет использоваться на Raspberry Pi 3. Изначально я подошел к этому с помощью JavaFX, что облегчало работу с графическим интерфейсом.Однако это больше не поддерживается напрямую в Raspbian.Я нашел ссылки, которые позволили мне запустить код JavaFX на Pi3, но графический интерфейс не был стабильным.После непродолжительного запуска программы (10-15 минут) на экране начнут отображаться артефакты снизу (график монитора ЦП, часы, значки на рабочем столе и т. Д.).

Я подхожу к этому неправильно или простоделать это трудным путем?Любые предложения приветствуются, и спасибо заранее!

...