我正在尝试设置和更改我的jpanel的背景颜色,每次焦点获得和丢失,但我似乎不能得到正确的。任何形式的帮助都将不胜感激。这是我到目前为止所知道的:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class 7UpsPanel extends JFrame {
private JPanel jpanel = new JPanel();
public MyFrame() {
super("Lab 5 - Part 1");
//setLayout(new FlowLayout());
setLocation(100, 100);
setSize(500,500);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
FocusListener focused = new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
// TODO Auto-generated method stub
setBackground(Color.BLACK);
setBackground(Color.YELLOW);
}
@Override
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
setBackground(Color.WHITE);
}
};
jpanel.addFocusListener(focused);
add(jpanel);
}
}发布于 2015-05-17 11:42:31
这里有一系列的问题。我将逐一介绍它们。
首先,我看到你有一个名为"7UpsPanel“的类。我甚至不确定哪个编译器允许这样做,但正式地说,任何标识符都以文字数字开头是违反Java规范的(实际上,违反了大多数规范)。将其称为"SevenUpsPanel“会更好。不过,这与您的问题有点离题。
Andrew Thompson是对的,JPanels本身是不可聚焦的。这是设计好的。您可以使用setFocusable(boolean)方法(在逐个面板的基础上)进行更改,该方法应该在addFocusListener(…)调用之前执行。
此外,您的setBackground(…)调用引用的是JFrame的setBackground(),而不是您的面板的。
jpanel.setBackground(Color.BLACK);最后,更改背景颜色并不符合无效中断的要求。您必须手动触发它,或者更确切地说,在自动化中编写。这意味着,在每个FocusListener方法的末尾,您必须(至少):
repaint();或者,任何其他已知的内部触发重绘的方法。此方法按必要的顺序调用paint(Graphics g)和paintComponents(…)以重绘框架。
最后,不要像那样添加面板。在这种情况下,您可能希望将其设置为内容窗格。以您的方式添加窗格并不能保证它具有可见区域;内容窗格占据框架的区域(当然不包括插页)。
最后,这两个TODOs提醒您没有向自动生成的方法中写入任何内容。很明显,你已经做到了,而把它们留在那里,那么,这就失去了一切的意义。
这是我对你的程序的翻拍,只是为了让你明白我的意思:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SevenUpsPanel extends JFrame {
public static void main(String[] args) {
new SevenUpsPanel();
}
private JPanel jpanel = new JPanel();
public SevenUpsPanel() {
super("Lab 5 - Part 1");
setLocation(100, 100);
setSize(500, 500);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
FocusListener focused = new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
// jpanel.setBackground(Color.BLACK); // Assuming an old command?
jpanel.setBackground(Color.YELLOW);
repaint();
}
@Override
public void focusLost(FocusEvent e) {
jpanel.setBackground(Color.WHITE);
repaint();
}
};
jpanel.setFocusable(true);
jpanel.addFocusListener(focused);
setContentPane(jpanel);
}
}JPanel很棘手,它们不像其他的JComponent。看看文档,当你有时间的时候,将JPanel的继承与JButton进行比较,我相信你会明白为什么。它们是很好的画布,但当涉及到专注倾听时,通常使用像未装饰的JButton或甚至JTextField这样的东西更好。
祝你好运,我希望这对你有帮助。
https://stackoverflow.com/questions/30282744
复制相似问题