2015-06-21 9 views
-1

Этот код также компилируется и выполняется, но метод actionPerformed() не выполняется должным образом. Я имею в виду, что после нажатия кнопки «ОК» ничего не записано в JTextField. Действие NO выполняется даже после использования e.getSource(). System.out.println("I am done ") работает нормально, но t.setText("Hey there") не работает.? Что не так с кодом? Пожалуйста, помогите мне, если кто-нибудь сможет.
А также вы можете уточнить, почему, если не добавить JButton и JTextField на Panel не видно? Почему важно добавить панель, чтобы отобразить кнопку и текстовое поле. Без этого не видно почему?Что случилось с моим кодом?

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 GUIs должны работать на разных ОС, размер экрана, разрешение экрана и т. Д., Используя разные PLAF в разных локалях. Таким образом, они не способствуют идеальной компоновке пикселей. Вместо этого используйте диспетчеры макетов или [их комбинации] (http://stackoverflow.com/a/5630271/418556), а также макет и границы для [пробела] (http://stackoverflow.com/a/17874718/ 418556). –

ответ

3

Вы затенение переменной b, повторно объявить его в конструкторе это означает, что b поля в классе не то же самое, что отображается в вашем GUI. Не делайте этого, и ваша проблема решена.

т.е. вы делаете это:

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 использует BorderLayout, и если вы добавите по умолчанию, добавьте только последнее добавленное значение и заполнит графический интерфейс. Обратите внимание, что вы пытаетесь сделать 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, то использование лямбда-выражений было бы лучшей идеей, так как ActionListener - это единый абстрактный метод.

Если вы хотите посмотреть на использование, то это, как это:

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

для лучшего понимания вы можете посмотреть на этом видео. Это для JavaFX, но концепции анонимных внутренних классов и лямбда-выражений остаются неизменными.

anonymous inner classes and lambda expressions

+1

Я сделаю эту рекомендацию хорошей. –

Смежные вопросы