Передача и редактирование примитивных объектов в Java - PullRequest
0 голосов
/ 06 августа 2011

У меня есть интересная проблема в Java, она немного многословна, хотя терпите меня.

Я решил создать настраиваемую Jpanel, которая будет действовать как окно свойств, поэтому вместо этого вручную создавал каждую панель, которую хотел. Я мог бы просто использовать настраиваемую панель снова и снова с различными параметрами, чтобы «смотреть и редактировать» в конструкторе, и это сделало бы все остальное (слушатели свойства макета и т. Д.).

У меня проблема с передачей примитивных объектов на панель и с нее. Когда значение изменяется на панели, оно должно обновить значение, которому оно соответствует в программе. Это было бы легко с непримитивными объектами, я просто передал бы Объект на панель, затем изменив объект на панели, также изменил бы значение объекта в основной программе. С такими примитивными типами, как Boolean и int, фактическое значение передается в Panel, а не как ссылка, поэтому изменение этих значений в панели не повлияет на остальную часть программы.

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

Должен быть способ сделать это, но я не могу думать об этом, есть идеи?

Заранее спасибо,

Крис.

Ответы [ 2 ]

3 голосов
/ 06 августа 2011

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

Обратите внимание, что такое поведение может иметь не только примитивные типы, но и все неизменяемые типы (например, String).

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

1 голос
/ 06 августа 2011

Я бы просто передал Объект на панель, затем изменил объект в панель, изменит значение объекта в основной программе как Что ж. С примитивными типами, такими как Boolean и int, фактическое значение передается в Panel, а не в качестве ссылки и, таким образом, изменяя эти Значения на панели не влияют на остальную часть программы.

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

Но если у вас есть пользователь с User.name (String) и User.age (int), и вы, например, изменили их с помощью JTextField, у вас возникла та же проблема, в то время как String не является примитивом. Строки являются неизменяемыми, поэтому вы можете просто изменить строку, на которую указывает ссылка, но, поскольку то, что вы передаете, является копией, исходный объект не затрагивается.

// Invokes your Panel with a new copy of the string reference
StringPropPanel ppun = new StringPropPanel (user.name); 
// Invokes your Panel with a new copy of the int reference
IntPropPanel ppua = new IntPropPanel (user.age); 
// Invokes your Panel with a new copy of a User reference
IntPropPanel ppup = new IntPropPanel (user.parent); 

Последнее будет работать - но поднимите вопрос, как создать такую ​​панель из пользователя.

PropPanel ppun = new PropPanel (user.name) {
    public void update () {
        user.setName (textfield.getText ());
    }
}

PropPanel ppun = new PropPanel (user.age) {
    public void update () {
        user.setAge (Integer.parseInt (textfield.getText ()));
    }
}

С абстрактным методом update, который запускается однозначно и может быть переопределен анонимными реализациями ad-hoc, вы можете добиться большего успеха.

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