我搜索了一下,但没有找到正确的答案。我有一个JPanel
,我想让它从上到下有一个渐变效果。我只想使用两种颜色。我该如何实现?
给你:
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class TestPanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
int w = getWidth(), h = getHeight();
Color color1 = Color.RED;
Color color2 = Color.GREEN;
GradientPaint gp = new GradientPaint(0, 0, color1, w, h, color2);
g2d.setPaint(gp);
g2d.fillRect(0, 0, w, h);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
TestPanel panel = new TestPanel();
frame.add(panel);
frame.setSize(200, 200);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
JPanel
зҡ„getPreferredSize()
ж–№жі•пјҢ并еңЁJFrame
дёҠи°ғз”Ёpack()
иҖҢдёҚжҳҜи°ғз”ЁsetSize(..)
ж–№жі•гҖӮ - David KroukampsetSize()
调用是为了在屏幕上显示一些东西。在这种情况下,我不想覆盖 getPreferredSize()
,因为我的理解是该面板稍后将实际用于设置布局管理器并添加组件,因此 getPreferredSize()
应由该布局管理器计算而不是任意大小。无论如何,这只是挑剔,我相信两种解决方案都是可以接受的。 - Guillaume PoletJComponent
对象。Mohammed Sayed 提供了一种通用的方法,通过设置原始对象的不透明度并将其作为最后一个操作进行绘制:http://www.javarichclient.com/how-to-add-a-gradient-background-to-any-jcomponent/ - class stackerJPanel contentPane = new JPanel() {
@Override
protected void paintComponent(Graphics grphcs) {
super.paintComponent(grphcs);
Graphics2D g2d = (Graphics2D) grphcs;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
GradientPaint gp = new GradientPaint(0, 0,
getBackground().brighter().brighter(), 0, getHeight(),
getBackground().darker().darker());
g2d.setPaint(gp);
g2d.fillRect(0, 0, getWidth(), getHeight());
}
};
希望能帮到您;您还可以返回这篇文章获取更多帮助:如何给任何J组件添加渐变背景
JComponent.setOpaque(false);
是一个关键因素,而 super.paintComponent(grphcs);
需要是最后一次调用。否则,你的代码将无法与所有 JComponent
对象一起使用,并且在未来的任何更改方面都不够健壮。但还是感谢你的指引。 - class stacker