我想为JFrame添加渐变背景。在JFrame中,我没有创建JPanel,而是使用了在创建JFrame时自动添加的JPanel。我在JPanel实例上发现的所有示例都在线调用paintComponent()
,但如上所述,在我的情况下,我并没有专门实例化一个。我知道需要在组件上调用paintComponent()
,因此无法在JFrame上调用,所以我是否需要创建和添加JPanel才能实现此目的?我过去已经成功地这样做了,但是我试图让我的代码尽可能简化,所以如果我不这样做,我就不想创建第二个JPanel。需要。这是我的代码:
public class Main extends JFrame {
private static final long serialVersionUID = 1L;
JPanel pane;
public Main() {
int WIDTH = 700, HEIGHT = 400;
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBackground(Color.GRAY);
setSize(WIDTH, HEIGHT);
setLocationRelativeTo(null);
pane = (JPanel) getContentPane();
pane.setOpaque(false);
pane.setLayout(new BorderLayout());
pane.setBorder(new EmptyBorder(20, 20, 20, 20));
// SOME OTHER STUFF
}
protected void paintComponent(Graphics grphcs) {
Graphics2D g2d = (Graphics2D) grphcs;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
GradientPaint gp = new GradientPaint(0, 0, new Color(255, 195, 225), 0, getHeight(), new Color(139, 207, 236));
g2d.setPaint(gp);
paintComponent(grphcs);
}
}
我将不胜感激。
答案 0 :(得分:3)
所以我需要创建和添加JPanel才能实现这个目标吗?
是的,你做了。
但我试图尽可能地保持我的代码流线型,所以如果我不需要,我不想创建第二个JPanel。
这里没有浪费,因为简化上述代码的方法是摆脱SharedPreferences
。没有必要这样做,有许多理由不这样做。你通过让你的类扩展JFrame来强迫你创建和显示JFrame,而通常需要更多的灵活性。事实上,我冒昧地说,我创建的大部分Swing GUI代码和我见过的不扩展了JFrame,事实上你很少想做这个。更常见的是,您的GUI类将面向创建JPanels,然后可以将其放置到JFrames或JDialogs或JTabbedPanes中,或者在需要时通过CardLayouts交换。这将大大提高GUI编码的灵活性。
如,
extends JFrame
但它是否还会创建不需要的JPanels?
这让人担心错误的事情。创建了一个JPanel,即contentPane,这对您的程序或资源的使用没有实际的负面影响。
我的实际类扩展了JPanel,所以当我实例化创建了一个时,加上我们创建JFrame时创建的默认面板。 与我以前的那种不一样,我的意思是我可以创建第二个JPanel并将其添加到我的主类(JFrame)并在其上调用paintComponent()。
如上所述 - 不要让山脉远离鼹鼠,也不要过早优化。如果您担心程序中滥用资源,请对其进行分析,然后修复具有实际效果的问题。
扩展JPanel而不是JFrame
有什么好处
我已经提到过很多 - 我上面的回答是特别令人困惑的?