JPanel объясните

Статус: Offline
Реєстрація: 26.09.2008
Повідом.: 101
JPanel объясните

Народ объясните!!!
Есть класс расширяющий JPanel в конструкторе этого класса загружается изображение и реализуется метод paintComponent().
После запуска программы все нормально отрисовываеся. Не могу понять как по нажатию на кнопке вывести второе изображение сверху первого, причем gif, имеющий прозрачную область и желательно не делать еще классов.
делать пытался вот так:
public class Menu extends JPanel{
private Image bG;
private Image start;
private int menuSelect = 0;
Menu(){
try{
bG = ImageIO.read(new File("BackGround.jpg"));
start = ImageIO.read(new File("Start.gif"));
} catch (IOException e){
e.printStackTrace();
JPanel startButton = new JPanel();
//как к startButton добавить изображение?
}
public void paintComponent(Graphics g){
super.paintComponents(g);
g.drawImage(bG, 100, 100, null);
}
public void keySelect(){
this.addKeyListener(new KeyListener (){
public void keyPressed(KeyEvent e){
menuSelect++;
if (e.getKeyCode() == KeyEvent.VK_DOWN){
if (menuSelect == 1){
add(startButton); //?????
repaint();
}
}
}
});
}
 
програмистов тут походу маловато :)
 
реализуется метод paintComponent() ... второе изображение сверху первого
В нем и рисуй, как нравится. Например, так:
Код:
public void paintComponent(Graphics g) {
            Image image = null;
            Image image2 = null;
            try {
                image = ImageIO.read(new URL("https://www.kharkovforum.com/images/misc/vbulletin3_logo_white.gif"));
                image2 = ImageIO.read(new URL("https://www.kharkovforum.com/images/kharkov.gif"));
            } catch (Throwable ex) {ex.printStackTrace();}
            g.drawImage(image, 0, 0, null);
            g.drawImage(image2, 22, 22, 77, 77, Color.LIGHT_GRAY, null);
}
как по нажатию на кнопке
Повесь слушатель на нужные элементы.
причем gif, имеющий прозрачную область
Я ничего не понял.
делать пытался вот так:
Почитай статьи на тему: "культура программирования". Хотя б в IDE делай "Format" кода. (В Netbeans: Alt+Shift+F)

програмистов тут походу маловато
тут больше:
Тільки зареєстровані користувачі бачать весь контент у цьому розділі

Тільки зареєстровані користувачі бачать весь контент у цьому розділі
 
reflect ты наверное меня не правильно понял. Как нарисовать в методе paintComponent() я понял, я не понял как нарисовать когда происходит событие.
К примеру после запуска программы появляется окно с картинкой (нарисованной в методе paintComponent при запуске), а потом при нажатии на кнопку сверху нарисованной картинки рисуется другая картинка (после того как пользователь нажмет кнопку)

Пробовал делать вот так но грузится только задний фон, а при нажатии ничего не происходит.

HTML:
public void paintComponent(final Graphics g){
		super.paintComponents(g);
		g.drawImage(backGround, WIDTH_BACK_GROUND, HEIGHT_BACK_GROUND, null);
		
		addKeyListener(new KeyListener (){
			public void keyPressed(KeyEvent e){
				if (e.getKeyCode() == KeyEvent.VK_DOWN){
					g.drawImage(start, WIDTH_START, HEIGHT_START, null);
				}
			}	
			@Override
			public void keyReleased(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}

			@Override
			public void keyTyped(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}
		});
	}
 
Останнє редагування:
Теперь понял. Чтобы перерисовать объект, надо, после возникновения события, в обработчике вызывать метод repaint() у нужной компоненты.
Сама прорисовка делается в методе paintComponent, в слушатели ее пихать не нужно. Можешь какие-то метки (boolean) в классе прорисовки делать (когда событие обрабатывается), чтобы метод прорисовки знал, что рисовать.

У тебя же при каждой новой перерисовке во фрейм добавляется слушатель, который, при возникновении события, изменяет объект graphics из прошлой прорисовки компоненты.
 
Останнє редагування:
Не могу понять как работает перерисовка. Основная суть осталось той же - запустить окно и нарисовать картинку, а при нажатии изменить картинку на другую. Написал вот таких два класса, при запуске все нормально рисуется, а при нажатии нет никаких действий вообще.

Вот собственно быдлокод:-):
HTML:
package main;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class Menu extends JPanel{

	private static final long serialVersionUID = 1L;
	
	public static final int WIDTH_BACK_GROUND = 0;
	public static final int HEIGHT_BACK_GROUND = 0;
	
	private Image backGround;
	private Image start, startSelect;
	
	
	Menu(){
		try{
			backGround = ImageIO.read(new File("BackGround.jpg"));
			start = ImageIO.read(new File("Start.gif"));
			startSelect = ImageIO.read(new File("StartSelect.gif"));
		} catch (IOException e){
			e.printStackTrace();
		}
		
		final ButtonMenu buttonStart = new ButtonMenu(start, startSelect, true);
		
		setLayout(null);
				
		buttonStart.setBounds(80, 80, 150, 20);
		add(buttonStartGame);

		addKeyListener(new KeyListener() {
			@Override
			public void keyTyped(KeyEvent e) {
				// TODO Auto-generated method stub
				if (e.getKeyCode() == KeyEvent.VK_UP){
					buttonStart.selectVisible(false);
					buttonStart.repaint();
					repaint();
				}
			}
			@Override
			public void keyReleased(KeyEvent e) {
				// TODO Auto-generated method stub
			}
			@Override
			public void keyPressed(KeyEvent e) {
				// TODO Auto-generated method stub
			}
		});
		setSize(800, 600);
		setVisible(true);
	}
	public void paintComponent(Graphics g){
		super.paintComponents(g);
		g.drawImage(backGround, WIDTH_BACK_GROUND, HEIGHT_BACK_GROUND, null);
	}
}

вот второй класс:
HTML:
package main;

import java.awt.Component;
import java.awt.Graphics;
import java.awt.Image;

public class ButtonMenu extends Component{
	private static final long serialVersionUID = 1L;

	private Image image1;
	private Image image2;
	private boolean visible;
	
	public ButtonMenu(Image image1, Image image2, boolean visible){
		this.image1 = image1;
		this.image2 = image2;
		this.visible = visible;
	}
	
	public void paint(Graphics g){
		if (visible == true){
			g.drawImage(image1, 0, 0, null);
		}
		else {
			g.drawImage(image2, 0, 0, null);
		}
	}

	public void selectVisible(boolean select){
		this.visible = select;
	}
}

вот main метод:
HTML:
      public static void main(String[] args) {
                SwingUtilities.invokeLater(new Runnable(){
			public void run(){
                                    new Menu();
                        }
                }
        }

Буду рад любому совету по теме :-)
 
Останнє редагування:
почитай в Хорстмане советы по отладке, используй дебагер или метки out.prinln();

Слушатель кнопок не работает, т.к. его нужно добавлять на ВСЕ компоненты, которые м.б. в фокусе: фреймы, диалоги, свинг...

setLayout(null);
add(buttonStartGame);
...
@Override
public void paintComponent(Graphics g){...}
Ты переопределил метод, рисующий компонету. Так что первые две строчки смысла не имеют.

Компоненты swing "видимые" по-умолчанию.
Менеджеры компоновки вызывают метод getPreferredSize(), a не getSize().
 
Как добавлять слушатель на все компоненты?
В классе ButtonMenu реализовал KeyListener и метод pain, в классе Menu c помощью addKeyListener добавил слушателя к компоненту (кнопке) но все равно без результатно, в классе реализующем JFrame вообще нельзя этот слушатель добавить.
 
Как добавлять слушатель на все компоненты?
Рекурсивно:
Код:
public static void addKeyListenerToAll(Component c, KeyListener kl) {
        if (c instanceof Container) {
            for (Component component : ((Container) c).getComponents()) {
                addKeyListenerToAll(component, kl);
            }
        }
        c.addKeyListener(kl);
}

в классе реализующем JFrame вообще нельзя этот слушатель добавить.
да ладно, нельзя.
Можно getter слушателя создать:
addKeyListenerToAll(JFrame, MenuPanel.getMyKeyListener())
можно создать метод, добавляющий слушатель:
MenuPanel.addMyListener(JFrame parentFrame){
addKeyListenerToAll(parentFrame, myKeyListener);
}
 
Спс за советы. Разобрался наконец.
 
Останнє редагування:
Назад
Зверху Знизу