Я пытаюсь использовать округленный 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 минут) на экране начнут отображаться артефакты снизу (график монитора ЦП, часы, значки на рабочем столе и т. Д.).
Я подхожу к этому неправильно или простоделать это трудным путем?Любые предложения приветствуются, и спасибо заранее!