Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/23: Рейтинг темы: голосов - 23, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 13.04.2010
Сообщений: 16

Программное добавление компонента. NetBeans.

19.01.2011, 13:51. Показов 4928. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Допустим, есть у меня на фрейме панель. Хочу программно добавить кнопку. Делаю так.

Java
1
2
3
4
5
6
    
public NewJFrame() {
        initComponents();
        jPanel1.add(new JButton("My Button"));
        jPanel1.getParent().validate();
    }
Результат нулевой. Что делать и кто виноват?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.01.2011, 13:51
Ответы с готовыми решениями:

Добавление модуля UML в NetBeans 6.5
Не видит этот модуль. Я скопировал папку uml6 в папку с программой. Далее перезапускаю netbeans, создаю новый проект, но в Categories нет...

Добавление проекта в NetBeans
Добрый день всем. Ребята подскажите как в NetBeans добавить существующий проект?

JTable в NetBeans: добавление столбцов
Добрый вечер. Работая над своим Java-проектом в NetBeans, у меня возникла небольшая проблема с добавлением столбцов в таблицу JTable, а...

10
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
19.01.2011, 19:59
Как это ни парадоксально, но виноваты Вы сами. Вы не разобрались, какой менеджер раскладки используется NetBeans по умолчанию. Посмотрите, какие телодвижения предпринимаются в initComponents для добавления элементов, Вам понравится. Сравните с Вашим вариантом.

В общем, я бы лично поменял раскладку на GridBagLayout, так у Вас существенно больше шансов добавить что-то руками, при грамотном использовании, разумеется.

P.S. Интерфейс я лично пишу в основном руками. Получается быстрее и более предсказуемо.
0
эволюционирую потихоньку
 Аватар для TanT
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
19.01.2011, 20:11
чтобы отобразить компонент, достаточно перерисовать компонент после добавления элемента. не взирая на используемый менеджер компонент присутствует. достаточно изменить размеры окна, что вызовет его перерисовку, и можно лицезреть добавленный элемент
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
20.01.2011, 10:57
Вы пребываете в иллюзии.

1. Компонента вполне может не присутствовать. Скажем, при использовании BorderLayout два последовательных вызова add(Component) приведут к тому, что первая добавляемая компонента будет удалена из контейнера.

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

3. Компонента может присутствовать, но менеджер выставит ей размер 0x0, ибо опять-таки не знает, как ее расположить.

4. Компонента может располагаться за пределами видимой части контейнера. Этим грешит FlowLayout.

В любом из перечисленных случаев отрисовка ничего не даст.
0
эволюционирую потихоньку
 Аватар для TanT
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
20.01.2011, 12:00
Цитата Сообщение от Skipy Посмотреть сообщение
Вы пребываете в иллюзии.
мы вообще все в матрице


Цитата Сообщение от Skipy Посмотреть сообщение
2. Компонента может присутствовать, но менеджер не знает, где ее расположить. Ибо не имеет дополнительных данных по привязке. Это именно наш случай.

3. Компонента может присутствовать, но менеджер выставит ей размер 0x0, ибо опять-таки не знает, как ее расположить.
как?!! не понимаю, как менеджер позволит вам создать объект без необходимой информации или так подло кинуть с размерами.

пример в студию, а лучше по примеру на каждый из пунктов. надо разобраться в вопросе.
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
20.01.2011, 14:08
Ну вот Вам пример на оба пункта.

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
package ru.skipy.tests;
 
import javax.swing.*;
import java.awt.*;
 
/**
 * LayoutSample1Test
 *
 * @author Eugene Matyushkin aka Skipy
 * @since 20.01.2011
 */
public class LayoutSample1Test extends JFrame {
 
    LayoutSample1Test(){
        super("Layout sample 1");
        JPanel p = new JPanel(new GridBagLayout());
        p.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
        p.setBackground(Color.white);
        JCheckBox cb = new JCheckBox("Check me");
        cb.setOpaque(false);
        final JTextField tf = new JTextField();
        tf.setBorder(null);
        tf.setBackground(new Color(192,192,255));
        JButton btn = new JButton("Click me");
        p.add(cb, new GridBagConstraints(0,0,1,1,1,0,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0,0,0,5), 0,0));
 
        p.add(tf, new GridBagConstraints(1,0,1,1,1,0,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0,0,0,5), 0,0));
//        p.add(tf);
 
        p.add(btn, new GridBagConstraints(2,0,1,1,1,0,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0,0,0,5), 0,0));
        setContentPane(p);
        setSize(400, 100);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }
 
    public static void main(String[] args) {
        new LayoutSample1Test().setVisible(true);
    }
}
В этом варианте текстовое поле видно. Раскомментируйте строку, добавляющую поле без описания ограничений, и закомментируйте ту, что над ней (в принципе, даже это необязательно). Поле пропадает. Причем обратите внимание, что оно есть в контейнере: по нажатию Tab фокус с галки уходит на кнопку, а потом неизвестно куда - визуально это не видно. Однако проследить легко:

Java
1
2
3
4
5
6
7
8
9
10
11
tf.addFocusListener(new FocusListener(){
    @Override
    public void focusGained(FocusEvent e) {
        System.out.println("Focus gained: "+tf.getSize()+", "+tf.getLocation());
    }
 
    @Override
    public void focusLost(FocusEvent e) {
        System.out.println("Focus lost: "+tf.getSize()+", "+tf.getLocation());
    }
});
Вот этот код, добавленный в конструктор, покажет, что поле получает фокус и теряет его. Обратите также внимание на размер и положение компоненты.

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

P.S. С GroupLayout это демонстрируется так же просто, но я его очень не люблю.
0
эволюционирую потихоньку
 Аватар для TanT
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
20.01.2011, 15:14
Цитата Сообщение от Skipy Посмотреть сообщение
Итого мы имеем: поле есть в контейнере, но из-за отсутствия описателя менеджер раскладки не знает, куда его поместить и, соответственно, какие размеры ему дать.
хм, имхо вы недооцениваете менеджер. ему вполне достаточно данных по расположение компонент.
наполните чем-нить ваш "невидимый" элемент строка 21 вашего кода
Java
1
final JTextField tf = new JTextField("я тут");
и многое станет явным не взирая на установку параметров манагера, согласитесь от заполнения элемента данных о его координатах не прибавилось

выбранный вами манагер, да и любой другой имеют параметры по умолчанию, которых достаточно чтобы хотя бы как-то и куда-то что-то запихать.
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
20.01.2011, 16:01
Цитата Сообщение от TanT Посмотреть сообщение
согласитесь от заполнения элемента данных о его координатах не прибавилось
Прибавилось информации о предпочтительном размере, которая принимается во внимание GBL. Если мы всё вернем на круги своя, установив предпочтительный размер в 0х0 (а это именно предпочтительный размер, менеджер сам решает, какой размер компоненте выставить), то эффект будет наблюдаться, несмотря на содержимое.

Кроме того, это пример, написаный навскидку, за 5 минут. И с GBL. Если взять GroupLayout, то там такой эффект точно так же проявится. И даже заполнение поля не поможет. Вот, накидал в NetBeans:

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
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
 
/*
 * NewJFrame2.java
 *
 * Created on 20.01.2011, 15:54:14
 */
 
package ru.skipy.tests.ui;
 
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JTextField;
 
/**
 *
 * @author Eugene Matyushkin aka Skipy
 */
public class NewJFrame2 extends javax.swing.JFrame {
 
    /** Creates new form NewJFrame2 */
    public NewJFrame2() {
        initComponents();
        final JTextField tf = new JTextField("Some text");
        add(tf);
        pack();
        tf.addFocusListener(new FocusListener(){
            public void focusGained(FocusEvent e) {
                System.out.println("Focus gained: "+tf.getSize()+", "+tf.getLocation());
            }
 
            public void focusLost(FocusEvent e) {
                System.out.println("Focus lost: "+tf.getSize()+", "+tf.getLocation());
            }
        });
 
    }
 
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {
 
        jLabel1 = new javax.swing.JLabel();
        jTextField1 = new javax.swing.JTextField();
        jButton1 = new javax.swing.JButton();
 
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
 
        jLabel1.setText("jLabel1");
 
        jTextField1.setText("jTextField1");
 
        jButton1.setText("jButton1");
 
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(32, 32, 32)
                .addComponent(jLabel1)
                .addGap(48, 48, 48)
                .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(48, 48, 48)
                .addComponent(jButton1)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(46, 46, 46)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton1))
                .addContainerGap(23, Short.MAX_VALUE))
        );
 
        pack();
    }// </editor-fold>
 
    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame2().setVisible(true);
            }
        });
    }
 
    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JTextField jTextField1;
    // End of variables declaration
 
}
Компонента, как видите, содержит текст. В контейнере есть - события показываются. Но размеры и расположение - по нулям. Потому как ни в одну группу менеджера раскладки не входит.
0
эволюционирую потихоньку
 Аватар для TanT
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
20.01.2011, 18:17
Цитата Сообщение от Skipy Посмотреть сообщение
Компонента, как видите, содержит текст. В контейнере есть - события показываются. Но размеры и расположение - по нулям. Потому как ни в одну группу менеджера раскладки не входит.
кажется потерялась суть спора.

как?!! не понимаю, как менеджер позволит вам создать объект без необходимой информации или так подло кинуть с размерами.
у меня был вопрос как менеджер позволит вам создать (аналог: включить) объект без необходимой информации (тут я имел ввиду, что даже если не указать что и куда, то будут выставлены параметры по умолчанию).

как я вас понял: если включить компонент в менеджера, но не сказать какие размеры и положение, то он просто проигнорить компонент.
я же утверждал, что при включении компонента без параметров он получить положение с текущими настройками или по умолчанию, а размер начальный (для JTextField это коварно 0, для JCheckBox нет)
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
21.01.2011, 14:37
Суть спора, действительно, несколько ушла в сторону относительно изначального вопроса. Он было таким: добавили поле без описания ограничений. Что делать и кто виноват?

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

Я просто попытался описать, как такое может происходить. Что может - Вы видите сами. Пусть менеджер раскладки выставляет какие-то значения по умолчанию - мне лично это без разницы, ибо проблемы не решает - компонент не виден. И я утверждаю, что дело тут не в размерах, "коварно" установленных для компоненты, а в самом принципе. Для JCheckBox картина будет один в один, возьмите мой последний пример и замените на него добавляемый после initComponents JTextField, остальное можно оставить без изменений. Он точно так же будет расположен в точке 0,0 с размерами 0x0. И JButton будет вести себя так. И другие компоненты.
0
эволюционирую потихоньку
 Аватар для TanT
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
21.01.2011, 15:40
Цитата Сообщение от Skipy Посмотреть сообщение
. Ответ. Добавить с ограничениями, соответствующими используемому менеджеру раскладки.
установите ограничения для манагера null, ну естественно для того который по умолчанию есть скажем в JPanel
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.01.2011, 15:40
Помогаю со студенческими работами здесь

Динамичное добавление и удаление компонента
В слушателе мыши пытаюсь добавить компонент на JLayeredPane. Однако столкнулся с тем, что добавить могу, а вот удалить нет. ...

Программное удаление компонента label
Здравствуйте. У меня возникла проблема и не знаю как её решить. procedure TForm3.createlabel(offset: integer); //С помощью этой...

Программное изменение Name компонента Edit
Вообщем такое дело, надо сделать, чтобы при нажатии кнопки создавался компонент Edit1 и открывался диалог, где выбирается путь к файлу. При...

Программное установление значения компонента CheckBox
Скажите, можно-ли программно устанавливать значение компонента CheckBox? Если да, то как программно установить в нём галочку и снять? Хотя...

Программное создание компонента shape в Delphi 7
Написал процедуру создающую несколько shape на форме... Но ничего не происходит... Почему?( procedure TForm1.BitBtn5Click(Sender:...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru