使用Java中的focuslistener更改背景颜色

时间:2015-05-17 02:27:43

标签: java swing focuslistener

我正在尝试设置并让我的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);
  }
}

1 个答案:

答案 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这样的东西往往更好。

祝你好运,我希望这会有所帮助。