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

Repaint в Java

01.09.2020, 19:29. Показов 897. Ответов 9

Студворк — интернет-сервис помощи студентам
Здравствуйте, возникла следующая проблема.
Есть класс SimpleGui

Java
1
2
3
4
5
6
7
public class SimpleGui  {
    public static void main(String[] args) {
 
        SimpleGui gui = new SimpleGui();
        gui.go();
 
    }

Метод go делает следующие вещи:


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public void go() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
 
        buttonChangeColor = new JButton("Change colors");
        buttonChangeColor.addActionListener(new ColorListener());
 
        buttonChangeLabel = new JButton("Change label");
        buttonChangeLabel.addActionListener(new LabelListener());
 
        label = new JLabel("It's a label");
        panel = new MyDrawPanel();
 
        frame.getContentPane().add(BorderLayout.SOUTH, buttonChangeColor);
        frame.getContentPane().add(BorderLayout.CENTER, panel);
        frame.getContentPane().add(BorderLayout.EAST, buttonChangeLabel);
        frame.getContentPane().add(BorderLayout.WEST, label);
 
        frame.setSize(1980, 1020);
        frame.setVisible(true);
 
    }

У класса SimpleGui есть 3и внутренних класса


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
class LabelListener implements ActionListener{
        public void actionPerformed(ActionEvent event) {
            mini.play(4,100);
            if (label.getText().equals("It's a label")) {
                label.setText("Happy");
            } else {
                label.setText("It's a label");
            }
        }
 
    }
 
    class ColorListener implements ActionListener{
        public void actionPerformed(ActionEvent event) {
            mini.play(10,100);
                panel.moveFigures();
        }
    }
    public class MyDrawPanel extends JPanel {
        public void paintComponent(Graphics g) {
 
 
                g.setColor(Color.WHITE);
                g.fillRect(0, 0, this.getWidth(), getHeight());
 
 
                Graphics2D g2d = (Graphics2D) g;
                int red = (int) (Math.random() * 255);
                int green = (int) (Math.random() * 255);
                int blue = (int) (Math.random() * 255);
                Color startColor = new Color(red, green, blue);
 
                red = (int) (Math.random() * 255);
                green = (int) (Math.random() * 255);
                blue = (int) (Math.random() * 255);
                Color endColor = new Color(red, green, blue);
 
                GradientPaint gradient = new GradientPaint(700, 300, startColor, 900, y, endColor);
                g2d.setPaint(gradient);
                g2d.fillOval(700, y, 100, 100);
 
 
 
                g.fillRect(900, y, 100, 100);
 
                g.fillOval(1100, y, 100, 100);
 
 
        }
Класс MyDrawPanel содержит вот такой метод, который присутствует в вызове ColorListener


Java
1
2
3
4
5
6
7
8
9
10
11
     public void moveFigures() {
            while (y<800){
            y++;
            panel.repaint();
            try {
                TimeUnit.MILLISECONDS.sleep(5);
                           } catch (Exception exception) {
                exception.printStackTrace();
            }
        }
    }

Цель - создать анимацию, с перемещением фигур из исходного положения. Это получается сделать, если совсем не использовать метод moveFigures(). А код этого метода просто вставить в конец метода go. Но тогда анимация начинается при запуске программы. А хочется, чтобы это происходило после нажатия на кнопку. Если в методе moveFigures() убрать цикл, то после нажатия на кнопку происходит смещение фигур на 1 пиксель (ни о какой анимации речи нет, потому что 200 раз кликать на клавишу еще то удовольствие). Но как только появляется цикл, причем неважно for/while, то происходит следующее: программа ненадолго зависает, а потом рисует фигуры в конечной точке, пропуская всю анимацию движения. Может кто-нибудь может помочь?)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.09.2020, 19:29
Ответы с готовыми решениями:

Repaint() не выполяется
Задача генерировать изображение на BufferedImage и во время генерации отрисовывать его на JPanel. Отрисовка картинки выполняется в...

Jframe repaint
Что делают эти методы ?:declare: this.invalidate(); this.revalidate(); this.repaint(); this.validate();

Непонятки с Repaint()
доброго времени суток, форумчане! в Unit2 прописан код. он компилируется(подозрительно быстро). никаких ошибок и опасений не выдаётся....

9
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
02.09.2020, 08:14
То есть столько букв ради того что бы сдвинуть фигуру ? Да и все в корне неправильно делаете, взять туже вставленную графику в JLabel, запомните никогда не суйте графику в компоненты если они участники потока, почему спросите вы, при таком раскладе вы теряете до 20% производительности потока так надо и компонент таскать и постоянно его перерисовывать. Держите всю графику в bitmap. Ну и по вашему коду просто мое замечание зачем его так дико дробить на классы он что быстрее станет или удобней от того что вы его кусками расписываете ? В чем смысл ваших классов если они не универсальны и ваш код просто распилен на бобышки.

Ну а по поводу движения, посмотрите к примеру вот это (ваш код ковырять не буду простите, такое дробление мне чуждо, например как я пишу классы - движок игры одно полотно, класс диалоги, класс музыка. А пилить код на куски нет уж извольте):
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
 
 
 
public class Snow 
{
    public JLayeredPane swap;
    public JLabel[] snowflake = new JLabel[36];
    public double[][] snowflakeBase = new double[snowflake.length][6];
    
    
    public Snow()
    {
        make_Window();
        make_Snow();
        make_Spruce();
        make_Congratulations();
        
        new WorkerThread();
    }
    
    
    private void make_Window()
    {
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(800, 600));
        panel.setOpaque(false);
        
        JFrame win = new JFrame("Snow");
        swap = new JLayeredPane();
        swap = win.getLayeredPane();
        win.add(panel);
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        win.setResizable(false);
        win.getContentPane().setBackground(Color.BLACK);
        win.pack();
        win.setLayout(null);
        win.setLocationRelativeTo(null);
        win.setVisible(true);
    }
    
    
    private void make_Spruce()
    {
        int[] arrX = 
        {
            50,40,45,35,40,30,35,25,30,20,25,15,20,10,15,5,10,0,
            100,90,95,85,90,80,85,75,80,70,75,65,70,60,65,55,60,50
        };
        int[] arrY = 
        {
            0,10,15,25,30,40,45,55,60,70,75,85,90,100,105,115,120,130,
            130,120,115,105,100,90,85,75,70,60,55,45,40,30,25,15,10,0
        };
        
        BufferedImage bf = new BufferedImage(200, 260, BufferedImage.TYPE_INT_ARGB);
        Graphics g = bf.createGraphics();
        ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        ((Graphics2D) g).scale(2.0, 2.0);
        g.setColor(new Color(50,200,30));
        g.fillPolygon(arrX, arrY, arrX.length);
        g.dispose();
        bf.flush();
        
        JLabel spruce = new JLabel();
        spruce.setBounds(420, 340, 200, 260);
        spruce.setLayout(null);
        spruce.setOpaque(false);
        spruce.setIcon(new ImageIcon(bf));
        spruce.setVisible(true);
        swap.add(spruce, new Integer(1), 0);
    }
    
    
    private void make_Congratulations()
    {
        JLabel congratulations = new JLabel("С Наступающим");
        congratulations.setBounds(190, 100, 420, 50);
        congratulations.setLayout(null);
        congratulations.setForeground(Color.WHITE);
        congratulations.setFont(new Font("Arial", Font.BOLD, 50));
        congratulations.setOpaque(false);
        congratulations.setVisible(true);
        swap.add(congratulations, new Integer(2), 0);
    }
    
    
    private void make_Snow()
    {
        int s;
        
        for (int i = 0; i < snowflake.length; i++)
        {
            s = new Random().nextInt(6) + 2;
            BufferedImage bf = new BufferedImage(s*2, s*2, BufferedImage.TYPE_INT_ARGB);
            Graphics g = bf.createGraphics();
            ((Graphics2D) g).setStroke(new BasicStroke((float) s, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
            ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g.setColor(new Color(255, 255, 255, 30*s));
            g.drawLine(s, s, s, s);
            g.drawImage(bf, 0, 0, null);
            g.dispose();
            bf.flush();
            
            snowflake[i] = new JLabel();
            snowflake[i].setBounds(new Random().nextInt(600)+100,
                    new Random().nextInt(400)+100, s*2, s*2);
            snowflake[i].setLayout(null);
            snowflake[i].setOpaque(false);
            snowflake[i].setIcon(new ImageIcon(bf));
            snowflake[i].setVisible(true);
            swap.add(snowflake[i], new Integer(0), 0);
            
            snowflakeBase[i][0] = snowflake[i].getX();
            snowflakeBase[i][1] = snowflake[i].getY();
            snowflakeBase[i][2] = 0;
            snowflakeBase[i][3] = new Random().nextInt(10) + 2;
            snowflakeBase[i][4] = s/2;
            snowflakeBase[i][5] = 1;
        }
    }
    
    
    class WorkerThread extends Thread
    {
        int fps = 15;
 
        
        public WorkerThread()
        {
            setDaemon(true); 
            start();
        }
        
 
        public void run()
        {
            while (true)
            {
                for (int i = 0; i < snowflake.length; i++)
                {
                    if (snowflakeBase[i][1] < 600)
                    {
                        snowflakeBase[i][2] += snowflakeBase[i][4]/100;
                        snowflakeBase[i][1] += snowflakeBase[i][4];
                        snowflakeBase[i][0] = snowflakeBase[i][0] + (Math.sin(snowflakeBase[i][3] + snowflakeBase[i][2]));
                        snowflake[i].setLocation((int)snowflakeBase[i][0], (int)snowflakeBase[i][1]);
                    }
                    else
                    {
                        snowflakeBase[i][2] = 0;
                        snowflakeBase[i][1] = -10;
                        snowflakeBase[i][0] = ThreadLocalRandom.current().nextInt(600) + 100;
                    }
                }
 
                try
                {
                    sleep(fps);
                }
                catch (InterruptedException e)
                {
                    //...
                }
            }
        }
    }
    
    
    public static void main(String[] args)
    {
        new Snow();
    }
}
0
0 / 0 / 0
Регистрация: 01.09.2020
Сообщений: 5
02.09.2020, 11:41  [ТС]
Да, все верно, мне потребовалось именно столько "букв", чтобы описать свою проблему. К сожалению ответ на нее я не услышал. Спасибо за совет с графикой, он действительно может пригодиться. Такое количество классов обусловлено тем, что у меня 2е кнопки, для которых реализован свой Listener. Как вы предлагаете его реализовать в одном классе, я , простите не понимаю. К тому же ваш код не содержит ни одной кнопки, не говоря уже о действиях после нажатия на нее. Если вы внимательно прочтете мой вопрос, то увидите, что проблема не в том, чтобы просто сделать анимацию при запуске. Проблема в том, чтобы это работало, после нажатия на клавишу.

Добавлено через 40 минут
Повторюсь, если метод moveFigures() вынести в метод go(). При запуске программы сработает анимация. Все будет так, как нужно. Если же метод moveFigures() вызывать после нажатия на кнопу, то он будет отрабатывать, будут выводы на консоль и звук, но самой анимации не будет. Программа словно зависнет, (на самом деле она просто будет идти по циклу), а потом покажет изображение в конечной точке. Мне не ясно почему так? И как это исправить?
0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
02.09.2020, 11:57
white_, Опишите вашу задачу (без вашего кода), а именно что вы хотите получить - 2 кнопки что они должны делать ? что (треугольник, квадрат, круг, спрайт) куда двигаем.

В ваш код не хочется лезть хотя бы потому что вы таймер загнали в цикл что просто дикость.
0
0 / 0 / 0
Регистрация: 01.09.2020
Сообщений: 5
02.09.2020, 13:42  [ТС]
Если упростить и оставить интересующие моменты, то вот: cоздаем несколько фигур (1/2/3 - неважно). Закрашиваем. Создаем 2е кнопки (вторая потребуется позже, но пока она ничего не должна делать). Фигуры движутся вниз экрана, меняя свой цвет, после нажатия на 1ую кнопку. P.S. я очень извиняюсь, но не могли бы вы объяснить почему нельзя ставить таймер в цикле. Просто в вашем коде происходит именно это, причем еще и в бесконечном цикле. (В цикле while(true))

Добавлено через 1 час 33 минуты
Если это будет кому-то интересно,то вот здесь описана моя проблема и ее решение.
https://coderoad.ru/23244522/J... о-один-раз
Большое спасибо, за уделенное время.
0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
02.09.2020, 13:44
white_, у меня не бесконечный цикл а поток-демон, у вас цикл внутри которого таймер который создается заданное количество раз в цикле без его завершения. Иными словами вы создаете новый таймер с каждым движением

Цитата Сообщение от white_ Посмотреть сообщение
Если это будет кому-то интересно,то вот здесь описана моя проблема и ее решение.
https://coderoad.ru/23244522/J... о-один-раз
что за глупость Оо. repaint перерисовает компонент но если его загнать в поток или таймер то во многих случаях repaint и не нужен, все и без него будет рисоваться обновляться.
0
0 / 0 / 0
Регистрация: 01.09.2020
Сообщений: 5
02.09.2020, 14:27  [ТС]
Здесь важно вот это:
"Метод repaint не перекрашивает сразу, вместо этого он отмечает панель, которую нужно перекрасить как можно скорее (но не прямо сейчас).

Swing не использует потоки, так что только вещь может работать одновременно. Есть много задач, которые Swing выполняет за кулисами, между вызовами ваших слушателей, и одна из этих задач-перекраска windows, которую нужно перекрасить. Swing не будет перерисовывать окно во время работы вашего прослушивателя.
Кроме того, даже если repaint перекрасится немедленно, анимация произойдет слишком быстро, чтобы кто-то заметил."


А я пытался сделать именно так - вызвать repaint() в цикле. Очень странно, что без нажатия на кнопку это получалось.


Сейчас я делаю так:
Java
1
2
3
4
5
6
 public void moveFiguresDown() {
            if (y<800) {
                timer.restart();
                y++;
            }
        }

Java
1
2
3
4
5
6
class ColorListener implements ActionListener{
        public void actionPerformed(ActionEvent event) {
                panel.moveFiguresDown();
                panel.repaint();
        }
    }

И программа работает так, как я хотел. На счет таймера, который создавался на каждом шаге цикла, то это действительно
было глупо. (Надеюсь сейчас timer.restart() работает верно. Если нет, напишите пожалуйста). Поток -демон для меня пока нечто неизвестное, думаю, будет следующей темой с которой я начну разбираться. Если у вас есть еще замечания, с удовольствием их выслушаю. P.S. Спасибо за терпение.

Добавлено через 15 минут
Java
1
2
3
4
5
6
7
8
9
10
11
    public void moveFiguresDown() {
           // stopMusic = true;
            if (y<400) {
                timer.start();
                y++;
 
            } else {
            timer.stop();
            //    stopMusic = false;
            }
        }
Даже скорее так (Потому что иначе смещение остановится, а вот цвет будет меняться бесконечно)
0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
02.09.2020, 15:09
как вижу решение вашей задачи я, судя по вашему описанию (или вы хотите последовательно цвет менять ?)

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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
 
 
 
public class Runs
{
    public JLayeredPane swap;
    public JLabel[] jl;
    public JButton bt;
    public BufferedImage[] bf;
    public int[] y;
    public boolean flag = false;
    
    
    public Runs()
    {
        makeWindow();
        makeElement();
        new WorkerThread();
    }
    
    
    private void makeWindow()
    {
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(800, 600));
        panel.setOpaque(false);
        
        JFrame win = new JFrame("Runs");
        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 makeElement()
    {
        y = new int[]{0,0,0};
        jl = new JLabel[3];
        bf = new BufferedImage[3];
        int[][] arrColor = {{255,0,0}, {0,255,0}, {0,0,255}};
        
        for (int i = 0; i < 3; i++)
        {
            bf[i] = new BufferedImage(30, 90, BufferedImage.TYPE_INT_ARGB);
            Graphics g = bf[i].createGraphics();
            Graphics2D g2 = (Graphics2D)g;
            g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                    RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g2.setRenderingHint(RenderingHints.KEY_RENDERING,
                    RenderingHints.VALUE_RENDER_QUALITY);
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
                    RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
            
            switch(i)
            {
                case 0:
                    for (int a = 0; a < 3; a++)
                    {
                        g2.setColor(new Color(arrColor[a][0],arrColor[a][1],arrColor[a][2]));
                        g2.fillOval(0,a*30,30,30);
                    }
                break;
                case 1:
                    for (int a = 0; a < 3; a++)
                    {
                        g2.setColor(new Color(arrColor[a][0],arrColor[a][1],arrColor[a][2]));
                        g2.fillRect(0,a*30,30,30);
                    }
                break;
                case 2:
                    for (int a = 0; a < 3; a++)
                    {
                        g2.setColor(new Color(arrColor[a][0],arrColor[a][1],arrColor[a][2]));
                        g2.fill(new Polygon(new int[] {15, 30, 0}, new int[] {0+a*30, 30+a*30, 30+a*30}, 3));
                    }
                break;
            }
            g2.dispose();
            bf[i].flush();
            
            jl[i] = new JLabel();
            jl[i].setBounds(150+i*100, y[i], 30, 30);
            jl[i].setLayout(null);
            jl[i].setOpaque(false);
            jl[i].setIcon(new ImageIcon(bf[i].getSubimage(0, 0, 30, 30)));
            jl[i].setVisible(true);
            swap.add(jl[i], new Integer(0), i);
        }
        
        bt = new JButton();
        bt.setBounds(0,0,90,30);
        bt.setText("Поехали");
        bt.setOpaque(true);
        bt.setContentAreaFilled(true);
        bt.setBorderPainted(true);
        bt.setFocusPainted(true);
        bt.setLayout(null);
        bt.setFocusable(false);
        bt.setVisible(true);
        bt.addActionListener(new ActionListener()
        {   
            int i = -1;
            public void actionPerformed(ActionEvent e)
            {
                i *= -1;
                if (i == 1)
                {
                    flag = true;
                    ((JButton) e.getSource()).setForeground(Color.WHITE);
                }
                else
                {
                    flag = false;
                    ((JButton) e.getSource()).setForeground(Color.BLACK);
                }
            }
        });
        swap.add(bt, new Integer(0), 10);
    }
    
 
    class WorkerThread extends Thread
    {
        int fps = 15;
 
        
        public WorkerThread()
        {
            setDaemon(true); 
            start();
        }
 
        public void run()
        {
            while (true)
            {
                if (flag)
                {
                    for (int i = 0; i < 3; i++)
                    {
                        if (y[i] < 570)y[i]++;
                        switch(y[i])
                        {
                            case 150:
                                jl[i].setIcon(new ImageIcon(bf[i].getSubimage(0, 30, 30, 30)));
                            break;
                            case 300:
                                jl[i].setIcon(new ImageIcon(bf[i].getSubimage(0, 60, 30, 30)));
                            break;
                        }
                        jl[i].setLocation(jl[i].getX(), y[i]);
                    }
                }
                
                try
                {
                    sleep(fps);
                }
                catch (InterruptedException e)
                {
                    //...
                }
            }
        }
    }
    
    
    public static void main(String[] args)
    {
        new Runs();
    }
}
white_, мой опыт свинга не такой хороший как хотелось бы но его достаточно что бы на нем писать полноценные 2D платформеры и RPG, свинг очень мощный инструмент, главное в нем аккуратность.
Миниатюры
Repaint в Java  
Изображения
 
0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
02.09.2020, 15:18
white_, и заметьте, в коде нет ни одного repaint(); XD
поток можно и таймером заменить, хватит одна штука на все
0
0 / 0 / 0
Регистрация: 01.09.2020
Сообщений: 5
02.09.2020, 17:00  [ТС]
Огромное вам спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.09.2020, 17:00
Помогаю со студенческими работами здесь

Медленная функция repaint()
Здравствуйте! Я пытаюсь написать арканоид по урокам из youtube. При запуске компилятором приложения картинка обновляется очень медленно,...

Repaint не вызывает paintEvet
Доброго всем дня. Возникла некоторая проблема при работе с QPainter. Будьте милостливы,помогите дебилу,пожалуйста. Вобщем проблема уже...

Метод repaint() не выполняется
Помогите, пожалуйста... Просто замучился уже с графикой.:( Суть вот в чем: есть метод paintComponent(Graphics g) (пробовал заменить на...

Не работает repaint с задержкой
У меня есть персонаж, которому я хочу сделать функцию прыжка. Во втором потоке, я создал такой вот код: public void run() { if...

Перерисовка JFrame. Не работает repaint();
Приветствую, уважаемые. У меня такая беда: работаю в JBuilder 2006, там используется JDK: java version 1.5.0_03-b07 Написал мелкий...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru