2015-06-21 141 views
-1

此代码也正在编译和执行,但方法actionPerformed()未正确执行。我的意思是在点击确定按钮后,JTextField中没有写入任何内容。即使在使用e.getSource()后也不执行任何操作。 System.out.println("I am done ")工作正常,但t.setText("Hey there")不起作用。?代码有什么问题?如果有人愿意,请帮助我。
而且你能否详细说明为什么如果不在Panel上添加JButtonJTextField这是不可见的?为了使按钮和文本字段可见,为什么添加面板很重要。没有它是不可见的原因?我的代码有什么问题?

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 

class A implements ActionListener { 

    JFrame f; 
    JButton b; 
    JPanel p; 
    JLabel l; 
    JTextField t; 

    A(String s) { 
     JFrame f=new JFrame(s); 
     f.setVisible(true); 
     f.setSize(400,400); 
     JButton b= new JButton("OK"); 
     JTextField t=new JTextField(); 
     JPanel p=new JPanel(); 
     f.add(p); 
     p.setBounds(0,0,300,300); 
     p.add(b); 
     b.setBounds(30,40,80,80); 
     p.add(t); 
     t.setBounds(100,200,80,80); 
     b.addActionListener(this); 
     t.addActionListener(this); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public void actionPerformed(ActionEvent e) { 
     if(e.getSource() == b) {  
      t.setText("Hey There"); 
     } 
     System.out.println("I m done!!"); 
    } 

    public static void main(String[] args) { 
     System.out.println("Hey there"); 
     new A("First App"); 
    } 
} 
+0

* “也可以你..” * SO上应该是一个单一的,具体的问题一个问题。其他问题最好从不同的线索开始。另外:使用缩进代码行和块的逻辑和一致的形式。缩进旨在使代码的流程更易于遵循! –

+0

还请注意,您的问题标题对我们没有帮助,因为它是单独的非信息性的。 “我的代码有什么问题”告诉我们关于你的问题没有任何**,除了你有问题 - 但我们已经知道了,否则你不会在这里。今后,请努力以更好的标题提出更好的问题。这将有助于你和我们。 –

+2

'f.setVisible(true);'应该是'pack()'后的最后一个。和'p.setBounds(0,0,300,300);'Java GUI必须在不同的操作系统上工作',屏幕大小,屏幕分辨率等等,在不同的语言环境中使用不同的PLAF。因此,它们不利于像素的完美布局。请使用布局管理器或[它们的组合](http://stackoverflow.com/a/5630271/418556)以及[white space]的布局填充和边框(http://stackoverflow.com/a/17874718/ 418556)。 –

回答

3

你被重新宣布它在你的构造这意味着在类的b字段不显示在你的GUI相同的阴影中b变量。不要这样做,你的问题就解决了。

即,你这样做是:

class A { 
    JButton b; // this guy stays null! 

    public A() { 
     JButton b = new JButton(...); 
    } 

解决的办法是要做到这一点:

class A { 
    JButton b; 

    public A() { 
     b = new JButton(...); //note the difference? 
    } 

你问:

为什么重要的是要增加面板为了使按钮和文本字段在摆动中可见?

这是一个布局管理器的问题。默认情况下,JPanel使用FlowLayout,这将允许您添加组件,例如从左上角的书架中填写书籍。另一方面,JFrame的contentPane使用BorderLayout,如果你默认添加了这个东西,只有最后添加的东西才会显示并填充GUI。请注意,您正在尝试setBounds(...),您不应该这样做。让布局经理做那件事。

+0

谢谢你:)所有人..(Y) – RedEyes

+0

为什么为了使按钮和文本字段在摆动中可见而添加面板很重要? – RedEyes

+0

@RedEyes:见编辑回答。 –

3

你在构造函数中隐藏所有的字段。

删除重新声明,它将按预期工作。

事情是这样的:

A(String s) { 
    f = new JFrame(s); 
    f.setVisible(true); 
    f.setSize(400, 400); 
    b = new JButton("OK"); 
    t = new JTextField(); 
    p = new JPanel(); 
    f.add(p); 
    p.setBounds(0, 0, 300, 300); 
    p.add(b); 
    b.setBounds(30, 40, 80, 80); 
    p.add(t); 
    t.setBounds(100, 200, 80, 80); 
    b.addActionListener(this); 
    t.addActionListener(this); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 

请注意,我们不会重新声明任何这些变量的。这就是为什么你的活动没有开火;声明字段仍然是null

3

而不是做你在做什么为什么你不使用匿名内部类?

喜欢的东西:

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; 

class A { 
    JFrame f; 
    JButton b; 
    JPanel p; 
    JLabel l; 
    JTextField t; 

    A(String s) { 
     f = new JFrame(s); 
     f.setVisible(true); 
     f.setSize(400, 400); 

     p = new JPanel(); 
     p.setBounds(0, 0, 300, 300); 

     t = new JTextField(); 
     t.setBounds(100, 200, 80, 80); 
     p.add(t); 

     b = new JButton("OK"); 
     b.setBounds(30, 40, 80, 80); 
     b.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       t.setText("Hello! World."); 
      } 
     }); 
     p.add(b); 
     f.add(p); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public static void main(String[] args) { 
     System.out.println("Hey there"); 
     new A("First App"); 
    } 
} 

我没有执行这个代码,但我相信这是要去工作,这种方法会帮助你组织你的代码更好。 这是我通常的代码。

如果您使用的是Java 8,那么使用lambda表达式将是最好的想法,因为ActionListener是单一抽象方法接口。

如果你想看看使用那么这是怎么回事:

b.addActionListener(e -> t.setText("Hello! World.")); 

更好地了解,你可以看看这部影片。它适用于JavaFX,但匿名内部类和lambda表达式的概念保持不变。

anonymous inner classes and lambda expressions

+1

我会提出一个很好的建议。 –