我目前正在做 GUI 開發JavaSwing。我正在嘗試創建一個button類似于HTML下面描述的代碼JButton,該代碼已添加到 中getContentPane(),但我不知道該怎么做并且不知所措。
當前代碼:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setTitle("TITLE");
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(1000, 800);
frame.getContentPane().setLayout(new FlowLayout());
JButton button = new JButton("Click Here");
frame.getContentPane().add(button);
button.setBackground(Color.RED);
button.setForeground(Color.WHITE);
button.setOpaque(true);
button.setPreferredSize(new Dimension(150, 50));
}
}
我試圖創建的物體有點難以用嘴巴解釋,所以我試圖重現我試圖使用 HTML 創建的內容。如下:
HTML 代碼:
<div class="btn">Click Here</div>
<style>
.btn {
background-color: red;
display: inline-block;
height: 70px;
width: 150px;
text-align: center;
color: white;
padding-top: 35px;
font-size: 25px;
border-radius: 50px;
box-shadow: 0px 5px #b70d0b;
opacity: 0.7;
cursor: pointer;
}
.btn:hover {
opacity: 1;
}
.btn:active{
position: relative;
top: 5px;
box-shadow: none;
}
</style>
這是執行時的樣子:下圖是我在JavaSwing.

這次的問題是:
設定
opacity為JButton_JavaSwing設定
border-radius為buttonopacity僅當滑鼠hovers懸停button并MouseEvent檢測到它時才設定為 1。設定
box-shadow為5px,ActionListener用于檢測活動的間隔,使其看起來像button被按下。在
cursor:pointer滑鼠懸停在button.
我不確定這是否要求太多。我完全知道問題太多了,所以如果你能回答我能回答的問題,我將不勝感激。
同時,我對這個問題進行了自己的谷歌研究,但沒有一個符合我的理想,所以我在這里問它。
至于我做了什么,這就是我所做的:
我看了
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
public class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setBorder(new EmptyBorder(32, 32, 32, 32));
setLayout(new GridBagLayout());
FancyButton btn = new FancyButton();
btn.setText("Click me");
add(btn);
}
}
public class FancyButton extends JButton {
private int cornerRadius = 32;
private BufferedImage backgroundImage;
private float alpha = 0.25f;
public FancyButton() {
setBackground(Color.RED);
setForeground(Color.WHITE);
// This is important
setBorderPainted(false);
// This is important
setContentAreaFilled(false);
// This is important
int padding = cornerRadius / 2;
setBorder(new EmptyBorder(padding, padding, padding, padding));
addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
alpha = 1;
repaint();
}
@Override
public void mouseExited(MouseEvent e) {
alpha = 0.25f;
repaint();
}
});
addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
backgroundImage = null;
}
});
}
@Override
public boolean isOpaque() {
return false;
}
@Override
public Insets getInsets() {
Insets insets = super.getInsets();
insets.bottom = 5;
return insets;
}
@Override
public Insets getInsets(Insets insets) {
super.getInsets(insets);
insets.bottom = 5;
return insets;
}
@Override
protected void paintComponent(Graphics g) {
if (backgroundImage == null) {
backgroundImage = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = backgroundImage.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(getBackground().darker());
g2d.fillRoundRect(0, 5, getWidth(), getHeight() - 5, cornerRadius, cornerRadius);
g2d.setColor(getBackground());
g2d.fillRoundRect(0, 0, getWidth(), getHeight() - 5, cornerRadius, cornerRadius);
g2d.dispose();
}
Graphics2D g2d = (Graphics2D) g.create();
g2d.setComposite(AlphaComposite.SrcOver.derive(alpha));
g2d.drawImage(backgroundImage, 0, 0, this);
super.paintComponent(g2d);
g2d.dispose();
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/487467.html
下一篇:無法使用CSS移動按鈕
