Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
17 / 22 / 6
Регистрация: 16.10.2013
Сообщений: 316
1

Почему при изменении окна каждый раз создается новый обьект?

04.11.2013, 18:21. Показов 1672. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
сам код:
Кликните здесь для просмотра всего текста
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
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
public class SimpleGui3c implements ActionListener {
    JFrame f;
    public static void main(String[] args) {
        SimpleGui3c gui = new SimpleGui3c();
        gui.go();
    }
    private void go() {
        f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        Button btn = new Button("Change color");
        btn.addActionListener(this);
 
        MyDrawPanel drawpanel = new MyDrawPanel();
 
        f.getContentPane().add(BorderLayout.SOUTH, btn);
        f.getContentPane().add(BorderLayout.CENTER, drawpanel);
        f.setSize(300, 300);
        f.setVisible(true);
 
    }
    public void actionPerformed(ActionEvent e) {
        f.repaint();
    }
}
 
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
 
public class MyDrawPanel extends JPanel {
    public MyDrawPanel() {
    }
 
    public void paintComponent(Graphics g) {
        int x = (int) (Math.random() * 250);
        int y = (int) (Math.random() * 250);
        
        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);
 
        g.setColor(startColor);
        g.fillOval(x, y, 50, 50);
        
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.11.2013, 18:21
Ответы с готовыми решениями:

При нажатии на Button каждый раз создается новый компонент (button/label/textbox)
Как реализовать?

Целесообразность применения LOCK TABLES каждый раз при изменении таблицы
В названии темы собственно и поместилась суть вопроса. Помогите разобраться пожалуйста. Узнал о...

Как заставить выполнятся модуль VBA каждый раз при изменении графика?
Подскажите пожалуйста каким образом можна заставить выполнятся модуль VBA каждый раз при изменении...

Почему при изменении размера окна не меняется цвет заполнения?
Почему при изменении размера окна не меняется цвет заполнения?:no: ... case WM_PAINT:...

10
Заблокирован
04.11.2013, 18:47 2
какой объект?
0
6 / 6 / 1
Регистрация: 15.09.2013
Сообщений: 149
04.11.2013, 18:51 3
Тоже самая проблема и у меня была с кодом)))

А вообще мне кажется,когда ты меняешь размер фрейма вызывается
Java
1
f.repaint();
Который перерисовывает каждый раз кружочек.

Добавлено через 1 минуту
Цитата Сообщение от verylazy Посмотреть сообщение
какой объект?
Если быстро менять размер появляется много кружков)) Это нормально.В итоге то один
0
17 / 22 / 6
Регистрация: 16.10.2013
Сообщений: 316
04.11.2013, 21:02  [ТС] 4
Цитата Сообщение от verylazy Посмотреть сообщение
какой объект?
SimpleGui3c gui = new SimpleGui3c();
0
63 / 63 / 12
Регистрация: 29.08.2012
Сообщений: 152
04.11.2013, 22:14 5
Как уже сказали выше, что при изменении размера фрейма вызывается метод repaint(), который вызовет все необходимые методы для новой отрисовки(поправьте, если не так) и ваш переопределенный paintComponent() тоже. Т.к. координаты и цвет овала находятся в этом методе, то соответственно, если он будет вызываться несколько раз, то при каждом вызове координаты будут меняться.
Одно из решений может быть в создании класса Oval, которому зададутся все необходимые параметры один раз - при инициализации. А при необходимости их поменять с помощью метода, например, randomize(), который задаст новые координаты.
1
17 / 22 / 6
Регистрация: 16.10.2013
Сообщений: 316
05.11.2013, 00:08  [ТС] 6
Цитата Сообщение от Lancaster Посмотреть сообщение
Как уже сказали выше, что при изменении размера фрейма вызывается метод repaint(), который вызовет все необходимые методы для новой отрисовки(поправьте, если не так) и ваш переопределенный paintComponent() тоже. Т.к. координаты и цвет овала находятся в этом методе, то соответственно, если он будет вызываться несколько раз, то при каждом вызове координаты будут меняться.
Одно из решений может быть в создании класса Oval, которому зададутся все необходимые параметры один раз - при инициализации. А при необходимости их поменять с помощью метода, например, randomize(), который задаст новые координаты.
скажите, так правильно будет?
Кликните здесь для просмотра всего текста
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.BorderLayout;
import java.awt.Button;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
 
public class SimpleGui3c implements ActionListener {
    JFrame f;
    MyDrawPanel drawpanel;
 
    public static void main(String[] args) {
        SimpleGui3c gui = new SimpleGui3c();
        gui.go();
    }
 
    private void go() {
        f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        Button btn = new Button("Change color");
        btn.addActionListener(this);
 
        drawpanel = new MyDrawPanel();
        drawpanel.setcolor();
 
        f.getContentPane().add(BorderLayout.SOUTH, btn);
        f.getContentPane().add(BorderLayout.CENTER, drawpanel);
        f.setSize(300, 300);
        f.setVisible(true);
 
    }
 
    public void actionPerformed(ActionEvent e) {
        drawpanel.setcolor();
        f.repaint();
    }
}
 
import java.awt.Color;
import java.awt.Graphics;
 
import javax.swing.JPanel;
 
public class MyDrawPanel extends JPanel {
    Color startColor;
    int x, y, red, green, blue;
 
    public void setcolor() {
        red = (int) (Math.random() * 255);
        green = (int) (Math.random() * 255);
        blue = (int) (Math.random() * 255);
        startColor = new Color(red, green, blue);
    }
 
    public MyDrawPanel() {
        x = (int) (Math.random() * 250);
        y = (int) (Math.random() * 250);
    }
 
    public void paintComponent(Graphics g) {
 
        g.setColor(startColor);
        g.fillOval(x, y, 50, 50);
 
    }
}


фигура стоит на месте, получает цвет и при нажатии меняет. Запутался как с цветом быть и создал метод. Но где именно его вызывать? Я два раза его в коде вставил
0
92 / 92 / 18
Регистрация: 06.01.2012
Сообщений: 394
05.11.2013, 00:14 7
А кто нибудь подскажет как от этого избавится?
0
63 / 63 / 12
Регистрация: 29.08.2012
Сообщений: 152
05.11.2013, 00:20 8
Запутался как с цветом быть и создал метод. Но где именно его вызывать? Я два раза его в коде вставил
Вызывайте там, где его нужно вызвать - а именно, когда необходимо изменить цвет овала.
1-й раз вы его вызываете после создания объекта MyDrawPanel, хотя можно это сделать во время его создания (вызов метода поместить в конструктор).
В другие разы метод вызывается по листенеру.
1
17 / 22 / 6
Регистрация: 16.10.2013
Сообщений: 316
05.11.2013, 00:37  [ТС] 9
Цитата Сообщение от Lancaster Посмотреть сообщение
Вызывайте там, где его нужно вызвать - а именно, когда необходимо изменить цвет овала.
1-й раз вы его вызываете после создания объекта MyDrawPanel, хотя можно это сделать во время его создания (вызов метода поместить в конструктор).
В другие разы метод вызывается по листенеру.
Спасибо! Все заработало. Снова туплю на мелочах.

Добавлено через 1 минуту
Цитата Сообщение от RequiemMass Посмотреть сообщение
А кто нибудь подскажет как от этого избавится?
от чего избавиться? В своем рандоматоре сделайте как сказал Lancaster и все будет как вы хотели. Лично у меня фигура стоит и при изменении окна. При нажатии кнопки меняет цвет.

Добавлено через 6 минут
Цитата Сообщение от Lancaster Посмотреть сообщение
Вызывайте там, где его нужно вызвать - а именно, когда необходимо изменить цвет овала.
1-й раз вы его вызываете после создания объекта MyDrawPanel, хотя можно это сделать во время его создания (вызов метода поместить в конструктор).
В другие разы метод вызывается по листенеру.
теперь проблемка - как создать несколько обьектов?
0
92 / 92 / 18
Регистрация: 06.01.2012
Сообщений: 394
05.11.2013, 00:52 10
warrax, я имею ввиду избавится от мерцания круга, если он 1. Но походу никак, кроме setResizeble(false);
0
63 / 63 / 12
Регистрация: 29.08.2012
Сообщений: 152
05.11.2013, 00:52 11
Цитата Сообщение от warrax Посмотреть сообщение
теперь проблемка - как создать несколько обьектов?
Цитата Сообщение от Lancaster Посмотреть сообщение
Одно из решений может быть в создании класса Oval, которому зададутся все необходимые параметры один раз - при инициализации. А при необходимости их поменять с помощью метода, например, randomize(), который задаст новые координаты.
Как вариант, можно реализовать это так...
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
public class SimpleGui3c {
 
    private JFrame frame;
 
    public static void main(String[] args) {
        SimpleGui3c gui = new SimpleGui3c();
        gui.go();
    }
 
    private void go() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        final MyDrawPanel drawpanel = new MyDrawPanel();
 
        Button btnColor = new Button("Change color");
        btnColor.addActionListener(new ActionListener() {
 
            @Override
            public void actionPerformed(ActionEvent ae) {
                drawpanel.changeColor();
            }
        });
 
        Button btnPosition = new Button("Change position");
        btnPosition.addActionListener(new ActionListener() {
 
            @Override
            public void actionPerformed(ActionEvent ae) {
                drawpanel.changePosition();
            }
        });
 
        JPanel pnlTool = new JPanel(new GridLayout(1, 2));
        pnlTool.add(btnColor);
        pnlTool.add(btnPosition);
 
        frame.getContentPane().add(BorderLayout.SOUTH, pnlTool);
        frame.getContentPane().add(BorderLayout.CENTER, drawpanel);
        frame.setSize(300, 300);
        frame.setVisible(true);
    }
}
 
class MyDrawPanel extends JPanel {
 
    private List<Oval> ovals;
 
    public MyDrawPanel() {
 
        ovals = getRandomOvals();
    }
 
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
 
        drawOvals(g);
    }
 
    private void drawOvals(Graphics g) {
        for (Oval oval : ovals) {
            g.setColor(oval.getColor());
            g.fillOval(oval.getX(), oval.getY(), oval.getWidth(), oval.getHeight());
        }
    }
 
    public void changePosition() {
        for (Oval oval : ovals) {
            oval.randomPosition();
        }
        this.repaint();
    }
 
    public void changeColor() {
        for (Oval oval : ovals) {
            oval.randomColor();
        }
        this.repaint();
    }
 
    private List<Oval> getRandomOvals() {
        List<Oval> arrOvals = new ArrayList<>();
 
        for (int i = 0; i < 10; i++) {
            Oval oval = new Oval();
            oval.randomize();
 
            arrOvals.add(oval);
        }
 
        return arrOvals;
    }
}
 
class Oval {
 
    private final int width = 50;
    private final int height = 50;
    private int x;
    private int y;
    private Color color;
 
    public Oval(int x, int y, Color c) {
        this.x = x;
        this.y = y;
        this.color = c;
    }
 
    public Oval() {
    }
 
    public void randomize() {
        randomPosition();
        randomColor();
    }
 
    public void randomPosition() {
        x = (int) (Math.random() * 250);
        y = (int) (Math.random() * 250);
    }
 
    public void randomColor() {
        Random rand = new Random();
        color = new Color(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255));
    }
 
    public int getX() {
        return x;
    }
 
    public void setX(int x) {
        this.x = x;
    }
 
    public int getY() {
        return y;
    }
 
    public void setY(int y) {
        this.y = y;
    }
 
    public Color getColor() {
        return color;
    }
 
    public void setColor(Color color) {
        this.color = color;
    }
 
    public int getWidth() {
        return width;
    }
 
    public int getHeight() {
        return height;
    }
}
0
05.11.2013, 00:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.11.2013, 00:52
Помогаю со студенческими работами здесь

Ошибка при заполнении - добавляет каждый раз в новый столбец
Доброго всем времени суток! Имеется отредактированный чужой код - нужно чтобы соединялись 2 файла и...

Каждый раз в бд создается новая строчка
проблема такая, при авторизации пользователя через Ulogin //$user - уникальная строка...

Каждый раз новая таблица на каждый новый день
Есть &quot;таблица&quot;, я вношу в неё данные, сохраняю, закрываю. На следующий день, допустим, Я открываю...

При нажатии на кнопку файл не создается на диске, а он создается только после сворачивания или закрытия окна...
Знакомлюсь с графическим интерфейсом Java Swing. Появилась такая проблема: при нажатии на кнопку...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru