Я могу читать, но не могу редактировать содержание основного класса - PullRequest
0 голосов
/ 06 ноября 2010

Я использую netbeans для программирования чего-либо с помощью пользовательского интерфейса ... У меня есть главный класс с именем "NewJFrame.java" (A) и еще один класс с именем "NewClass.java" (B).Класс A расширен до класса B следующим образом:

public class NewClass extends NewJFrame{
   ...
}

Содержимое ClassA является общедоступным статическим, как это:

public static javax.swing.JTextField TextBox1;

У меня также есть кнопка в classA .Таким образом, когда я нажимаю кнопку, она вызывает функцию из classB, и эта функция должна редактировать текст TextBox1 ...

Вот что происходит, когда я нажимаюкнопка:

private void jToggleButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                               

    String Str1;
    NewClass nc = new NewClass();
    Str1=nc.call();

}

Вот функция в ClassB:

public String call()
{

    String Str;
    Str = TextBox1.getText();
    TextBox1.setText(Str + "1");  //This part isn't work.
    JOptionPane.showConfirmDialog(null,Str,"22222222",JOptionPane.PLAIN_MESSAGE);
    return Str;
}

Так что я могу прочитать текст TextBox1 и показать его в окне сообщения, но не могу редактировать его текст,Если я помещу этот код в основной класс, он работает отлично, но в другом классе он не работает.Может кто-нибудь помочь мне решить эту проблему?

(я использую netbeans 6.9.1)


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

Ответы [ 4 ]

1 голос
/ 06 ноября 2010

Проблема, с которой вы сталкиваетесь, не имеет ничего общего с IDE NetBeans, вы столкнетесь с той же проблемой с любой IDE для этого кода.

Один из способов достижения этого - объединение класса NewJFrame в NewClass.его расширения:

Позвольте мне объяснить с помощью некоторого кода:

public class NewClass {
    private NewJFrame frame = null;

    public NewClass(NewJFrame frame) {
        this.frame = frame;
    }

    public String call()
    {

        String text;
        text = frame.TextBox1.getText();
        frame.TextBox1.setText(text + "1");  //This will work now.
        JOptionPane.showConfirmDialog(null,text,"22222222",JOptionPane.PLAIN_MESSAGE);
        return text;
    }

}

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

private void jToggleButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                               

    String Str1;
    NewClass nc = new NewClass(this); // see the parameter we are passing here
    Str1=nc.call();

}

Когда мы создаем объект класса NewClass, мы передадим ссылку на вызывающий в данный момент объект NewJFrame

Это будет работать, проверим его.

Теперь выясним, почему ваш код не являетсяза работой.Когда NewClass расширяет NewJFrame и когда вы создаете новый объект класса NewClass, он содержит отдельную копию NewJFrame, которая отличается от вызывающей ссылки NewJFrame, следовательно, поле устанавливается в другом JFrame, а не в том, что вы хотели.

с уважением
Тушар Джоши, Нагпур

0 голосов
/ 06 ноября 2010

Я действительно не понимаю, почему вы заставляете себя использовать для этого новый класс?Даже если вам НУЖНО, я не понимаю, почему NewClass расширяет NewJFrame, поскольку вы только создаете экземпляр для вызова метода, который не имеет ничего общего с GUI.

Я думаю, что создание NewClass не является необходимым.Написание всего кода в одном классе само по себе не плохо.Это действительно зависит от многих факторов: сколько стоит «весь код»?Имеет ли смысл разделять обязанности?И т. Д., И т. Д. *

Так что JTextField и JButton НЕ статичны и НЕ общедоступны, и просто делайте все в них:

private void jToggleButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                               

    String str = TextBox1.getText();
    TextBox1.setText(str + "1");  //This part isn't work.
    JOptionPane.showConfirmDialog(null,Str,"22222222",JOptionPane.PLAIN_MESSAGE);
}

PS: имена переменных начинаются с нижнего регистра str , не String Str .

0 голосов
/ 06 ноября 2010

Нашел решение. Я бросаю содержимое везде, где я буду использовать. Вот пример:

Основной класс:

private void formWindowOpened(WindowEvent evt) {                                  
    Tab1Codes tc1 = new Tab1Codes();
    if(!tc1.LockAll(TabMenu1))
        System.exit(1);
    tc1.dispose();
}   

Еще один класс, где я добавил некоторые из моих кодов:

public boolean LockAll(javax.swing.JTabbedPane TabMenu){
    try
    {
        TabMenu.setEnabledAt(1, false);
        TabMenu.setEnabledAt(2, false);
        TabMenu.setEnabledAt(3, false);
        TabMenu.setEnabledAt(4, false);
    }catch(Exception e)
    {
        JOptionPane.showConfirmDialog(null, "I can't Lock the tabs!",
                "Locking tabs...",
                JOptionPane.PLAIN_MESSAGE,
                JOptionPane.ERROR_MESSAGE);
        return false;
    }
    return true;
}

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

0 голосов
/ 06 ноября 2010

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

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