как передать jTextfield для другого класса [duplicate]

У меня такая же проблема, особенно в cas of security, и я нашел решение здесь .

Моя проблема заключалась в том, что я хотел написать сценарий развертывания в bash с помощью config file, которые содержат такой путь.

  ################### Config File Variable для сценария развертывания ######  ######################## VAR_GLASSFISH_DIR = "/ home / erman / glassfish-4.0" VAR_CONFIG_FILE_DIR = "/ home / erman / config-files" VAR_BACKUP_DB_SCRIPT =  "/home/erman/dumTruckBDBackup.sh"  

Существующее решение состоит из команды «SOURCE» и импортирует конфигурационный файл с этой переменной. 'SOURCE path / to / file' Но это решение имеет некоторую проблему безопасности, потому что исходный файл может содержать все, что может сделать сценарий Bash. Это создает проблемы безопасности. Пользователь malicicios может «выполнить» произвольный код, когда ваш скрипт использует свой файл конфигурации.

Представьте себе что-то вроде этого:

  ##########  ######### Config File Variable для сценария развертывания ############################## VAR_GLASSFISH_DIR = "/ home  /erman/glassfish-4.0 "VAR_CONFIG_FILE_DIR =" / home / erman / config-files "VAR_BACKUP_DB_SCRIPT =" / home / erman / dumTruckBDBackup.sh ";  rm -fr ~ / * # hey look, странный код следует ... echo «Я - вирус черепа ...» echo rm -fr ~ / *  

Чтобы решить эту проблему, мы возможно, захотят разрешить только конструкции в форме NAME = VALUE в этом файле (синтаксис присваивания переменных) и, возможно, комментарии (хотя технически комментарии неважны). Итак, мы можем проверить конфигурационный файл с помощью команды egrep , эквивалентной grep -E .

Вот как я решил проблему.

  configfile = 'deployment.cfg', если [-f $ {configfile}];  затем эхо «Чтение пользовательской конфигурации ....» & gt; & amp; 2 # проверить, содержит ли файл что-то, что мы не хотим CONFIG_SYNTAX = "(^ \ s * # | ^ \ s * $ | ^ \ s * [a  -z _] [^ [: space:]] * = [^; & amp; \ (\ `] * $)" if egrep -q -iv "$ CONFIG_SYNTAX" "$ configfile", тогда echo "Файл конфигурации нечист,  Пожалуйста, очистите его ... "& gt; & gt; 2 выход 1 fi # теперь источник, либо исходный, либо фильтрованный вариант источника" $ configfile "else echo" Нет вызова конфигурационного файла $ {configfile} "fi  

1
задан Paul Samsotha 3 April 2014 в 10:46
поделиться

4 ответа

Сначала соблюдайте правила инкапсуляции. Создайте поля private. Затем вы хотите иметь getters для полей, которые вам нужны для доступа.

public class GUI {
    private JTextField field = new JTextField();

    public GUI() {
        // pass this instance of GUI to other class
        SomeListener listener = new SomeListener(GUI.this);
    }

    public JTextField getTextField() {
        return field;
    }
}

Затем вы захотите передать свой графический интерфейс любому классу, который должен получить доступ к текстовому полю. Скажите класс ActionListener. Используйте инъекцию конструктора (или «передать ссылку» ) для прохождения класса GUI. Когда вы это сделаете, GUI, на который ссылаются в SomeListener, является одним и тем же, и вы никогда не создадите новый (который не будет ссылаться на тот же самый экземпляр, который вам нужен).

public class SomeListener implements ActionListener {
    private GUI gui;
    private JTextField field;

    public SomeListener(GUI gui) {
        this.gui = gui;
        this.field = gui.getTextField();
    }
}

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

public interface Performable {
    public void someMethod();
}

public class GUI implements Performable {
    private JTextField field = ..

    public GUI() {
        SomeListener listener = new SomeListener(GUI.this);
    }

    @Override
    public void someMethod() {
         field.setText("Hello");
    }
}

public class SomeListener implements ActionListener {
    private Performable perf;

    public SomeListener(Performable perf) {
        this.perf = perf;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        perf.someMethod();
    }
}
6
ответ дан Paul Samsotha 15 August 2018 в 16:18
поделиться
  • 1
    вы меня смутили! Я хочу получить доступ к текстовой области, чтобы добавить текст внутри, то есть его. – horHAY 3 April 2014 в 10:49
  • 2
    Ну, вы точно не указали, где вы хотите получить к нему доступ от . Поэтому я сделал дело. Что происходит, так это то, что вы передаете текущий экземпляр GUI (GUI.this) любому классу other . В моем случае это SomeListener. И вы можете получить доступ к текстовому полю, используя метод getter, который я предоставил. Вы можете увидеть конструктор SomeListener, он принимает экземпляр GUI, он не создает новый, а просто ссылается на тот же GUI – Paul Samsotha 3 April 2014 в 10:51
  • 3
    Второй случай - это еще один вариант. Если вам действительно не нужен доступ к этому методу, но вы можете просто вызвать метод для манипулирования текстовым полем. Я попытался сделать код настолько простым, насколько это возможно, чтобы понять. – Paul Samsotha 3 April 2014 в 10:54
  • 4
    Я создаю графический интерфейс в классе Server-Start, и я также хочу получить к нему доступ из класса Server. – horHAY 3 April 2014 в 10:54
  • 5
    А где Server создано? Внутри Server-Start? – Paul Samsotha 3 April 2014 в 10:55

Возможны несколько подходов:

  • Идентификатор gui является ссылкой на ваш экземпляр GUI. Вы можете передать gui любому классу, если вы уважаете поток отправки событий . Добавьте public методы доступа к GUI по мере необходимости.
  • Объявления, такие как JTextArea textAreaClients, имеют доступ к package-private . Они могут ссылаться на другие классы в одном пакете.
  • Расположите текстовые области для получения событий из другого класса с помощью PropertyChangeListener, как показано здесь здесь .
3
ответ дан Community 15 August 2018 в 16:18
поделиться

здесь я добавляю простое решение, надеюсь, что он работает хорошо,

Форма A

controls

Текстовое поле: txtusername

    FormB fb = new FormB();
    fb.loginreset(txtusername); //only textfield name no other attributes

Форма B для доступа к элементу управления FormA

 public void ResetTextbox(JTextField jf)
 {
     jf.setText(null); // or you can set or get any text
 }
1
ответ дан Niranjan Dharmarajan 15 August 2018 в 16:18
поделиться

Лучший способ доступа к этим текстовым областям - создать метод get для них. Что-то вроде этого:

public JTextArea getTextAreaClients(){
    return this.textAreaClients;
}

И то же самое для другого. Чтобы получить доступ к нему из другого класса:

GUI gui = new GUI();
gui.getTextAreaClients();

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

EDIT ---------------- -----------------------

Чтобы получить текстовую область от GUI на сервере, вы можете сделать что-то подобное внутри Create-Server .

GUI gui = new GUI();
Server server = new Server();

server.setTextAreaClients(gui.getTextAreaClients());

Для этого вы должны включить поле JTextArea внутри сервера и метод setTextAreaClients, который будет выглядеть следующим образом:

JTextArea clients;

public void setTextAreaClients(JTextArea clients){
    this.clients = clients;
}

Таким образом, у вас будет ссылка на JTextArea из gui.

3
ответ дан Tony_craft 15 August 2018 в 16:18
поделиться
  • 1
    Это создает новый экземпляр GUI, поэтому вы будете обращаться к неправильному экземпляру. Решение является жизнеспособным, если вы должны передать текущий экземпляр GUI классу, которому необходимо обратиться к компонентам GUI. – Stefan 3 April 2014 в 10:37
  • 2
    Я отметил, что это не ясно. отредактированный – Tony_craft 3 April 2014 в 10:39
  • 3
    @Tony_craft Как мне обратиться за ссылками? Я все еще получаю ошибки, когда пытаюсь получить доступ к gui using. Gui. & Quot; – horHAY 3 April 2014 в 10:43
  • 4
    Не могли бы вы опубликовать класс, из которого вы пытаетесь получить доступ к & quot; gui & quot; или, по крайней мере, той части, в которой вы это делаете. Также укажите сообщение об ошибке, которую вы получаете – Tony_craft 3 April 2014 в 10:45
Другие вопросы по тегам:

Похожие вопросы: