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

Нарисовать рисунок инструментами Graphics и вывести на jPanel(c буферизацией)

18.11.2020, 13:39. Показов 2318. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Нужно нарисовать изображение при помощи инструментов java.awt.Graphics, и вывести на jPanel. При этом используя буферизацию
Java
1
2
3
4
5
6
7
8
9
10
    
public void sh()
    { 
      Image buf = jPanel1.createImage(jPanel1.getWidth(), jPanel1.getHeight());      
      Graphics canv = buf.getGraphics(); 
      canv.setColor(Color.red);
      canv.fillRect(0, 0, jPanel1.getWidth(), jPanel1.getHeight());
      Graphics g = jPanel1.getGraphics();
      g.drawImage(buf, 0, 0, this);//как использовать ImageObserver?
    }
Всё что пока удалось накопать.
Хотелось бы рисовать на image, а потом отображать в jPanel. Хоть код загрузился без ошибок, на jPanel ничего не выводится. Как отобразить это на Panel ума не приложу.
Подскажите пж.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.11.2020, 13:39
Ответы с готовыми решениями:

Как прикрепить к JPanel рисунок *.gif ?
Ne podskagite kak prikrepit k JPaneli risunok *.gif. Zarannee sposibo

JPanel, панели, фоновый рисунок и другие элементы
Всем привет! Перебрал много источников, похожих примеров, но не нашел как разобраться. Есть панель. На нее добавляем еще несколько,...

Рисунок вместо фона JFrame или JPanel
Я хотел картинку вместо фона для лаунчера -_- Вот что получилось сделать без ошибок. Результат - ни намека на картинку... голый серый...

4
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
18.11.2020, 15:18
JPanel это коробка, для элементов. Рисовать в нем можно но не практично, глупо, ресурсоемко, при работе с потоком дикие тормоза, баги перерисовки и еще букет всего.

Рисуют в BufferImage, потом эту картинку добавляют в JLabel который в свою очередь и можно добавить в JPanel. Не знаю как массы но я практически не юзаю JPanel в моем понимании задумка хорошая но потенциал мало где применим, конечно можно возразить про блоки кнопок и прочее, я просто делаю уникальную переменную на координаты и JPanel не нужен от слова совсем. Единственное его применение которые мне было полезным так это программная анимация.

Но если вы хотите в JPanel рисовать то можно так
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
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
 
 
 
public class Post
{
    public JLayeredPane swap;
    
    
    public Post()
    {
        make_Window();
        make_Element();
    }
    
    
    private void make_Window()
    {
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(800, 600));
        panel.setOpaque(false);
        
        JFrame win = new JFrame("Hello");
        swap = new JLayeredPane();
        swap = win.getLayeredPane();
        win.add(panel);
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        win.setResizable(false);
        win.getContentPane().setBackground(Color.WHITE);
        win.pack();
        win.setLayout(null);
        win.setLocationRelativeTo(null);
        win.setVisible(true);
    }
    
    
    private void make_Element()
    {
        JPanel jp = new JPanel()
        {
            private static final long serialVersionUID = 1L;
 
            protected void paintComponent(Graphics g)
            {
                super.paintComponent(g);
                g.setColor(new Color(233, 125, 19));
                g.fillRect(0, 0, 300, 300);
            }
        };
        jp.setBounds(0, 0, 300, 300);
        jp.setOpaque(true);
        jp.setLayout(null);
        swap.add(jp, new Integer(0), 0);
    }
    
    
    public static void main(String[] args)
    {
        new Post();
    }
}
В java есть один коварный момент, каждый объект забирает память, и при работе с графикой для блоков таблица будет в десятки раз по практичней чем JPanel так как 1000 кнопок вешает комп а таблица в 1000 кликабельных ячеек летает как ветер. И вообще делайте как вам удобно с лагами и без я же все делаю по своему
1
0 / 0 / 0
Регистрация: 19.07.2018
Сообщений: 82
18.11.2020, 18:40  [ТС]
Nidl,
Вы создаете свои классы jframe и jpanel. У меня они уже создались когда я переместил компоненты на jframe.
Т.е. получается надо удалить все с jframe и программно добавить туда jpanel, чтобы можно было наконец передать в jpanel image и graphics?
0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
18.11.2020, 22:17
sayer, Просто мне так удобно, я таким образом код превращаю в лестницу и это мне позволяет легко ориентироваться в коде от 10 тысяч строк. Как вам удобно известно только вам Ничего вам удалять не надо, в JPanel нельзя добавить картинку но используя внутренний класс в нем можно рисовать используя графику, но как я предупредил выше, если это мелкая поделка то пусть так и будет, если это большой проект то лучше рисованием в внутрених классах не заниматься, если ваш объект будет иметь отношение к потоку то при наличии графики в внутреннем классе будут не только обновляться его позиция но и он будет перерисовываться а это иногда дикие тормоза.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        JPanel jp = new JPanel()
        {
            private static final long serialVersionUID = 1L;
 
            protected void paintComponent(Graphics g)
            {
                super.paintComponent(g);
                g.setColor(new Color(233, 125, 19));
                g.fillRect(0, 0, 300, 300);
            }
        };
        jp.setBounds(0, 0, 300, 300);
        jp.setOpaque(true);
        jp.setLayout(null);
Лучше сделать все отдельно, нарисовать все что вам нужно в битмап, потом битмап добавить в JLabel а его потом отдать JPanel и будет вам картинка. Об этом тоже выше написал
1
0 / 0 / 0
Регистрация: 19.07.2018
Сообщений: 82
19.11.2020, 15:24  [ТС]
Nidl, Благодарю за сведения, но мне однако все таки нужно сделать на jPanel.
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
public class NewJFrame extends javax.swing.JFrame {
    public NewJFrame() {
    initComponents(); 
    set();   
    }        
 
// ***
  private void initComponents() {
 
        jPanel1 = new javax.swing.JPanel();
        jSlider1 = new javax.swing.JSlider();
        jButton1 = new javax.swing.JButton();
        jCheckBox1 = new javax.swing.JCheckBox();
 
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
 
        jPanel1.setBackground(new java.awt.Color(255, 255, 255));
        jPanel1.setToolTipText("");
 
        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 238, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 177, Short.MAX_VALUE)
        );
 
        jButton1.setText("jButton1");
 
        jCheckBox1.setText("jCheckBox1");
        jCheckBox1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jCheckBox1ActionPerformed(evt);
            }
        });
 
        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(153, 153, 153)
                        .addComponent(jSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(86, 86, 86)
                        .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(134, 134, 134)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jButton1)
                            .addComponent(jCheckBox1))))
                .addContainerGap(68, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(41, 41, 41)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jButton1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jCheckBox1)))
                .addGap(53, 53, 53)
                .addComponent(jSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(135, Short.MAX_VALUE))
        );
 
        pack();
    }// </editor-fold>                   
 
    public void set(){        
    JPanel panel = new JPanel();
    Dimension dim = new Dimension(jPanel1.getWidth(),jPanel1.getHeight());
    panel.setPreferredSize(dim);
    panel.setBackground(Color.red);    
    super.add(panel);
    } 
 
    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JCheckBox jCheckBox1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JSlider jSlider1;
    // End of variables declaration      
 
}
Я создаю новую панель(или думаю что создаю, но на самом деле не до конца). Однако не понимаю как мне вывести её на NewFrame? Все что отображается на ней (jCheckbox, jbutton) определяется в initComponents(); вносить правки в неё я не могу, соотв-но не могу и свою созданную панельку добавить. Можно ли как то её добавить по другому или все же нужно создавать самому и всё панели и фреймы прописывать вручную?

Добавлено через 4 часа 59 минут
У меня NetBeans 8.2.Приложение Java(проект с формой).
Если это что то даст.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.11.2020, 15:24
Помогаю со студенческими работами здесь

Рисунок Graphics используя WinBGI
Подскажите, пожалуйста, как из вот этого вот: #include &lt;graphics.h&gt; #include &lt;math.h&gt; #include &lt;stdlib.h&gt; ...

Graphics, как сохранить рисунок на диск
не могу взять и передать graphics из panel в какой либо метод из за этого //сохранить картинку public void...

Попытка сделать рисунок используя graphics.h
Здравствуйте! Почему не компилируется этот код? #include &lt;graphics.h&gt; int main( ) { initwindow(400, 300,...

System::Drawing::Graphics не создаёт рисунок
Проблемный код: void initializeGFields(){ Graphics ^ gFieldSelf; //Объявление объектов динамической Graphics ^...

Как нарисовать градиент на JPanel
Доброго времени суток!!! Хочется сделать все красиво, но опыта пока еще не много, а сделать хочется. Помогите. Как на JPanel...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита табличной части. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru