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

Не видно JComponent на JPanel

01.09.2017, 17:35. Показов 2133. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как -то пропустил тему по изучению Swing. Ради эксперимента решил написать простенькие часы. Осталось только графику сделать. Столкнулся со следующей проблемой: создаю JPanel, на который буду помещать циферблат и стрелки (наследники JComponent). Добавляю панель во фрейм и компонентов не видно. Если добавить компоненты просто на фрейм, то все видно. Пробовал разными способами и пока не могу понять в чем причина того, что компоненты не видно на панели во фрейме.

P.S. куски кода для примера. Если кто-то скажет, что тут много доделать надо.

Кликните здесь для просмотра всего текста
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
package clock;
 
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Point2D;
 
public class ClockFace extends JComponent {
    
    private Point2D center;
    private double radius;
    private boolean hasMinutesLabels;
    
    public ClockFace(Point2D center, double radius) {
        super();
        this.center = center;
        this.radius = radius;
        hasMinutesLabels = false;
    }
    
    public ClockFace(Point2D center, double radius, boolean hasMinutesLabels) {
        super();
        this.center = center;
        this.radius = radius;
        this.hasMinutesLabels = hasMinutesLabels;
    }
    
    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        g2.setStroke(new BasicStroke(2.0f));
        Ellipse2D ellipse = new Ellipse2D.Double(center.getX()-radius, center.getY()-radius,
                center.getX()+radius, center.getY()+radius);
        g2.draw(ellipse);
    }
}

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package clock;
 
import com.sun.org.apache.regexp.internal.RE;
 
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Point2D;
 
public class ClockPanel extends JPanel {
    //TODO: панель содержит все элементы часов и слушает изменение времени
    
    public ClockPanel() {
        setPreferredSize(new Dimension(300,300));
//        Point2D center = new Point2D.Double(getPreferredSize().width/2, getPreferredSize().height/2);
        ClockFace clockFace=new ClockFace(new Point2D.Double(20,20), 20);
        add(clockFace, BorderLayout.CENTER);
    }
    
}

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package clock;
 
import javafx.embed.swing.JFXPanel;
 
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Point2D;
 
public class ClockFrame extends JFrame {
    
    private final int DEFAULT_WIDTH = 300;
    private final int DEFAULT_HEIGHT = 300;
    
    public ClockFrame() throws HeadlessException {
        super("Clock");
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        
        add(new ClockPanel()); //так не работает
        add(new ClockFace(new Point2D.Double(20, 20), 20));//так работает
    }
}

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package clock;
 
import javax.swing.*;
import java.awt.*;
 
public class Test {
    
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame clockFrame = new ClockFrame();
                clockFrame.setVisible(true);
            }
        });
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.09.2017, 17:35
Ответы с готовыми решениями:

Отрисовка в JPanel несколько JComponent
Приветствую. Есть два класса наследующиеся от JComponent, рисующие координатные оси и график. И есть класс Epure который наследуется от...

Добавление JPanel на JPanel, не отображаются те, которые добавлены сверху
Здравствуйте. У меня есть панель fon на которой у меня картинка с фоном и 15 панелей на которых нарисованы шарики,пытаюсь добавить панели с...

Как правильно задать размер JPanel чтобы JFrame при pack() сжимался до размеров JPanel
Подскажите как правильно задать размер JPanel чтобы JFrame при pack() сжимался до размеров JPanel, задание размеров при помощи setSize...

2
164 / 170 / 139
Регистрация: 28.11.2016
Сообщений: 301
02.09.2017, 08:08
Class CLockFrame
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import javax.swing.*;
import java.awt.*;
 
public class ClockFrame extends JFrame {
 
    private final int DEFAULT_WIDTH = 300;
    private final int DEFAULT_HEIGHT = 300;
 
    public ClockFrame() throws HeadlessException {
        super("Clock");
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
 
        add(new ClockPanel()); //так не работает
        //add(new ClockFace(new Point2D.Double(20, 20), 20));//так работает
    }
}

Class ClockPanel
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Point2D;
 
public class ClockPanel extends JPanel {
    //TODO: панель содержит все элементы часов и слушает изменение времени
    ClockFace clockFace;
    public ClockPanel() {
        setPreferredSize(new Dimension(300,300));
//        Point2D center = new Point2D.Double(getPreferredSize().width/2, getPreferredSize().height/2);
        clockFace=new ClockFace(new Point2D.Double(20,20), 20);
        add(clockFace, BorderLayout.CENTER);
    }
 
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        clockFace.paintComponent(g);
    }
}

Смотрите код. Добавил метод paint() который перерисовывает все компоненты на панели.
0
31 / 31 / 12
Регистрация: 25.07.2015
Сообщений: 120
05.09.2017, 08:49  [ТС]
Сделал. Интересно, я думал что метод add() сам вызовет метод paint() добавляемого компонента, поэтому даже не подумал о таком решении. Появился следующий вопрос. Добавил в главный метод создание объекта часов и их запуск. Теперь графика снова не отрисовывается. Просто пустой JFrame. Я так понимаю, что это связано как-то с потоками? Часы реализуют интерфейс Runnable и в главном методе тоже создается инстанс, который его реализует. Как решить проблему?

Кликните здесь для просмотра всего текста
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
package clock;
 
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
 
public class Clock implements Runnable {
    
    private int hours;
    private int minutes;
    private int seconds;
    private Calendar calendar;
    private ArrayList<DataChangedListener> listeners = new ArrayList<>();
    
    public Clock() {
        calendar = new GregorianCalendar();
        hours = calendar.get(Calendar.HOUR_OF_DAY);
        minutes = calendar.get(Calendar.MINUTE);
        seconds = calendar.get(Calendar.SECOND);
    }
    
    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(1000);
                updateClock();
                fireListeners();
                System.out.println(this);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            
        }
    }
    
    private void updateClock() {
        calendar = new GregorianCalendar();
        hours = calendar.get(Calendar.HOUR_OF_DAY);
        minutes = calendar.get(Calendar.MINUTE);
        seconds = calendar.get(Calendar.SECOND);
    }
    
    @Override
    public String toString() {
        return ((hours / 10 == 0) ? "0" + hours : hours) + ":" +
                ((minutes / 10 == 0) ? "0" + minutes : minutes) + ":" +
                ((seconds / 10 == 0) ? "0" + seconds : seconds);
    }
    
    public void addListener(DataChangedListener listener) {
        listeners.add(listener);
    }
    
    public void removeListener(DataChangedListener listener) {
        listeners.remove(listener);
    }
    
    private void fireListeners() {
        for (DataChangedListener listener : listeners) {
            listener.secondsChanged();
        }
    }
}


Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package clock;
 
import javax.swing.*;
import java.awt.*;
 
public class Test {
    
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                Clock clock=new Clock();
                JFrame clockFrame = new ClockFrame();
                clockFrame.setVisible(true);
                clock.run();
            }
        });
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.09.2017, 08:49
Помогаю со студенческими работами здесь

Удаление JPanel кнопкой на этом же JPanel
Есть JPanel объекты, которые представляют собой панельки с какой - то информацией, на них есть кнопка. Как сделать так, чтобы при нажатии...

Замена JPanel на JPanel в JFrame
У меня есть 3 класса. Первый класс Main наследуется от JFrame и в конструкторе установка размера и добавление JPanel второго класса....

JPanel panel_south=new JPanel(); JTextArea textArea=new JTextArea(); Где ошибка?
JPanel panel_south=new JPanel(); JTextArea textArea=new JTextArea(); Label label=new JLabel(' '); ...

Взаимодействие JComponent-ов
помогите пожалуйста создаю игру пинг понга и мне нужно реализовать отбивание шариков от стенок, ракетки и самих себя если их больше чем 1...

Перемещение JComponent
здравствуйте наткнулся на проблему при которой создаю объект шарика который наследует JComponent когда я его создаю, то его не было...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита "Пробег" при выборе "Спецтехники"
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных выбран регистр накопления, в. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru