Перейти к содержимому

Как обратиться к другому классу

  • автор:

Обращение к классу из другого класса

Как заставить объявленный элемент menu в Main.java быть объявленным и в Menu.java , дабы слушатель сработал и при нажатии кнопки открылось новое окно? P.S Это нужно для разгрузки кода, ибо в длинном коде я быстро теряюсь. И да, это не весь код, а только его небольшой кусок. Main.java

package com.company; import javax.swing.*; public class Main < public static void main(String[] args) < JFrame Mainframe = new JFrame(); JPanel Mainpanel = new JPanel(); Mainframe.setSize(1050,700); Mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Mainframe.add(Mainpanel); Mainframe.setTitle("None"); Mainpanel.setLayout(null); JButton menu = new JButton("Меню"); menu.setBounds(600,580,434,81); Mainpanel.add(menu); Mainframe.setVisible(true); >> 
package com.company; import javax.swing.*; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class Menu < public Menu < menu.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent e) < JFrame frame_menu = new JFrame(); frame_menu.setSize(250,250); >>); > > 

Отслеживать

Quark-Coder

задан 25 фев 2021 в 17:53

Quark-Coder Quark-Coder

43 9 9 бронзовых знаков

Создать экземпляр класса Menu и присвоить полю этого класса необходимое значение. Теперь есть доступ к кнопке из обоих классов. public class Menu и Menu men = new Menu(); men.menu = new JButton(«Меню»);

25 фев 2021 в 18:07

@ВасяВоронцов Это нужно вписывать в Menu.java?

Как мне вызвать метод из другого класса?

Есть два класса, в одном из которых есть метод мэйн, в другом классе тоже есть методы. Как мне из класса. где есть метод мэйн вызвать методы другого класса?

  • Вопрос задан более трёх лет назад
  • 44310 просмотров

Комментировать
Решения вопроса 0
Ответы на вопрос 5
Михаил @cocain1988

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

class Apple < public String color; public String color()< return color>> class Shop < public static void main(String[] args)< Apple a = new Apple(); System.out.println( a.color() ); // Данный метод должен вывести цвет. >>

А более подробно лучше конечно прочитать документацию по тем ссылкам которые указывались ранее.

Ответ написан более трёх лет назад
Нравится 5 1 комментарий
Спасибо, хоть один добрый человек объяснил для чайников
software engineer
Пройди туториал чтоли?
docs.oracle.com/javase/tutorial
Ответ написан более трёх лет назад
Нравится 3 1 комментарий
olololosh @olololosh Автор вопроса
спасибо, сам вспомнил, а то посреди ночи голова уже не варит, не подумав, сразу вопросы задаю
localghost @localghost

И как-то никто, по-моему, даже не намекнул на суть.
КМК, не хватает понимания, что (обычно) нельзя вызвать просто метод класса. Класс — это шаблон, по которому создаются объекты. Чтобы вызвать «метод класса», надо создать объект этого класса, а потом обратиться к объекту, мол, дорогой, вызови-ка свой метод такой-то.

Как обратиться к методу другого класса java

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

Например, вы работаете в классе Main и вам необходимо использовать методы класса ArrayList, выглядеть это будет следующим образом:

import java.util.ArrayList; public class Main  ArrayListInteger> numbers = new ArrayList<>(); numbers.add(1); numbers.add(2); // и далее ваш код. > 

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

// импортируем класс Arrays import java.util.Arrays; String[] array = new String[] "one", "two", "three">; // вызовем статический метод toString() System.out.println(Arrays.toString(array)); // => [one, two, three] 

Как из метода класса вызвать метод другого класса, когда оба внутри третьего класса?

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

Зачем мне это нужно: в программе леплю класс, абстрагирующий от остального кода GUI. Внутри него должно крутится все связанное с *graphical toolkit name*. Два окна, два класса. В одном прилетает callback, оно себя закрывает и должно вызывать show для другого окна.

Gregon ★
02.12.12 16:33:12 MSK

1) передай в B инстанс a параметром. Я за этот вариант.

2) сделай глобальную переменную a (см. оператор global).

PS Кстати, перменные глобальны только в пределах одного модуля.

true_admin ★★★★★
( 02.12.12 16:42:22 MSK )
Ответ на: комментарий от true_admin 02.12.12 16:42:22 MSK

Сделал передачу инстанса в __init__(), заработало, спасибо.

Другие варианты как подобные вещи разруливать существуют? Имхо, если есть сотня окон то начинается трэш и угар: они создаются и уничтожаются. Придется создавать список и регулярно обновлять его. Выглядит как костыль. А глобальные переменные всегда предавались анафеме)

Gregon ★
( 02.12.12 16:54:30 MSK ) автор топика
Ответ на: комментарий от Gregon 02.12.12 16:54:30 MSK

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

А список с регулярными обновлениями делается просто, посмотри weakref модуль. Дальше в __init__ просто в этот контейнер запихиваешь self.

import weakref container = weakref.weakSet() class Test: def __init__(self): container.add(self) 

true_admin ★★★★★
( 02.12.12 17:02:10 MSK )

Может тебя так устроит?

class A(object): def func(self): print "it works" class B(object): def func2(self, ns): ns.a.func() class C(object): def __init__(self): self.a = A() self.b = B() self.b.func2(self) if __name__ == '__main__': c = C() 

k0valenk0_igor ★★★
( 02.12.12 17:07:31 MSK )
Ответ на: комментарий от true_admin 02.12.12 17:02:10 MSK

Callback прилетает после нажатия кнопки в визарде первой настройки, с ним прилетает исключительно инфа «закрой окно, я закончил».

Gregon ★
( 02.12.12 17:15:18 MSK ) автор топика
Ответ на: комментарий от Gregon 02.12.12 17:15:18 MSK

я думаю ты что-то не то делаешь. Я надеюсь ты не пытаешься написать абстрактную обёртку для любого *graphical toolkit name*?

true_admin ★★★★★
( 02.12.12 17:17:25 MSK )
Ответ на: комментарий от k0valenk0_igor 02.12.12 17:07:31 MSK

Отлично, так тоже работает и теперь у меня есть доступ к неймспейсу суперкласса, большое спасибо.

Gregon ★
( 02.12.12 17:20:31 MSK ) автор топика

class A(object): def func(self): print "it works" class B(object): def func2(self): self.a.func() class C(object): def __init__(self): a = A() b = B() b.a = a b.func2() if __name__ == '__main__': c = C() 

k0valenk0_igor ★★★
( 02.12.12 17:21:15 MSK )
Ответ на: комментарий от Gregon 02.12.12 17:20:31 MSK

Да не за что. Удачи, коллега!)))

k0valenk0_igor ★★★
( 02.12.12 17:22:09 MSK )
Ответ на: комментарий от Gregon 02.12.12 17:20:31 MSK

теперь у меня есть доступ к неймспейсу суперкласса

Что ты называешь «суперклассом»?

tailgunner ★★★★★
( 02.12.12 17:22:18 MSK )
Ответ на: комментарий от true_admin 02.12.12 17:17:25 MSK

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

Gregon ★
( 02.12.12 17:22:59 MSK ) автор топика
Ответ на: комментарий от tailgunner 02.12.12 17:22:18 MSK

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

Gregon ★
( 02.12.12 17:26:39 MSK ) автор топика

Как из метода класса вызвать метод другого класса, когда оба внутри третьего класса?

как минимум так:

class A(object): def func(self): print "it works" class B(object): def func2(self, a): a.func() class C(object): def __init__(self): a = A() b = B() b.func2(a) if __name__ == '__main__': c = C() 

AGUtilities ★★★
( 02.12.12 17:26:51 MSK )
Ответ на: комментарий от Gregon 02.12.12 17:22:59 MSK

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

я так и думал. Забей на это потому что:

1) не справишься

2) это бессмысленная задача, 99% времени всё равно будешь сидеть либо на qt, либо на gtk

4) делать абстрактный универсальный код «на все случаи жизни» это классическая ошибка программистов. Протрахаешься неделю/месяц и забьёшь, а результата не получишь

5) даже если сделаешь костыль он будет страшен потому что тулкиты между собой отличаются не только именами функций, но ещё архитектурой. Поэтому у тебя будет, по-сути, написаны очень разные обёртки с одним API. Так сделай сразу как надо: разбей свою программу на низкоуровневую библиотеку и к ней напиши несколько интерфейсов.

Короче, потрать время с большей пользой.

true_admin ★★★★★
( 02.12.12 18:07:20 MSK )
Последнее исправление: true_admin 02.12.12 18:07:58 MSK (всего исправлений: 1)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *