Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 361

Получение ссылки на "родительский" обьекта

18.02.2016, 16:36. Показов 2898. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем хай. Есть панель, на ней кнопка. Как получить ссылку на эту панель? Т.е. на кнопке стоит слушатель, и некоторые действия должны происходить именно в панели где стоит эта кнопка.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.02.2016, 16:36
Ответы с готовыми решениями:

Существование обьекта и получение ссылки
Доброго времени суток. Есть приложение, в котором вызываются dll(№1). В приложении подключена dll(№2) с определённым классом реализованным...

В Опере родительский див перекрывает дочерние ссылки
Название темы - Проблема в Опере родительский див перекрывает дочерние ссылки. - эти слова движок форума почему-то не пропустил. ...

Левое многоуровневое меню (родительский пункт без ссылки)
Здравствуйте! Очень, прошу подскажите, пожалуйста: Есть шаблон левого вертикального меню в битриксе: left_menu. Левое вертикальное...

14
 Аватар для RedPatrick
143 / 115 / 61
Регистрация: 13.01.2016
Сообщений: 305
18.02.2016, 17:24
button.getParent();
0
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 361
18.02.2016, 17:50  [ТС]
нет такого метода у меня... или может нет, потому что я пытаюсь ссылку получить в Listenere. т.e.
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("+")){


e.getParent() ?????

0
 Аватар для RedPatrick
143 / 115 / 61
Регистрация: 13.01.2016
Сообщений: 305
18.02.2016, 19:26
Смотрите, я Вам ответил на поставленный вопрос. Конкретно в Вашем случае, если хотите добраться до панельки прямо из Listener'а, придется городить вот это:

Java
1
2
3
4
5
            @Override
            public void actionPerformed(ActionEvent e) {
                JButton linkToButton = (JButton)e.getSource(); // e - объект класса ActionEvent, его "источник" (source) - кнопка
                JPanel parentPanel = (JPanel)linkToButton.getParent(); // а вот уже у кнопки "родитель" - панель
            }
Добавлено через 3 минуты
Но это некрасивая реализация, работать будет. но лучше использовать интерфейс. Как у вас реализована структура графических элементов? Чему принадлежит JPanel?
0
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 361
18.02.2016, 22:11  [ТС]
Структура такая.
Создается фрейм. К нему добавляется Panel(extended JPanel), в конструкторе которой добавлятся еще одна панель2 и кнопка.
Панель2 состоит из JtextField, которое добавляется тоже вконструкторе панели2.
При нажатии на кнопку на Panel(extended JPanel) добавляетс еще одна панель2.

Так как Panel(extended JPanel) будет несколько на фрейме, то нужно чтобы слушатель кнопки создавал панель2 именно в той Panel(extended JPanel), где и находится.
0
 Аватар для RedPatrick
143 / 115 / 61
Регистрация: 13.01.2016
Сообщений: 305
18.02.2016, 23:33
Очень плохо понял. Примерно так?
JFrame
<-Panel
<----JButton
<----Panel2
<------JTextField
<----Panel2
<------JTextField
0
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 361
19.02.2016, 00:00  [ТС]
JFrame
<-Panel
<----JButton
<----Panel2
<------JTextField
<-Panel
<----JButton
<----Panel2
<------JTextField


и каждый раз при нажатии Button добавляется
<----Panel2
<------JTextField
т.е. получается

JFrame
<-Panel
<----JButton
<----Panel2
<------JTextField
<----Panel2
<------JTextField
<-Panel
<----JButton
<----Panel2
<------JTextField
0
 Аватар для RedPatrick
143 / 115 / 61
Регистрация: 13.01.2016
Сообщений: 305
19.02.2016, 11:03
В таком случае смотрите. Нюансы:
1) Класс Panel назвал Panel1, чтобы не путаться с awt.Panel
2) В каждой Panel1 добавляется JPanel containerPanel, так как количство Panel2 будет неограниченно.
containerPanel добавляется через JScrollPane, для прокрутки.
3) Каждой панели заданы границы (setBorder (BorderFactory....)), чтобы было понятно где какая панель.

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
package com.company;
 
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
 
public class Main {
 
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MainFrame();
            }
        });
    }
}
 
class MainFrame extends JFrame {
 
    public MainFrame()  {
        super("Frame");
        setBounds(200,200,760,500);
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        add(new Panel1(), BorderLayout.WEST);
        add(new Panel1(), BorderLayout.CENTER);
        add(new Panel1(), BorderLayout.EAST);
    }
}
 
class Panel1 extends JPanel {
    JButton button = new JButton("ADD PANEL 2");
    java.util.List<Panel2> panels = new ArrayList<Panel2>();
    JPanel containerPanel = new JPanel();
 
    public Panel1() {
        setPreferredSize(new Dimension(250, 400));
        setBorder(BorderFactory.createTitledBorder("Panel 1"));
        setLayout(new BorderLayout());
        //теперь создаем панель2 и помещаем ее в List
        panels.add(new Panel2());
        //добавляем containerPanel через JScrollPane, чтобы было неограниченное добавление panel2
        containerPanel.setSize(new Dimension(220, 110 * panels.size()));
        containerPanel.setBorder(BorderFactory.createTitledBorder("Container"));
        containerPanel.setLayout(new BoxLayout(containerPanel, BoxLayout.Y_AXIS));
        containerPanel.add(panels.get(0));
        add(new JScrollPane(containerPanel), BorderLayout.CENTER);
        add(button, BorderLayout.SOUTH);
 
 
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                panels.add(new Panel2());
                containerPanel.setSize(new Dimension(220, 110 * panels.size()));
                containerPanel.add(panels.get(panels.size()-1));
            }
        });
 
    }
}
 
class Panel2 extends JPanel {
    JTextArea textArea = new JTextArea("TextArea");
 
    public Panel2() {
        setPreferredSize(new Dimension(200, 100));
        setBorder(BorderFactory.createTitledBorder("Panel 2"));
        add(textArea);
    }
}
1
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 361
20.02.2016, 17:11  [ТС]
Ух ты. Спасибо за такой развернутый ответ

Добавлено через 16 часов 31 минуту
RedPatrick,
подскажите, пожалуйста, а добавление панелей в List для чего? только для определения размера панели?
0
 Аватар для RedPatrick
143 / 115 / 61
Регистрация: 13.01.2016
Сообщений: 305
20.02.2016, 23:59
werrt, конкретно здесь - да. Ну и в любом же случае Вам необходимо в будущем как-то обращаться к панелям2. Создали объект - создали ссылку для обращения, нужно использовать панель - вызываете panels.get(i);
1
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 361
21.02.2016, 02:07  [ТС]
Согласен- красиво. Из LIst'a их вытаскивать, наверно надо будет создавать какую нить переменную count для всех панелей и назначать ее каждой панели, а потом через какой то такой цикл удалять и изменять:
Java
1
2
for(Panel i: panels ){
if(i.count ==  номер панели) panels.remove(i);
или все намного проще?

Добавлено через 19 минут
я просто удаляю панели по вашему совету: в МаусЛистенере
Java
1
2
3
4
JPanel panel = (JPanel) e.getSource(); // получаю ссылку на панель которую нужно удалить
JPanel parent = (JPanel) panel.getParent();// получаю ссылку на панель с которой нужно удалить
parent.remove(panel); // и удаляю
parent.validate();
0
 Аватар для RedPatrick
143 / 115 / 61
Регистрация: 13.01.2016
Сообщений: 305
21.02.2016, 11:27
werrt, так вполне удобно получается, если обрабатываете именно по клику на панели.
0
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 361
24.02.2016, 19:53  [ТС]
И снова проблема.
компоновка рограммы такая
JFrame
<-Panel1
<-Panel2
<----JButton
<----Panel3
Пытаюсь по нажатию Button получить ссылку на JFrame, чтобы потом на его Panel1 lдобавить новый элемент.
По идее он вляется вторым родителем Button. Пишу в Листенере:
if(e.getActionCommand().equals("Тест")){
MyButton button = (MyButton) e.getSource();
JPanel panel = (JPanel) button.getParent(); получаю ссылку на родителя кнопки, т.е. Panel2

JFrame frame= (JFrame) panel.getParent(); вроде бы это и должна быть ссылка на фрейм, но....


... получаю ошибку javax.swing.JLayeredPane cannot be cast to JFrame
Не понимаю откуда JLayeredPane? Что не так?

До

Добавлено через 59 минут
похоже до фрейма надо было дольше идти
JLayeredPane panel12= (JLayeredPane) panel1.getParent();
JRootPane panel13= (JRootPane) panel12.getParent();
0
 Аватар для RedPatrick
143 / 115 / 61
Регистрация: 13.01.2016
Сообщений: 305
25.02.2016, 10:53
Я предлагаю Вам использовать интерфейсы. Каждый класс в отдельном файле, разберитесь, комментарии добавил

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.company;
 
import javax.swing.*;
 
public class Main {
 
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MainFrame();
            }
        });
    }
}
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
package com.company;
 
import javax.swing.*;
import java.awt.*;
 
/**
 * 
 */
public class MainFrame extends JFrame {
    private ControlPanel controlPanel;
    private ContainerPanel containerPanel1;
    private ContainerPanel containerPanel2;
    private InputPanel inputPanel;
 
    public MainFrame()  {
        super("Frame");
        setBounds(200,200,760,500);
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        //создаем панели и добавляем в BorderLayout
        controlPanel = new ControlPanel();
        containerPanel1 = new ContainerPanel(1);
        containerPanel2 = new ContainerPanel(2);
        inputPanel = new InputPanel();
        add(inputPanel, BorderLayout.WEST);
        add(new JScrollPane(containerPanel1), BorderLayout.CENTER);
        add(new JScrollPane(containerPanel2), BorderLayout.EAST);
        add (controlPanel, BorderLayout.SOUTH);
 
        /*
        Задаем listener в controlPanel. Идея в том, что кнопки управления находятся на ней,
        а до всех элементов мы можем сразу добраться из MainFrame.
        Поэтому задаем listener и определяем, что делать здесь, а привязываем эти функции
        к нажатиям кнопок в самой controlPanel
        */
 
        controlPanel.setListener(new PanelListener() {
            @Override
            public void createPanel(PanelEvent evt) {
                if (evt.i == 1) {
                    containerPanel1.addPanel();
                }
                if (evt.i == 2){
                    containerPanel2.addPanel();
                }
            }
 
            @Override
            public void setPanelText() {
                String text = inputPanel.getText();
                containerPanel1.setText("1: " + text);
                containerPanel2.setText("2: " + text);
            }
        });
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.company;
 
import javafx.event.EventTarget;
 
import java.util.EventObject;
 
/**
 * 
 */
public class PanelEvent extends EventObject {
    int i;
 
    public PanelEvent(Object source, int i) {
        super(source);
        this.i = i;
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
package com.company;
 
/**
 * 
 */
public interface PanelListener {
 
    public void createPanel (PanelEvent evt);
 
    public void setPanelText();
}

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
package com.company;
 
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
 
/**
 * 
 */
public class ContainerPanel extends JPanel {
 
    private java.util.List<Panel2> panels = new ArrayList<Panel2>();
 
    public ContainerPanel(int index) {
        setPreferredSize(new Dimension(250, 500));
        setBorder(BorderFactory.createTitledBorder("Container " + index));
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
 
    }
 
    //Метод создания панели2, добавляем в ArrayList, потом перерисовывеамся
    public void addPanel(){
        panels.add(new Panel2());
        setSize(new Dimension(220, 110 * panels.size()));
        add(panels.get(panels.size()-1));
    }
 
    // Метод задания текста (метод append определили в Panel2)
    public void setText (String text){
        for (int i = 0; i < panels.size(); i++){
            panels.get(i).append(text);
        }
    }
}
Добавлено через 2 минуты
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
package com.company;
 
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
/**
 * 
 * Панель с тремя кнопками. Две добавляют панели2 в контейнеры, третья задает текст в textArea панелей
 */
public class ControlPanel extends JPanel {
    private JButton createPan1;
    private JButton createPan2;
    private JButton setString;
 
    //
    private PanelListener listener;
 
    public ControlPanel() {
 
        setPreferredSize(new Dimension(750, 60));
        setBorder(BorderFactory.createTitledBorder("Control Panel"));
        setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
        setString = new JButton("SET TEXT");
        createPan1 = new JButton("ADD PANEL");
        createPan2 = new JButton("ADD PANEL");
        add (setString);
        add (createPan1);
        add (createPan2);
        setString.setPreferredSize(new Dimension(250, 100));
        createPan1.setPreferredSize(new Dimension(250, 100));
        createPan2.setPreferredSize(new Dimension(250, 100));
 
        //задаем действия кнопкам
        setString.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (listener != null) listener.setPanelText();
            }
        });
 
        createPan1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (listener != null) listener.createPanel(new PanelEvent(this, 1));
            }
        });
 
        createPan2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (listener != null) listener.createPanel(new PanelEvent(this, 2));
            }
        });
    }
 
    public void setListener(PanelListener listener) {
        this.listener = listener;
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.company;
 
import javax.swing.*;
import java.awt.*;
 
/**
 * 
 * Панель, из которой берется текст
 */
public class InputPanel extends JPanel {
    private JTextField field = new JTextField(10);
 
    public InputPanel() {
        setPreferredSize(new Dimension(250, 400));
        setBorder(BorderFactory.createTitledBorder("Input panel"));
        add (field);
    }
 
    //метод получения текста
    public String getText(){
        return field.getText();
    }
}
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 com.company;
 
import javax.swing.*;
import java.awt.*;
 
/**
 * 
 */
 
public class Panel2 extends JPanel {
    //Панель2, как в предыдущем примере
    //делаем textArea - private, инкапсуляция.
    private JTextArea textArea = new JTextArea("TextArea");
 
    public Panel2() {
        setPreferredSize(new Dimension(200, 100));
        setBorder(BorderFactory.createTitledBorder("Panel 2"));
        add(textArea);
    }
 
    // Так как textArea закрыт для внешнего доступа, делаем метод для задания текста
    public void append (String text){
        textArea.setText(text);
    }
 
 
}
1
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 361
29.02.2016, 18:40  [ТС]
А как теперь все это велиеолепие сохранить. Я пытался через сериализацию. Т.е. создавал например, в главном фрейме поле
List listIn. Куда помещал при нажатии кнопки новую созданую панель. Далее сериализировал этот List. И вроде успешно(не было Exeption) Но вот при десериализации постоянно ошибка:
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.util.List

public static Object serIn() {
Object list =null;


try {

FileInputStream inputStream = new FileInputStream("serialization.ser");

ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);

list = objectInputStream.read();

inputStream.close();
objectInputStream.close();
System.out.println(list);



} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("Файла еще нет, щас новый запилим");
System.exit(1);


} catch (IOException e) {
e.printStackTrace();
}
return list;



а в мейне при его старте
listIn = (List) serIn();
где listIn как поле:
private static List<S> list = new ArrayList<>();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.02.2016, 18:40
Помогаю со студенческими работами здесь

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

Получение id еще не сохраненного обьекта
Добрый день. Есть форма, отправляет POST запросом данные (project) в контроллер. public ActionResult AddProject(Project...

Получение [i] массива при клике и его родительский элемент в массиве
Есть такой код: for (i = 0; i &lt;data.length; i++){ let names = data.name; let img = document.createElement('img'); ...

Получение значения в дочерних классах через указатель на родительский класс
Доброго времени! Есть вопрос по ООП Есть родительский класс (абстрактный) и дочерние наследующие классы (некоторые дочерние...

Получение html кода выделенного обьекта в WebBrowser
Здравствуйте. Вообщим нужно получить код выделенно фрагмента в веб браузере, собственно сабж=) тутчтото &lt;div&gt; блаблабла ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru