Форум программистов, компьютерный форум, киберфорум
Java: GUI, Графика
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 10.05.2019
Сообщений: 10
1

Почему в GUI нельзя использовать объект в main?

11.05.2019, 05:26. Просмотров 1127. Ответов 12
Метки нет (Все метки)

Делаю в конструкторе NetBeans,
и проблема в том, что я не знаю, как использовать методы, ибо,
если объявить объект ( 1 скриншот),
Почему в GUI нельзя использовать объект в main?

то в main компилятор говорит,
что его нельзя использовать, ссылаясь на " non-static variable Jf cannot be referenced from a static context".
И соответственно не получается вызвать метод change5() . (2 скриншот)
Почему в GUI нельзя использовать объект в main?

Если же сделаю его статическим, то ошибку будет вызывать уже, находящийся в нем, jButton, ибо он не является
статическим. (3 скриншот)
Почему в GUI нельзя использовать объект в main?

Спасите, скажите, как нужно сделать?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.05.2019, 05:26
Ответы с готовыми решениями:

Почему в int main() нельзя вернуть значение больше 255?
Другие любые функции int могут вернуть число больше 255, но не в случае main(), по крайней мере в...

Почему break нельзя использовать в if?
почему break нельзя использовать в if вот код if(f.eof()==1) { break; } про break MVS...

Почему структуру нельзя использовать в классе?
#include <iostream> class editor_form { struct prop { int y; }; prop...

Почему нельзя использовать метод ReadAllLines?
static int FoundConst(string fileAddress, string cs) { ...

12
Супер-модератор
Эксперт PythonЭксперт Java
5896 / 3369 / 1330
Регистрация: 21.10.2017
Сообщений: 10,003
11.05.2019, 08:08 2
Farafa, ты бы код привел вместо скриншотов...
Если у тебя инициализируются компоненты и вызывается setVisible прямо в конструкторе класса JF, то в мэйне достаточно просто создать объект твоего класса. JF jf = new JF();
И уж потом вызывать его методы.
0
0 / 0 / 0
Регистрация: 10.05.2019
Сообщений: 10
11.05.2019, 16:32  [ТС] 3
Я не могу привести код, так как там слишком много строчек.
"в мэйне достаточно просто создать объект твоего класса. JF jf = new JF();"
Согласен, но дело в том, что у меня в событиях на кнопках
должны вызываться методы, которые есть в классе.
Почему в GUI нельзя использовать объект в main?

Если я создам объект в начале класса JF jf = new JF(); ,
Почему в GUI нельзя использовать объект в main?

то, при вызове через него методов в событиях кнопок ,
выдаст ошибку Exception in thread "main" java.lang.StackOverflowError, а
дальше указывать на место создания объекта.
Я могу создавать в событиях кнопки каждый раз новый объект,
Почему в GUI нельзя использовать объект в main?

он действительно будет выполнять метод, но при этом открывать новое
окно
Почему в GUI нельзя использовать объект в main?

И в этом проблема: каждый новый объект создает свое окно, но мне нужно вносить изменения в один и тот же
0
0 / 0 / 0
Регистрация: 10.05.2019
Сообщений: 10
11.05.2019, 16:50  [ТС] 4
Вот, я вырезал ту часть кода, о которой написал
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package g;
 
 
public class JF extends javax.swing.JFrame {
 
   JF jf = new JF();
    
    public JF() {
        initComponents();
    }
    
void change5( int a){
       
     switch (a) {
case 1:{
    jLabel1.setText(jLabel1.getText()+" 1 ");
    break;
}
    
case 2:
{
    jLabel1.setText(jLabel1.getText()+" 1 ");
}
    
case 3:
{
    jLabel1.setText(jLabel1.getText()+" 1 ");
}
    
case 4:
{
    jLabel1.setText(jLabel1.getText()+" 1 ");
}
    
case 5:
{
     jLabel1.setText(jLabel1.getText()+" 1 ");
}
   
     }}
   
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {
 
        jButton1 = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
 
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
 
        jButton1.setText("jButton1");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });
 
        jLabel1.setText("jLabel1");
 
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(46, 46, 46)
                        .addComponent(jButton1))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(36, 36, 36)
                        .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 106, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(93, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(39, 39, 39)
                .addComponent(jButton1)
                .addGap(18, 18, 18)
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 49, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(29, Short.MAX_VALUE))
        );
 
        pack();
    }// </editor-fold>                        
 
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        jf.change5(3);
    }                                        
 
  
    public static void main(String args[]) {
       
        
        
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(JF.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(JF.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(JF.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(JF.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
 
       
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new JF().setVisible(true);
            }
        });
    }
 
    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    // End of variables declaration                   
}
0
Супер-модератор
Эксперт PythonЭксперт Java
5896 / 3369 / 1330
Регистрация: 21.10.2017
Сообщений: 10,003
11.05.2019, 16:51 5
Farafa, омг. Объект класса JF нужно создавать НЕ В КЛАССЕ JF
0
0 / 0 / 0
Регистрация: 10.05.2019
Сообщений: 10
11.05.2019, 19:24  [ТС] 6
А где? Каким образом вызывать методы в событиях?
0
Супер-модератор
Эксперт PythonЭксперт Java
5896 / 3369 / 1330
Регистрация: 21.10.2017
Сообщений: 10,003
11.05.2019, 19:50 7
Твой класс JF - наследник JFrame. Т.е., по сути, класс-окно. В нем происходит и отрисовка окна с компонентами, и отслеживание/реакция на события.
Так создай экземпляр этого класса в другом классе!!! Убери отсюда public static void main() !!!

Добавлено через 31 секунду
Java
1
2
3
4
5
6
7
8
9
package ru.ismoke;
 
public class Cyber {
 
    public static void main(String[] args) {
        JF jf = new JF();
        jf.go();
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package ru.ismoke;
 
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
public class JF extends JFrame implements ActionListener {
    private JButton button = new JButton("click");
 
    public void go(){
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setBounds(200,200,200,100);
        setLayout(new BorderLayout());
        JPanel panel = new JPanel();
        button.setBounds(10,10,50,20);
        button.addActionListener(this);
        panel.add(button);
        add(panel);
        setVisible(true);
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        JOptionPane.showMessageDialog(this, "CLICKED!!!");
    }
}
1
0 / 0 / 0
Регистрация: 10.05.2019
Сообщений: 10
11.05.2019, 21:51  [ТС] 8
Нет проблем, я сделал соседний класс, в котором создал вызов и метод.
Вот код
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class T {
 private javax.swing.JLabel jLabel1;
 
    public static void main(String[] args) {
         
       System.out.println("htth");
         JF jf = new JF();
       
      jf.setVisible(true);
      T t = new T ();
      t.change5();
      
    }
    void change5( ){
       
   jLabel1.setText("hth");
 
     }
    
}
Выдает ошибку
Exception in thread "main" java.lang.NullPointerException
at t.T.change5(T.java:20)
at t.T.main(T.java:15)
0
Кандёхаем веселее!
295 / 326 / 76
Регистрация: 02.10.2012
Сообщений: 2,171
11.05.2019, 21:59 9
Farafa, объект jLabel1 тут не инициализирован, он равен null. Также предполагаю, что эта метка (jLabel1) будет отображаться на форме, тогда её объявление и манипуляции с ней логично перенести в класс JF, во избежание путаницы.
1
Супер-модератор
Эксперт PythonЭксперт Java
5896 / 3369 / 1330
Регистрация: 21.10.2017
Сообщений: 10,003
11.05.2019, 21:59 10
Лучший ответ Сообщение было отмечено Farafa как решение

Решение

Farafa, рано ты в гуй полез, ох рано...
Ты задекларировал поле класса типа JLabel, так?
Потом пытаешься у него вызвать метод setText(), так?
А инициализировать поле кто будет???
Java
1
2
public class T {
 private JLabel jLabel1 = new JLabel();
0
0 / 0 / 0
Регистрация: 10.05.2019
Сообщений: 10
12.05.2019, 00:07  [ТС] 11
Ахах, так Вы меня выгнали в соседний класс(((
Я и так вижу, что он выдает NullPointerException.
Умоляю, ради всего доброго в этом мире, не мучайте: покажите, как вызвать из события метод.
0
Супер-модератор
Эксперт PythonЭксперт Java
5896 / 3369 / 1330
Регистрация: 21.10.2017
Сообщений: 10,003
12.05.2019, 00:12 12
Farafa, ты что, тролль? Или прикидываешься?
Я тебе написал пример. Метод actionPerformed вызывается при наступлении события. Вызывай внутри хоть 100500 методов.
0
0 / 0 / 0
Регистрация: 10.05.2019
Сообщений: 10
12.05.2019, 00:18  [ТС] 13
Ойк. У мя получилось. Большое спасибо за терпение
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.05.2019, 00:18

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

Почему нельзя использовать глобальные переменные
Здравствуйте, собственно вышел сиз данным вопросом в гугл и на стаке нашел такой ответ:...

Почему допустимо создавать объект по другому объекту, но нельзя присваивать уже созданный объект, другому созданному объекту?
Это можно : Array a(10); a.set(0,5); Array b(a); А это нельзя : Array a(10); Array b(20);...

Почему нельзя в функциях использовать типизированные указатели ?
Почему нельзя в функциях использовать типизированные указатели ? Напр почему так нельзя ? {$R...

Почему в сокращённой записи if нельзя использовать return
Здравствуйте. Решил воспользоваться сокращённой записью if. Например: int temp() { int a; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.