Как мне сделать переменные доступными везде?

#java #swing

Вопрос:

Я использую java swing, и я пытался использовать новый текст в качестве параметра, но я не уверен, как это сделать, также есть тот факт, что у меня есть «});» который полностью испорчен, но он работает, и я попытался исправить это, но это не работает

этот код находится внутри моего основного

 public String newText = "";

a.addActionListener(new ActionListener() {

  public void actionPerformed(ActionEvent ae) {
    JFrame popup = new JFrame("Choose...");
    popup.setSize(250,250);
    popup.setLayout(null);
    popup.setVisible(true);
    JButton o=new JButton("o");
    o.setBounds(25,75,100,100); 
    popup.add(o);
    o.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent ae, String newText){
        newText = "O";
      }
    });
    JButton x=new JButton("x"); 
    x.setBounds(125,75,100,100);  
    popup.add(x);
    if (!newText.equals(""))
        a.setText(newText);
  }
});

 

Комментарии:

1. Вы не можете поместить public String внутри main . Что такое a ? 1) Пожалуйста, покажите полный класс 2) Что именно не работает и к какой переменной вы пытаетесь получить доступ?

2. Пожалуйста, включите некоторые пояснения о том, что вы хотели, чтобы произошло, и каким образом это не работает (например, я хочу, чтобы это делало X, но вместо этого происходит Y).

3. Для этого вы можете использовать статическую переменную. Объявите свою newText переменную с помощью public static String newText = "" . Но, делая это, newText будет общим для каждого экземпляра вашего класса

4. Спасибо за помощь, я впервые использую stackoverflow. У меня есть ссылка на это replit.com/@JavaScriptGod/JavaSwing#Main.java

5. newText = "O"; изменяет только аргумент (= локальную переменную) actionPerformed , это никак не повлияет на внешний мир. Вероятно, было бы неплохо не иметь нескольких переменных с именем newText…

Ответ №1:

Я пытался использовать newText в качестве параметра

Здесь?

 public void actionPerformed(ActionEvent ae, String newText){
 

Это недопустимый код. ActionListener это интерфейс; интерфейс — это контракт, который необходимо соблюдать. Вы не можете просто добавлять переменные к существующим сигнатурам методов.

Предполагая, что вы хотите изменить текст кнопки, вы могли бы сделать это

 public class Main {

    public String newText;

    public static void main(String[] args) {
       new Main().run();
    }

    public void run() {

        System.out.printf("before: newText = %s%n", newText);
        final JButton o = new JButton("o");
        // ...
        o.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent ae){
                Main.this.newText = "O"; // Sets the field
                System.out.printf("action: newText = %s%n", Main.this.newText);
                o.setText(Main.this.newText);
            }
        });
        System.out.printf("actionListener set : newText = %s%n", newText);
    }
}
 

Однако попытка использования newText.equals вне прослушивателя действий происходит в другом потоке, что означает, что код не выполняется «сверху вниз». Например. переменная не «установлена» в порядке выполнения, который считывается кодом. Добавлены операторы печати, чтобы показать это