首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中使用focuslistener更改背景颜色

在Java中使用focuslistener更改背景颜色
EN

Stack Overflow用户
提问于 2015-05-17 10:27:43
回答 1查看 1.2K关注 0票数 0

我正在尝试设置和更改我的jpanel的背景颜色,每次焦点获得和丢失,但我似乎不能得到正确的。任何形式的帮助都将不胜感激。这是我到目前为止所知道的:

代码语言:javascript
复制
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);
  }
}
EN

回答 1

Stack Overflow用户

发布于 2015-05-17 11:42:31

这里有一系列的问题。我将逐一介绍它们。

首先,我看到你有一个名为"7UpsPanel“的类。我甚至不确定哪个编译器允许这样做,但正式地说,任何标识符都以文字数字开头是违反Java规范的(实际上,违反了大多数规范)。将其称为"SevenUpsPanel“会更好。不过,这与您的问题有点离题。

Andrew Thompson是对的,JPanels本身是不可聚焦的。这是设计好的。您可以使用setFocusable(boolean)方法(在逐个面板的基础上)进行更改,该方法应该在addFocusListener(…)调用之前执行。

此外,您的setBackground(…)调用引用的是JFramesetBackground(),而不是您的面板的。

代码语言:javascript
复制
jpanel.setBackground(Color.BLACK);

最后,更改背景颜色并不符合无效中断的要求。您必须手动触发它,或者更确切地说,在自动化中编写。这意味着,在每个FocusListener方法的末尾,您必须(至少):

代码语言:javascript
复制
repaint();

或者,任何其他已知的内部触发重绘的方法。此方法按必要的顺序调用paint(Graphics g)paintComponents(…)以重绘框架。

最后,不要像那样添加面板。在这种情况下,您可能希望将其设置为内容窗格。以您的方式添加窗格并不能保证它具有可见区域;内容窗格占据框架的区域(当然不包括插页)。

最后,这两个TODOs提醒您没有向自动生成的方法中写入任何内容。很明显,你已经做到了,而把它们留在那里,那么,这就失去了一切的意义。

这是我对你的程序的翻拍,只是为了让你明白我的意思:

代码语言:javascript
复制
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这样的东西更好。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30282744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档