Обращение к классу из другого класса
Как заставить объявленный элемент 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
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)