Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Frame paint  (Прочитано 23941 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« : 29-05-2009 14:41 » 

Код:
package game;

public class Form extends java.awt.Frame
{
    public Form() {
        super("title");

        setSize(700, 700);

        setResizable(false);

        {
            java.awt.Dimension d = new java.awt.Dimension(
                    (java.awt.Toolkit.getDefaultToolkit()).getScreenSize());
            int x = d.width / 2 - (getWidth() / 2);
            int y = d.height / 2 - (getHeight() / 2);
            setLocation(x, y);
        }

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent e) {
                System.exit(0);
            }
        });

        setVisible(true);
    }

    public void paint(java.awt.Graphics g) {
        g.drawString("Hello", 10, 10);
    }
}

Почему не выводит
Цитата
Hello
?
« Последнее редактирование: 29-05-2009 14:57 от Inkognito » Записан
Asver
Постоялец

by
Offline Offline
Пол: Мужской

« Ответ #1 : 29-05-2009 15:07 » 

Попробуй:
Код:
g.drawString("Hello", 40, 40);
Так выводит.

Просто координаты 10, 10 попадают на заголовок окна, и текста не видно.
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #2 : 29-05-2009 15:20 » 

Ох, дожился  Отлично. Так и есть.

А можно как-то виделить область без заголовка или узнать высоту заголовка?

P.S.: недавно прогу писал, дык там и g.drawLine(100, 100, 200, 200) не работало (при размерах 700х700). Показал бы прогу, да нет уже её  Жаль ...
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #3 : 01-06-2009 16:23 » 

 Жаль Ой рано...

Следующий код:
Код:
    // Режимы игры
    public final int CLEAR = 0, DRAW = 1, GAME = 2;

...

    @Override public void paint(java.awt.Graphics g) { // 390x320
        java.awt.Graphics2D gc = (java.awt.Graphics2D) g;
        switch(mode) {
            case CLEAR:
                setForeground(java.awt.Color.WHITE);
                gc.fillRect(0, 0, getWidth(), getHeight());
                break;
            case DRAW:
                setForeground(java.awt.Color.GRAY);
                for(int x = 50; x <= 440; x += 10)
                    gc.drawLine(x, 50, x, 370);
                for(int y = 50; y <= 370; y += 10)
                    gc.drawLine(50, y, 440, y);
                break;
            case GAME:
                break;
        }
    }

...

        public void actionPerformed(java.awt.event.ActionEvent e) {
                type = LOCAL; // Тип игрі
                player = RED; // Определяем цвет игрока
                // Рисуем поле
                mode = DRAW; // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                form.repaint(); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                // Запускаем игру
                mode = GAME;
        }
Но case DRAW в paint(...) не запускается ни разу (проверял с помощью диалоговых окон). Вопрос: почему?
Записан
Asver
Постоялец

by
Offline Offline
Пол: Мужской

« Ответ #4 : 02-06-2009 08:12 » 

Потому что при вызове repaint() перерисовка выполнятся не сразу, а в очередь событий EventQueue добавляется событие для перерисовки окна.
И когда это события начинает обрабатываться, вызывая при этом paint( Graphics g), mode уже равна GAME.
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #5 : 02-06-2009 14:07 » 

Вставил mode = GAME в сам paint(), а он все равно не работает, зараза.

Еще вопрос. Мне нужно перерисовать все поле как только окно изменит размер. У меня в учебнике написано, что методы
Цитата
       public void windowOpened(java.awt.event.WindowEvent e)
        public void windowClosing(java.awt.event.WindowEvent e)
        public void windowClosed(java.awt.event.WindowEvent e)
        public void windowIconified(java.awt.event.WindowEvent e)
        public void windowDeiconified(java.awt.event.WindowEvent e)
        public void windowActivated(java.awt.event.WindowEvent e)
        public void windowDeactivated(java.awt.event.WindowEvent e)
перехватывают это событие, но в комментариях JVM я такого не нашел. И собственно вопрос: каким cобытием (xEvent) и каким методом  можно перехватить изменение размеров окна?

P.S.: Хочется знать точно.
« Последнее редактирование: 02-06-2009 14:36 от Inkognito » Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #6 : 02-06-2009 14:22 » new

WindowListener:
Цитата
       public void windowOpened(java.awt.event.WindowEvent e)       Открытие окна
        public void windowClosing(java.awt.event.WindowEvent e)      Закрытие окна
        public void windowClosed(java.awt.event.WindowEvent e)       Окно закрытое
        public void windowIconified(java.awt.event.WindowEvent e)    Свернуто
        public void windowDeiconified(java.awt.event.WindowEvent e)  Развернуто
        public void windowActivated(java.awt.event.WindowEvent e)    Активировано
        public void windowDeactivated(java.awt.event.WindowEvent e)  Деактивировано
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 02-06-2009 14:38 » 

Inkognito, это ты сам с собой ведёшь беседу? Улыбаюсь Я так понимаю, ответ правильный - реализовать интерфейс слушателя WindowStateListener и прописать экземпляр в слушатели окна.
« Последнее редактирование: 02-06-2009 14:41 от Вад » Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #8 : 02-06-2009 14:49 » 

Нет, WindowStateListener не подходит для перехвата изменения размеров окна - я добавил вывод диалогового окна в тело обработчика, но оно ни разу не вызывается.
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 02-06-2009 15:09 » 

Тут вот гугль подсказывает, что люди перекрывают setBounds у окна, чтобы перехватить изменение размера.
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #10 : 02-06-2009 15:18 » 

Что означает "перекрывают"?
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 02-06-2009 16:00 » 

Наследуют от окна и определяют свою реализацию этого метода (при этом из своей реализации нужно вызывать родительскую)
Записан
Asver
Постоялец

by
Offline Offline
Пол: Мужской

« Ответ #12 : 02-06-2009 19:29 » 

Код:
addComponentListener( new ComponentAdapter() {

            public void componentResized( ComponentEvent e ) {
                System.out.println( "Width: " + e.getComponent().getWidth() +
                        " Height: " + e.getComponent().getHeight() );

            }

        } );
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #13 : 10-06-2009 08:57 » 

...

Я создал масив цветов:
Код:
    private java.awt.Color [][] points = new java.awt.Color[n][m];
Все значения заполняю null.
Как только игрок кликнет на поле, в этот масив в определенную позицию вставляется цвет (java.awt.Color).
Потом сравниваю цвета определенной позиции (х, у) и цвет игрока, который сейчас ходит:
Код:
if (points[x][y] == player) ...
но он дает false. Заставил вывести диалоговым сообщением цвета позиции и игрока - показало что они (255,0,0) и (255,0,0), тоесть однаковые. Почему же if дает все вреся false?
Записан
Asver
Постоялец

by
Offline Offline
Пол: Мужской

« Ответ #14 : 10-06-2009 09:18 » 

Оператор == сравнивает ссылки на объекты. Он вернет true только если один и тот-же объект.
Для сравнения самих объектов в Java надо использовать метод equals().
Код:
if (points[x][y].equals( player) )
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #15 : 10-06-2009 12:37 » 

Как можно перехватить нажатие кнопки без Label'а?
Записан
Asver
Постоялец

by
Offline Offline
Пол: Мужской

« Ответ #16 : 10-06-2009 12:53 » 

Что значит без Label'a?
Чтобы обрабатывать нажатия кнопок для какого то компонента необходимо добавить для него слушателя
Код:
addKeyListener(...)
и чтобы этот компонент был в фокусе.

Если ты имеет в виду перехват нажатий не для конкртного JLabel на форме, а для всей формы, то и добавь слушателя на форму, а не на JLabel.
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #17 : 10-06-2009 13:01 » 

Нет, я создаю кнопку без названия и хочу установить для нее обработчик ActionEvent'ов. Что-то типа выбора цветов у MSPaint. Кстати, нет ли уже готового блока цветов, чтобы не создавать самому (это было бы лучше чем кнопки)?
Записан
Asver
Постоялец

by
Offline Offline
Пол: Мужской

« Ответ #18 : 10-06-2009 13:25 » 

Про кнопку без названия не понял, как это.
Цитата
Кстати, нет ли уже готового блока цветов, чтобы не создавать самому
Может javax.swing.JColorChooser это подойдет?
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #19 : 10-06-2009 13:30 » 

Может javax.swing.JColorChooser это подойдет?
Да
Про кнопку без названия не понял, как это.
Код:
java.awt.Button b = new java.awt.Button(); // а не java.awt.Batton("Label")
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #20 : 10-06-2009 13:37 » 

А можно как-то эту панель уменьшить - убрать вкладки HSB, RGB, Preview, оставить только Swatches?
Записан
Asver
Постоялец

by
Offline Offline
Пол: Мужской

« Ответ #21 : 10-06-2009 15:37 » 

Попробуй так:
Код:
JColorChooser  cc = new JColorChooser( );
        AbstractColorChooserPanel panels[] = cc.getChooserPanels();

        for( int i = 1; i < panels.length ; i++ ) {
            cc.removeChooserPanel( panels[i] );
        }

        cc.setPreviewPanel( new JPanel( ) );
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #22 : 11-06-2009 14:53 » 

Как можно получить выбранный в даный момент цвет? Я попробовал два варианта: ставил на JColorChooser и panels[0] обработку ActionListener, на щелчок мыши методом getColor() забирал цвет. Но это не работает.
Записан
Asver
Постоялец

by
Offline Offline
Пол: Мужской

« Ответ #23 : 11-06-2009 16:02 » 

Код:
colorChooser.getSelectionModel().addChangeListener( ... );
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines