Застрял на объекте в Java - PullRequest
       1

Застрял на объекте в Java

4 голосов
/ 31 марта 2010

Я прорабатываю упражнение, чтобы понять Java, и в основном мне нужно объединить функциональность двух классов в одно приложение.

Я застрял в одной области - ссылки на объекты в разных классах.

Что я сделал, так это настроил графический интерфейс в одном классе (test1), и у него есть текстовое поле, то есть.

chatLine = new JTextField();

в другом классе (test2), я планировал оставить там все функциональные возможности и ссылаться на различные элементы графического интерфейса, настроенные в test1 - как этот test1.chatLine

Я понимаю этот уровень ссылок, я проверил это, настроив метод test в классе test2

public static void testpass() {

        test1.testfield.setText("hello");
    }

Я пытаюсь понять, как реализовать более сложную функциональность в классе test2, особенно в этом существующем коде;

test1.chatLine.addActionListener(new ActionAdapter() {
            public void actionPerformed(ActionEvent e) {
               String s = Game.chatLine.getText();
               if (!s.equals("")) {
                  appendToChatBox("OUTGOING: " + s + "\n");
                  Game.chatLine.selectAll();

                  // Send the string
                  sendString(s);
               }
            }
         });

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

Надеюсь, это имеет смысл, я довольно запутался по этому поводу - я пытаюсь понять, как работает область действия и ссылки.

В идеале я пытаюсь достичь одного класса, в котором есть все основные элементы, графический интерфейс и т. Д., А затем все связанные функции в другом классе и целевые элементы интерфейса первого класса с результатами и т. Д.

Любые мысли с благодарностью.

Ответы [ 3 ]

2 голосов
/ 31 марта 2010

Если вы можете получить доступ к chatLine, вы можете вызывать его (публичные) методы, включая addActionListener. Чтобы получить прямой доступ к chatLine, вам нужно сделать его public, и если вы хотите сделать его специфичным для класса (в отличие от chatLine для каждого экземпляра класса), оно должно быть static.

Обратите внимание, однако, что часто желательно не делать переменные общедоступными. Важной причиной того, что классы и объекты стоят на первом месте, является инкапсуляция. Вы могли бы подумать о том, чтобы скрыть реализацию внутри классов, сделав ее закрытой и предоставив только открытые методы более высокого уровня для доступа к тому, что необходимо, например, не раскрывайте «raw» JTextField, а скорее раскрывайте функциональность, которую вы используете для его предоставления.

1 голос
/ 31 марта 2010

Вообще говоря, все в Java ссылается, но примитивные типы.

Так называемая видимость объектов - это другое дело:

  • public видимые члены видны на все
  • 'Package Friendly' участники (те, которые явно не имеют смысла упомянутые) видны всем субъектам принадлежащие к одной и той же упаковке
  • protected оба члена с областью видимости «Пакет дружественный» и видимый для всех наследование объектов класса
  • Наконец, private члены с областью видимости виден только самому объекту [Объекты из того же класса могут просматривать частные члены друг друга (насколько насколько я помню)]

Теперь

  • внутренний статический класс может получить доступ к его static членов класса
  • «нормальный» внутренний класс (без статический модификатор) может получить доступ к его static членов класса и включающий экземпляр объекта Члены - это относится и к анонимный внутренний класс.

Наконец, любая цепочка вызовов методов / полей, как показано ниже, является действительной (но ужасной), пока ни одна из цепочек не ссылается на нуль:

myObj.getThatObject().somePublicField.doSomthing().activate().someOtherPublicField

Одна рекомендация - не объявлять участников публичными ...

1 голос
/ 31 марта 2010

Мне неясно, является ли chatLine локальной переменной, переменной экземпляра или статической переменной. Любая из этих вещей может быть источником вашей ошибки компиляции, которую вы не указали - что это за ошибка?

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

По крайней мере, он должен быть закрытым и доступным через метод getChatLine ().

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...