我已经学习Java几周了,在将背景图像应用到JFrame时我真的很困惑。我遇到的每个教程都没有按照我的方式创建框架(我扩展JFrame),或者如果他们这样做,说明不够清晰,我无法理解。
下面的代码来自我自己的项目,所以帮助我练习到目前为止我学到的东西。请你可以在下面的代码的基础上,向我解释添加什么和在哪里,所以我可能有一个图像作为我的框架的背景?
我真正欣赏的一件事是,如果你能解释事情是如何运作的,为什么需要以及他们实际在做什么 - 我不喜欢盲目地复制和粘贴你所做的事情而没有任何线索的想法这个怎么运作。解释越深入越好;即使它听起来很光顾。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class MiniPad extends JFrame implements ActionListener {
JPanel pan = new JPanel();
ClassLoader ldr = this.getClass().getClassLoader();
ImageIcon closeImg = new ImageIcon(ldr.getResource("\\images\\buttons\\closeBtn.png"));
JTextArea note = new JTextArea("", 6, 21);
JScrollPane notes = new JScrollPane(note);
JButton close = new JButton(closeImg);
public static void main(String[] args) {
MiniPad padgui = new MiniPad();
} //Instance of GUI
public MiniPad() {
super("Notepad");
setSize(265, 191);
setDefaultCloseOperation(EXIT_ON_CLOSE);
add(pan);
setVisible(true);
//Specifications
note.setLineWrap(true);
note.setWrapStyleWord(true);
notes.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
close.setBorderPainted(false);
close.setContentAreaFilled(false);
close.setOpaque(false);
//Adding to JPanel 'pan'
pan.add(notes);
pan.add(close);
close.addActionListener(this);
}
public void actionPerformed(ActionEvent event) {
if (event.getSource() == close) {
setVisible(false);
}
}
}
答案 0 :(得分:3)
关于你的问题,因为它标题为
您需要设置自定义Component
(例如JPanel
)并覆盖paintComponent
方法
看看
现在,您将遇到一些问题,注释窗格将阻止大部分背景,遮挡图像。这不应该阻止尝试;)
您需要熟悉如何制作Swing组件transparent。
一些反馈;)
我认为您不需要保留对Classloader
的引用,因为您正在使用它,它只是增加了代码的重量和复杂性。这不是一个大问题,但我的第一个问题是,“他使用类加载器的原因是什么?”
我可能也会采用某种命名约定。通常更冗长一点会使代码更容易理解。
close
??这是一个动作吗?也许像“closeButton”这样的东西,至少我知道它是某种类型的按钮
答案 1 :(得分:2)
最好使用:
ImageIcon closeImg = new ImageIcon(getClass().getResource("\\images\\buttons\\closeBtn.png"));
确保您的图片位于相对于类文件输出位置的相同位置。
此外,您的关闭按钮会调用setVisible(false)
,但不会处置任何资源或退出应用程序。