2013-08-29 2 views
0

У меня есть класс свинга, который включает в себя переменную Str3 String, объявленную как окончательные и дваКак изменить значение переменной во внешнем классе, когда оно изменилось во внутреннем?

ActionListener интерфейсов, которые реализованы два JButtons b1

и b2, когда b1 JButton нажат str3 Строки принимает значение,

Мой вопрос здесь, как изменить значение str3 по всему классу

скорее во втором интерфейсе ActionListener (не только в первом внутреннем классе).

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

public class mySwing extends JFrame { 

    JButton b1, b2; 

    public mySwing() { 
     final String str3; 
     JPanel panel = new JPanel(); 
     b1 = new JButton("please click me first"); 
     b2 = new JButton("please click me second"); 
     final JTextField txt = new JTextField("       "); 
     panel.add(txt); 
     Container pane = getContentPane(); 
     panel.add(b1); 
     panel.add(b2); 
     pane.add(panel); 
     str3 = new String(); 
     b1.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent acv) { 
       String input = "HelloWorld"; 
       String str3 = new String(input.substring(0, 5)); 
       txt.setText(str3); 
      } 
     }); 
     b2.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent acv) { 
       txt.setText(str3); 
      } 
     }); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new mySwing(); 
    } 
} 

ответ

1

Просто введите str3 переменную экземпляра вашего конечного класса вне класса mySwing.

Кстати, не делать такие вещи, как new String(input.substring(0, 5)) результат input.substring(0, 5)является строку, так что вы не должны создать другую строку.

на основе кода:

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

public class mySwing extends JFrame { 

    JButton b1, b2; 
    String str3=""; 

    public mySwing() { 
     JPanel panel = new JPanel(); 
     b1 = new JButton("please click me first"); 
     b2 = new JButton("please click me second"); 
     final JTextField txt = new JTextField("       "); 
     panel.add(txt); 
     Container pane = getContentPane(); 
     panel.add(b1); 
     panel.add(b2); 
     pane.add(panel); 
     str3 = new String(); 
     b1.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent acv) { 
       str3+=" (1)"; 
       txt.setText(str3); 
      } 
     }); 
     b2.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent acv) { 
       str3+=" (2)"; 
       txt.setText(str3); 
      } 
     }); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new mySwing(); 
    } 
} 
+0

Нет, он должен быть окончательным для доступа из внутреннего класса. – JavaFan

+1

Он должен быть окончательным, только если это локальная переменная. При создании переменной экземпляра он может быть доступен внутренними классами, не будучи окончательным. Просто попробуйте. Или посмотрите на свои кнопки 'b1' и' b2'. Они могут быть доступны вашими внутренними классами, не будучи окончательными. – Holger

+0

Пожалуйста, объясните больше объяснений. Я не понимаю вашу идею. – JavaFan

0

Ваш подход к объявлению переменной str3 как окончательной является правильным. Однако в Java Strings нельзя изменить их содержимое, поэтому вам придется делать что-то другое. Некоторые идеи, которые я могу найти:

  1. Вместо этого используйте StringBuffer и преобразуйте его в String с помощью метода toString().
  2. Используйте некоторые другие POJO с геттером и сеттер для вашей строки, таким образом POJO будет объявлен окончательным, а контент можно будет изменить с помощью приемника и сеттера.

Надеюсь, что это поможет в качестве ориентира, там есть много других хороших подходов.

+0

спасибо. вопрос здесь не является членом Strings, а скорее изменяет значения переменных. Поэтому я попробую второй вариант. – JavaFan

0

переменная str3 является окончательным, то он никогда не может быть изменен.

внутри вашего кода, который вы никогда не пытались изменить, вы только что объявили новую str3 внутри внутреннего класса ActionListener.

+0

Посмотрите ниже b2.addActionListener (new ActionListener(), почему значение str3 равно null (я хочу сделать его как значение в предыдущем внутреннем классе) – JavaFan

+0

final String str3; это ваше окончательное объявление, которое означает, что str3 никогда не изменится во время запуск программы, после чего вы инициализировали свой str3 (str3 = new String() <- new String() return null), а str3 будет null навсегда. Теперь внутри b1 вы объявили еще одну str3 (String str3 = new String (input.substring (0, 5));) и это не то же самое str3 выше, и если вы попытаетесь сделать str3 = "someString", компилятор будет жаловаться.Теперь str3 внутри b2 указывает/ссылается на первую str3 с нулевым значением, потому что не может видеть str3 внутри b1, и это null. –