Beginnersvraag

Status
Niet open voor verdere reacties.

JavaDummie

Gebruiker
Lid geworden
20 jun 2009
Berichten
6
Hoi,

Ik ben bezig met een simpel programmaatje dat horizontale lijnen op de onderste helft van het venster plaatst. De afstand tussen de lijnen is variabel en door de gebruiker in te stellen via een tekstvak en een knop aan de bovenkant van het venster. Het probleem is dat als ik het programmaatje run er alleen doorzichtig venster komt dat ik geforceerd moet afsluiten.
Ik gebruik de IDE Eclipse.
Hieronder de code voor klasse voor het venster (ik denk niet dat de fout hierin zit):
Code:
package h03;

import javax.swing.*;

public class H_lijnen extends JFrame
{
	public H_lijnen()
	{
		JFrame venster = new JFrame();
		venster.setSize(500,200);
		venster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		venster.setLocation(200,200);
		venster.setTitle("Horizontale lijnen");
		JPanel paneel = new H_lijnenpaneel();
		venster.add(paneel);
		venster.setVisible(true);
	}
	
	public static void main( String[] args)
	{
		new H_lijnen();
	}
}

Hieronder de code voor de klasse met het paneel:

package h03;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class H_lijnenpaneel extends JPanel implements ActionListener

{
	private JTextField afstandLijnen; 
	private JButton tekenLijnen;
	private int afstand;
	
	public H_lijnenpaneel()
	{
		afstandLijnen  = new JTextField("5");
		tekenLijnen = new JButton("Teken de lijnen");
		tekenLijnen.addActionListener(this);
		add(new JLabel("Afstand tussen de lijnen"));
		add(afstandLijnen);
		add(tekenLijnen);	
	}	
	public void paintComponent(Graphics g)
	{		
		super.paintComponent( g );
		g.setColor(Color.BLACK);
		int onder  = getHeight();
		int helft = getHeight() / 2;
		int yPos = helft;
		while(yPos <= onder) 		
		{				
			g.drawLine(0,yPos,500,yPos);
			yPos = yPos + afstand;
		}
	}	
	public void actionPerformed(ActionEvent e)
	{
		afstand = Integer.parseInt(afstandLijnen.getText());		
		repaint();
	}
}
Kan iemand hier de fout in zien? Alvast bedankt!!!

Met vriendelijke groet,

Ralf
 
Laatst bewerkt door een moderator:
Zonder de code getest te hebben wil ik een gokje wagen:

Code:
private int afstand;

..
..
..

while(yPos <= onder)
{
    g.drawLine(0,yPos,500,yPos);
    yPos = yPos + afstand;
}

Stel yPos = 10, volgens mij doet hij dan de hele tijd yPos = 10 + 0.. Aangezien ik niet zie waar de variabele afstand is geinitialiseerd (ja, wel in actionperformed, maar bij het tekenen van het venster wordt als eerste paintComponent(...) aangeroepen).. Hierdoor blijft hij oneindig in deze loop hangen, raakt de paint nooit klaar, en krijg je dat halve scherm te zien.

[EDIT]En probeer in het vervolg de code tussen de
Code:
 [/ code] tags te plaatsen, zoals hierboven. Dat maakt het een stuk overzichtelijker ;)[/EDIT]
 
Laatst bewerkt:
Ik denk dat het probleem ligt aan het feit dat je een panel en een frame samen gebruikt. Buiten het feit of ik betwijfel of dat gaat werken, vraag ik me af wat het nut er van is. Ik zou de code aanpassen naar:

Code:
package src;

import java.awt.Rectangle;

import javax.swing.JFrame;
import javax.swing.JTextField;

public class H_lijnen
{
	public H_lijnen()
	{
		JFrame venster = new JFrame();
		venster.setSize(500,200);
		venster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		venster.setLocation(200,200);
		venster.setTitle("Horizontale lijnen");
		venster.setVisible(true);
		venster.setLayout(null);
		JTextField jTextField1 = new JTextField();
		jTextField1.setBounds(new Rectangle(130, 10, 100, 25));
		venster.add(jTextField1);
	}
	
	public static void main( String[] args)
	{
		new H_lijnen();
	}
}

Op deze manier kun je alles op je frame plaatsen.

De regel

Code:
JFrame venster = new JFrame();

kun je dan nog altijd aanpassen naar

Code:
H_lijnenpaneel venster = new H_lijnenpaneel()

Je H_lijnenpaneel klasse moet dan wel JFrame extenden.
 
Laatst bewerkt:
niekfct, bedankt! Door een waarde toe te kennen aan private int afstand doet hij het nu wel.

Jimbo1984, ik begrijp niet precies wat je bedoelt :o , maar ik zal er nog eens goed naar kijken. Bedankt in ieder geval.
 
Nog een vraagje: hoe zou ik ervoor kunnen zorgen dat de paintComponent pas wordt uitgevoerd nadat de knop is ingedrukt, dus na de actionPerformed(ActionEvent e)? Dat hij dus niet meteen begint met tekenen zodra het programma start.
 
initialiseer 'afstand' op -1

Code:
private int afstand = -1;

en pas de painComponent() aan naar:

Code:
public void paintComponent(Graphics g) {
		if (afstand != -1) {
			super.paintComponent(g);
			g.setColor(Color.BLACK);
			int onder = getHeight();
			int helft = getHeight() / 2;
			int yPos = helft;
			while (yPos <= onder) {
				g.drawLine(0, yPos, 500, yPos);
				yPos = yPos + afstand;
			}
		}
	}
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan