2015-08-17 2 views
1

Я новичок в Java, отсюда этот основной вопрос.Невозможно получить доступ к jlabel через программу

У меня возникли проблемы с доступом к полю (jlabel в этом случае) во всей программе. Мой код выглядит следующим образом:

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

public class accessvariable { 

    public static void main(String[] args) { 

     //basic setup of display frame 
     JFrame frame=new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(400, 400); 
     JPanel panel=new JPanel(); 

     //text field to take user input 
     JTextField txt= new JTextField(10); 

     //adding action listener for text field 
     txt.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       if (true) { //if condition not checking anything here, just to make it enter the loop 
        JLabel j =new JLabel("Access successful"); //a jlabel created inside this 
        System.out.println("inside j : "+j.getText()); //statement to check whether jlabel is accessible from here 
       } 
      } 
     }); 

     System.out.println("outside j : "+j.getText()); //statement to check whether jlabel is accessible from here 

     //basic setup for final display 
     panel.add(txt); 
     frame.getContentPane().add(panel); 
     frame.setVisible(true); 
    } 
} 

Ошибка в этой строке:

System.out.println("outside j : "+j.getText()); 

Если я закомментировать эту строку, он отлично работает. Внутренний j отображается правильно. Но если я не комментирую его, я получаю эту ошибку:

Exception in thread "Exception in thread "main" java.lang.Error: Unresolved compilation problem: j cannot be resolved" 

Чтобы исправить это, я сделал J переменной экземпляра следующим образом:

private JLabel j; 

Однако выше генерирует новый ошибка:

Cannot make a static reference to the non-static field j 

Я понимаю, что проблема с этим одной строкой:

System.out.println("outside j : "+j.getText()); 

Как я могу исправить вышеуказанную проблему, так что, если он работает правильно, то выход, когда я ввожу текст в текстовом поле должно быть следующим:

inside j : Access successful 
outside j : Access successful 

ответ

1

Подождите. Стоп. Начать сначала.

Ваша программа представляет собой не что иное, как статический основной метод, который подходит для программ типа «Hello World», но если вы хотите создать что-нибудь более мощное, вам нужно, no необходимо, чтобы узнал об объекте -Ориентированные концепции и способы их применения в Java-программах. Например, для начала для этого проекта вы должны создать по крайней мере один класс, который имеет нестатические поля и методы, включая поле для вашего JLabel (с помощью которого вы могли бы позволить нестатические методы доступа вашего класса к этому полю) и вы должны создать свой графический интерфейс, что означает добавление компонентов в контейнеры, вне основного метода, и больше похоже на некоторый нестатический метод или конструктор init(). Основной метод должен быть только для создания ваших объектов и включения их в действие, а еще немного. Но, что еще более важно, изучите концепции ООП и то, как они относятся к языку программирования Java. Порядочная книга для этого - Bruce Eckel's "Thinking in Java".

Еще одна концепция, которая ударит сейчас, - это scope включая переменную область действия. Если у вас есть переменная, здесь переменная JLabel, j, похоронена и объявлена ​​не только внутри метода, но и в методе, который похоронен внутри анонимного внутреннего класса ActionListener, почти невозможно, чтобы другой код класса взаимодействовал с эту переменную. Если это поле экземпляра, то оно отображается во всех нестатических частях класса, которые его хранят.

Например:

import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class AccessVariable extends JPanel { 
    private static final int PREF_W = 400; 
    private static final int PREF_H = PREF_W; 
    private JLabel myLabel = new JLabel(); 
    private JTextField textField = new JTextField(10); 

    public AccessVariable() { 
     add(textField); 
     add(myLabel); 

     textField.addActionListener(new MyListener()); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private class MyListener implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      String text = textField.getText(); 
      myLabel.setText("Text is: " + text); 

      textField.requestFocusInWindow(); 
      textField.selectAll(); 
     } 
    } 

    private static void createAndShowGui() { 
     AccessVariable mainPanel = new AccessVariable(); 

     JFrame frame = new JFrame("Access Variable"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(); 
      } 
     }); 
    } 
} 
+0

спасибо Судно на воздушной подушке Full Of Угри для хороших предложений. Я новичок в Java и только начинаю изучать весь этот материал ООП. Кстати, это также мой первый вопрос о Stackoverflow. Спасибо за ваш ответ. Я понял, где я ошибся, и ваш ответ был очень полезным –

0

Чувак, просто посмотрите на сферу переменной у. И когда вы объявили j как частную переменную-член, ее определенно невозможно получить из статического (основного) метода напрямую.

Лучше вы объявляете его вне цикла и проверить выполнение кода еще раз

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