draw in een window

Status
Niet open voor verdere reacties.

Juzzz

Gebruiker
Lid geworden
15 jan 2008
Berichten
281
Ik ben wat aan het testen met het grafische gebeuren in java.
nou heb ik daar nog niet heel veel ervaring in dus probeer ik daar wat meer mee te doen.

nou wil ik een vierkantje op het scherm tekenen en dat ik met knoppen of de muis kan bepalen waar deze getekend wordt.

later wil ik meerdere vierkantjes die bewegen en dat er iets gebeurd als deze elkaar aanraken.

wat nu niet lukt:
- het vierkantje kan niet overal op het scherm zoals helemaal rechts of onder (boven de knoppen)
- De achtergrond veranderd niet van kleur.

programma:
Main.java
Code:
public class Main
{
    
    public static void main(String[] args) 
    {
	Window window = new Window();
    }
}

Window.java
Code:
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;

public class Window extends JFrame implements ActionListener, MouseListener
{
    private DrawComponent dc;
    private JButton buttonLeft, buttonRight, buttonUp, buttonDown;

    public Window()
    {
	dc = new DrawComponent(150, 100);
	
	JPanel panel = new JPanel();
	panel.setLayout(new BorderLayout());
	buttonLeft = new JButton("left");
	buttonRight = new JButton("Right");
	buttonUp = new JButton("Up");
	buttonDown = new JButton("Down");

	panel.add(buttonLeft, BorderLayout.WEST);
	panel.add(buttonRight, BorderLayout.EAST);
	panel.add(buttonUp, BorderLayout.NORTH);
	panel.add(buttonDown, BorderLayout.SOUTH);

	JFrame frame = new JFrame();
	frame.setLayout(new BorderLayout());
	frame.setTitle("DrawRect");
	frame.setSize(500, 500);
	frame.setResizable(false);
	frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
	frame.getContentPane().add(dc, BorderLayout.CENTER);
	frame.getContentPane().add(panel, BorderLayout.SOUTH);

	frame.setVisible(true);

	buttonLeft.addActionListener(this);
	buttonRight.addActionListener(this);
	buttonUp.addActionListener(this);
	buttonDown.addActionListener(this);
	dc.addMouseListener(this);

	System.out.println("x " + dc.getX() + "\n" +
			   "y " + dc.getY());
    }

    public void actionPerformed(ActionEvent e)
    {
	if(e.getSource() == buttonLeft)
	    {
		dc.setX(dc.getX()-5);
		dc.repaint();
		System.out.println("x " + dc.getX() + "\n" +
				   "y " + dc.getY());
	    }
	else if(e.getSource() == buttonRight)
	    {
		dc.setX(dc.getX()+5);
		dc.repaint();
		System.out.println("x " + dc.getX() + "\n" +
				   "y " + dc.getY());
	    }
	else if(e.getSource() == buttonUp)
	    {
		dc.setY(dc.getY()-5);
		dc.repaint();
		System.out.println("x " + dc.getX() + "\n" +
				   "y " + dc.getY());
	    }
	else if(e.getSource() == buttonDown)
	    {
		dc.setY(dc.getY()+5);
		dc.repaint();
		System.out.println("x " + dc.getX() + "\n" +
				   "y " + dc.getY());
	    }
    }
    
    public void mousePressed(MouseEvent e) {  }

    public void mouseReleased(MouseEvent e) {  }

    public void mouseEntered(MouseEvent e) {  }

    public void mouseExited(MouseEvent e) {  }

    public void mouseClicked(MouseEvent e) 
    {
	dc.setX(e.getX());
	dc.setY(e.getY());
	dc.repaint();
	    System.out.println("x " + dc.getX() + "\n" +
			       "y " + dc.getY());
    }

}

DrawComponent.java
Code:
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class DrawComponent extends JPanel
{
    private int x;
    private int y;
    
    public DrawComponent(int x, int y)
    {
	this.x = x;
	this.y = y;
    }
    
    public void paintComponent(Graphics g) 
    {
	Graphics2D g2 = (Graphics2D)g;
	super.paintComponent(g);
	g2.setBackground(Color.red);
	g2.setColor(Color.blue);
	g2.drawRect(x, y, 10, 10);
    }

    public void setX(int x)
    {
	this.x = x;
    }

    public void setY(int y)
    {
	this.y = y;
    }

    public int getX()
    {
	return x;
    }

    public int getY()
    {
	return y;
    }

}


kan iemand mij een beetje de goede weg op helpen..

bedankt
 
Volgens mij heb je het DrawingComponent in je Window geen size of preferredsize gegeven waardoor er wel getekend wordt, maar je het niet ziet.
Mijn oplossing:

Code:
dc.setPreferredSize( 500, 500 ); //mag een andere size zijn als je dat wilt.

Hannesvdc
 
Volgens mij heb je het DrawingComponent in je Window geen size of preferredsize gegeven waardoor er wel getekend wordt, maar je het niet ziet.
Mijn oplossing:

Code:
dc.setPreferredSize( 500, 500 ); //mag een andere size zijn als je dat wilt.

Hannesvdc

de functie 'setPreferredSize(int, int);' bestaat niet.
Maar met 'setPreferredSize(new Dimension(500, 500));' werkt het nog steeds niet..

Ik denk misschien dat het aan mijn BorderLayout ligt.. ik ga dit snel testen.
 
Laatst bewerkt:
Wel, die layoutmanagers doen soms rare dingen met de size en preferredsize. Het kan zijn dat je een heel rare preferred size hebt ingegeven en dat je layout daar geen rekening mee houdt. Ik heb dat probleem ook soms. Probeer eens een paar andere manieren, en als het dan nog niet werkt, zal ik wel nog eens verder kijken.

mvg,

Hannesvdc
 
Voeg onderstaand eens toe in je DrawComponent class

Code:
    public Dimension getPreferredSize() {
        return new Dimension(150, 100);
    }
 
1)je x en y kwamen in conflict met JPanel.x en JPanel.y (vraag me niet waarom) en dus schoof je hele panel opzij
2) Je maakt een nieuwe JFrame aan in je JFrame(Window), daar is geen enkele reden toe, bovendien zal je Window geen graphics hebben (dit was niet meteen fout maar kan gemakkelijk tot fouten leiden)
3)g2.setBackground werkt niet als je g2 voortvloeit uit een lightweight component zoals je JFrame (enkel bv uit Image.getGraphics()) je moet dus de achtergrond van de component wijzigen en niet de graphics

(oh ja, main staat onder in je Window - minder kopieerwerk)


Window.java
Code:
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.*;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;

public class Window extends JFrame implements ActionListener, MouseListener {
	private DrawComponent dc;

	private JButton buttonLeft, buttonRight, buttonUp, buttonDown;

	public Window() {
		dc = new DrawComponent(150, 100);

		JPanel panel = new JPanel();
		panel.setLayout(new BorderLayout());
		buttonLeft = new JButton("left");
		buttonRight = new JButton("Right");
		buttonUp = new JButton("Up");
		buttonDown = new JButton("Down");

		panel.add(buttonLeft, BorderLayout.WEST);
		panel.add(buttonRight, BorderLayout.EAST);
		panel.add(buttonUp, BorderLayout.NORTH);
		panel.add(buttonDown, BorderLayout.SOUTH);

		setLayout(new BorderLayout());
		setTitle("DrawRect");
		setSize(500, 500);
		setResizable(false);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		getContentPane().add(dc, BorderLayout.CENTER);
		getContentPane().add(panel, BorderLayout.SOUTH);

		setVisible(true);

		buttonLeft.addActionListener(this);
		buttonRight.addActionListener(this);
		buttonUp.addActionListener(this);
		buttonDown.addActionListener(this);
		dc.addMouseListener(this);
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == buttonLeft) {
			dc.setMyX(dc.getMyX() - 5);
		} else if (e.getSource() == buttonRight) {
			dc.setMyX(dc.getMyX() + 5);
		} else if (e.getSource() == buttonUp) {
			dc.setMyY(dc.getMyY() - 5);
		} else if (e.getSource() == buttonDown) {
			dc.setMyY(dc.getMyY() + 5);
		}
		repaint();
	}

	public void mousePressed(MouseEvent e) {
	}

	public void mouseReleased(MouseEvent e) {
	}

	public void mouseEntered(MouseEvent e) {
	}

	public void mouseExited(MouseEvent e) {
	}

	public void mouseClicked(MouseEvent e) {
		System.out.println("Window.mouseClicked()");
		dc.setMyX(e.getX());
		dc.setMyY(e.getY());
		repaint();
	}

	public static void main(String[] args) {
		new Window();
	}

}


DrawComponent.java
Code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class DrawComponent extends JPanel {
	private int myX;

	private int myY;

	private int blockSide = 10;

	public DrawComponent(int anX, int anY) {
		this.myX = anX;
		this.myY = anY;
		setOpaque(true);
		setBackground(Color.red);
	}

	@Override
	public void update(Graphics g) {
		paint(g);
	}

	public void paint(Graphics g) {
		super.paint(g);
		Graphics2D g2 = (Graphics2D) g;
		g2.setColor(Color.blue);
		System.out.println(myX+" :: "+myY+" :: "+getWidth()+" :: "+getHeight());
		g2.drawRect(myX, myY, blockSide, blockSide);
	}

	public void setMyX(int anX) {
		if (anX>=0 && anX<=getWidth()-blockSide) {
			myX = anX;
		}
	}

	public void setMyY(int anY) {
		if (anY>=0 && anY<=getHeight()-blockSide) {
			myY = anY;
		}
	}

	public int getMyX() {
		return myX;
	}

	public int getMyY() {
		return myY;
	}

}
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan