Java 摆动按钮以更改标签或文本字段
我是Java新手,正在尝试使用两个按钮来更改文本字段和标签。我认为问题在于ClearButton类中的l和CopyButton类中的tf不能被引用。我该怎么做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");
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覆盖。