我在JPanel中放了几个JTextField
我希望实现这样一个功能。就是JPanel中的JTextField获得焦点后,JPanel变色。
有没有不把代码写在JTextField的获得失去焦点的事件中?可不可以直接在JPanel判断?谢谢。

解决方案 »

  1.   

    你可以自定义一个面板类继承JPanel并实现FocusListener
    把这个类添加的JTextField的监听中
    public class MyPanel implements FocusListener{public void focusGained(FocusEvent e) {

    }
    public void focusLost(FocusEvent e) {

    }
    }JTextField.addFocusListener(new MyPanel());
      

  2.   

    上面写漏了一点,应该是
    public class MyPanel extends JPanel implements FocusListener
      

  3.   

    import java.awt.Color;
    import java.awt.Container;
    import java.awt.event.FocusAdapter;
    import java.awt.event.FocusEvent;import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;public class TestFocus extends JFrame {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private JPanel panel = new JPanel();
    private JTextField f1 = new JTextField("文本框1");
    private JTextField f2 = new JTextField("文本框2");

    private JLabel label = new JLabel("风向标");

    private Color c = null; //初始时JPanel的背景色 private boolean state = false; //文本框2的焦点状态,初始为false,表示没有获得焦点

    public TestFocus() {
    super("Demo");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setBounds(200, 200, 400, 400);

    Container pane = this.getContentPane();
    pane.add(panel);
    c = panel.getBackground();

    panel.add(f1);
    panel.add(f2);

    panel.add(label);

    f2.addFocusListener(new FocusAdapter(){
    @Override
    public void focusGained(FocusEvent e) {
    System.out.println("按钮2获得焦点");
    state = true;
    } @Override
    public void focusLost(FocusEvent e) {
    System.out.println("按钮2失去焦点");
    state = false;
    }
    });

    Thread t = new Thread(new MyThread());
    t.start();
    }

    //用于监测文本框2焦点状态变化的线程
    class MyThread implements Runnable { @Override
    public void run() {
    while(true) {
    try {
    Thread.sleep(100);
    }
    catch(InterruptedException ie) {
    //
    }
    //如果2当前没有获得焦点,则设置JPanel背景色为初始的背景色
    if(!state) {
    if(c!=null) {
    panel.setBackground(c);
    // label.setForeground(c);
    panel.validate();
    panel.repaint();
    }
    }
    else { //获得焦点,设置背景色为红色
    panel.setBackground(Color.red);
    // label.setForeground(Color.red);
    panel.validate();
    panel.repaint();
    }
    }
    }

    }

    public static void main(String[]args) {
    new TestFocus().setVisible(true);
    }

    }
      

  4.   

    label标签可以忽略注释掉,只是我开始用来测试的。
      

  5.   

    正好在用swing 不过没遇过这种需求。