【发布时间】:2023-11-10 15:14:02
【问题描述】:
我用谷歌搜索但找不到正确的答案。我有一个JPanel,我希望它有一个从上到下的渐变。我只会使用两种颜色。我怎样才能做到这一点?
【问题讨论】:
标签: java swing awt jpanel gradient
我用谷歌搜索但找不到正确的答案。我有一个JPanel,我希望它有一个从上到下的渐变。我只会使用两种颜色。我怎样才能做到这一点?
【问题讨论】:
标签: java swing awt jpanel gradient
给你:
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(..)
setSize() 调用是为了在屏幕上显示某些内容。在这种情况下,我不想覆盖 getPreferredSize(),因为我的理解是 Panel 稍后将实际用于设置 LayoutManager 并添加组件,因此,getPreferredSize() 应该由该 LayoutManager 计算,而不是任意大小.无论如何,这只是吹毛求疵,我相信这两种解决方案都是可以接受的。
GradientPaint 对于两种颜色渐变更快,LinearGradientPaint 只允许更多颜色;)
你可以用这个:
JPanel 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());
}
};
希望有所帮助; 您还可以返回此文章获取更多帮助: Gradient background to any jcomponent
【讨论】:
JComponent.setOpaque(false); 是一个关键因素,super.paintComponent(grphcs); 必须是最后一次调用。否则,您的代码将无法与所有 JComponent 对象一起使用,而且对于任何未来的更改也不可靠。但感谢您的指点。