我正在尝试设置并让我的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);
}
}
答案 0 :(得分:0)
这里有一系列问题。我会一个接一个地浏览它们。
首先,我看到你有一个名为" 7UpsPanel"的班级。我不确定哪个编译器甚至允许这样做,但是正式它反对Java规范,任何标识符都以字面数字开头(实际上与大多数规范相对)。最好称之为" SevenUpsPanel"。不过,这与你的问题有点相关。
Andrew Thompson是对的,JPanels本身并不专注。这是设计的。您可以使用setFocusable(boolean)
方法更改(在逐个面板的基础上),该方法应该在addFocusListener(…)
来电之前进行。
此外,您的setBackground(…)
来电引用JFrame
setBackground()
,而不是您的小组。要正确更改面板的颜色,它们看起来应该更像:
jpanel.setBackground(Color.BLACK);
最后,更改背景颜色并不符合无效中断的条件。您必须手动触发它,或者更确切地说,写入自动化。这意味着,在每个FocusListener
方法结束时,您必须(至少):
repaint();
或者,内部触发重绘的任何其他已知方法。此方法以必要的顺序调用paint(Graphics g)
和paintComponents(…)
来重绘您的框架。
最后,不要像这样添加面板。在这种情况下,您希望将其设为内容窗格。以您的方式添加窗格并不能保证它具有可见区域;内容窗格占据框架的区域(当然减去内插)。
最后,这两个TODO提醒您,您还没有在自动生成的方法中写入任何内容。你显然已经拥有了,并且让它们留在那里,这恰好击败了这一切。
这是我重拍你的节目,只是为了让你明白我的意思:
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
这样的东西往往更好。
祝你好运,我希望这会有所帮助。