Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 摆动按钮以更改标签或文本字段_Java_Swing - Fatal编程技术网

Java 摆动按钮以更改标签或文本字段

Java 摆动按钮以更改标签或文本字段,java,swing,Java,Swing,我是Java新手,正在尝试使用两个按钮来更改文本字段和标签。我认为问题在于ClearButton类中的l和CopyButton类中的tf不能被引用。我该怎么做 public class SwingEx1 { JFrame f; JPanel p; JLabel l; JTextField tf; JButton b1,b2; public SwingEx1() { f = new JFrame("Swing Example");

我是Java新手,正在尝试使用两个按钮来更改文本字段和标签。我认为问题在于ClearButton类中的l和CopyButton类中的tf不能被引用。我该怎么做

public class SwingEx1  
{
   JFrame f;
   JPanel p;
   JLabel l;
   JTextField tf;
   JButton b1,b2;

   public SwingEx1()
   {
      f = new JFrame("Swing Example");
      p = new JPanel();
      l = new JLabel("Initial Label");
      tf = new JTextField("Enter Text");
      b1 = new JButton("Clear");
      b2 = new JButton("Copy");
   }

   public void LaunchFrame()
   {
      p.add(b1,BorderLayout.SOUTH);
      p.add(b2,BorderLayout.SOUTH);
      p.add(l,BorderLayout.CENTER);
      p.add(tf,BorderLayout.CENTER);
      f.getContentPane().add(p);
      b1.addActionListener(new ClearButton());
      b2.addActionListener(new CopyButton());
      f.pack();
      f.setVisible(true);
   }

   public static void main(String args[])
   {
      SwingEx1 swObj1 = new SwingEx1();
      swObj1.LaunchFrame();
   }
}

class ClearButton implements ActionListener
{
   public void actionPerformed(ActionEvent e)
   {
    tf.setText("");
   }
}

class CopyButton implements ActionListener
{
    public void actionPerformed(ActionEvent e)
   {
        l.setText(tf.getText());
   }
}

这是一个范围问题。您已经在SwingEx1类中声明了tf,所以外部类不知道它的存在!我会将您的button类移动到SwingEx1类中,这将使它们能够解析变量名。类结构如下所示:

class SwingEx1 
{
    ...
    class ClearButton implements ActionListener
    {
        ...
    }
    class CopyButton implements ActionListener
    {
        ...
    }
}

这是一个范围问题。您已经在SwingEx1类中声明了tf,所以外部类不知道它的存在!我会将您的button类移动到SwingEx1类中,这将使它们能够解析变量名。类结构如下所示:

class SwingEx1 
{
    ...
    class ClearButton implements ActionListener
    {
        ...
    }
    class CopyButton implements ActionListener
    {
        ...
    }
}

有什么原因不能简单地让类实现ActionListener吗。这样你就不用担心范围问题了。您还应该为变量指定有意义的名称,如btnClear、btnCopy

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class SwingEx1 implements ActionListener {

    JFrame f;
    JPanel p;
    JLabel l;
    JTextField tf;
    JButton b1, b2;

    public SwingEx1() {
        f = new JFrame("Swing Example");
        p = new JPanel();
        l = new JLabel("Initial Label");
        tf = new JTextField("Enter Text");
        b1 = new JButton("Clear");
        b2 = new JButton("Copy");
    }

    public void LaunchFrame() {
        p.add(b1, BorderLayout.SOUTH);
        p.add(b2, BorderLayout.SOUTH);
        p.add(l, BorderLayout.CENTER);
        p.add(tf, BorderLayout.CENTER);
        f.getContentPane().add(p);
        b1.addActionListener(this);
        b2.addActionListener(this);
        f.pack();
        f.setVisible(true);
    }

    public static void main(String args[]) {
        SwingEx1 swObj1 = new SwingEx1();
        swObj1.LaunchFrame();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == b1) {
            tf.setText("");
        } else if (e.getSource() == b2) {
            l.setText(tf.getText());
        }
    }
}

有什么原因不能简单地让类实现ActionListener吗。这样你就不用担心范围问题了。您还应该为变量指定有意义的名称,如btnClear、btnCopy

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class SwingEx1 implements ActionListener {

    JFrame f;
    JPanel p;
    JLabel l;
    JTextField tf;
    JButton b1, b2;

    public SwingEx1() {
        f = new JFrame("Swing Example");
        p = new JPanel();
        l = new JLabel("Initial Label");
        tf = new JTextField("Enter Text");
        b1 = new JButton("Clear");
        b2 = new JButton("Copy");
    }

    public void LaunchFrame() {
        p.add(b1, BorderLayout.SOUTH);
        p.add(b2, BorderLayout.SOUTH);
        p.add(l, BorderLayout.CENTER);
        p.add(tf, BorderLayout.CENTER);
        f.getContentPane().add(p);
        b1.addActionListener(this);
        b2.addActionListener(this);
        f.pack();
        f.setVisible(true);
    }

    public static void main(String args[]) {
        SwingEx1 swObj1 = new SwingEx1();
        swObj1.LaunchFrame();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == b1) {
            tf.setText("");
        } else if (e.getSource() == b2) {
            l.setText(tf.getText());
        }
    }
}

尝试在
l.setText()
之后使用
l.repaint()
,我刚刚测试了这个。对于BorderLayout,同一部分中不能有两个对象。我的测试结果是添加的第一个对象被第二个对象重写。换句话说。。。b1和l将永远不会出现,因为它们将被b2和tf覆盖。尝试在
l.setText()
之后使用
l.repaint()
,我刚刚测试了这个。对于BorderLayout,同一部分中不能有两个对象。我的测试结果是添加的第一个对象被第二个对象重写。换句话说。。。b1和l将永远不会出现,因为它们将被b2和tf覆盖。