/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
JApplet problem...
Fra : Simon...


Dato : 19-10-02 12:41

Hej,

jeg er ved at lave et lille miniprojekt, der involverer noget appletværk.

men jeg kan ikke finde ud af at lave en metode der må tegne på mit område,
jeg kan godt få den til at tegne fra paintComponent delen, eller kalde en
anden metode fra
denne der så må tegne, men jeg kan ikke finde ud af at kalde en metode i
samme klasse, fra en
anden klasse og få den til at tegne...

Jeg har vedlagt et lille uddrag af de 2 klasser her, jeg håber det er nok
ellers må i spørge om mere:

============================================================================
====
============================================================================
====
(hovedklassen først)

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JPanel;

public class Main_Graphic extends JApplet implements ActionListener
{

DrawArea drawingArea;

public void init()
{
line1 = new JPanel();
line1.setLayout(new BoxLayout(line1, BoxLayout.X_AXIS));

line2 = new JPanel();
line2.setLayout(new BoxLayout(line2, BoxLayout.X_AXIS));

line3 = new JPanel();
line3.setLayout(new BoxLayout(line3, BoxLayout.X_AXIS));


//tilføjelser til "linierne" har jeg fjernet, da dette virker fint,
der ligger et par textfelter og knapper i hver.

//Typen fra den anden klasse der kommer nedenfor, det er lidt denne
del der er problem med (drawingArea).
drawingArea = new
DrawArea((APPLET_HEIGHT-PANEL_HEIGHT),APPLET_WIDTH);

appletPanel = new JPanel();
appletPanel.add(line1);
appletPanel.add(line2);
appletPanel.add(line3);
appletPanel.add(drawingArea);

getContentPane().add(appletPanel);

setSize(APPLET_WIDTH,APPLET_HEIGHT);
}

//hvis man trykker på en knap:
public void actionPerformed(ActionEvent event)
{

if (event.getSource() == punkt)
{
//ved kald af metoden test, troede jeg jeg kunne tegne videre...
men det kunne jeg ikkem hvad går galt
drawingArea.test();
msg.setText("Den når hertil så den kører knappen");
}
}
}

============================================================================
====
============================================================================
====
(Den anden klasse):

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

public class DrawArea extends JPanel
{
private int height;
private int width;
private Graphics side;

public DrawArea(int height_p, int width_p)
{
height = height_p;
width = width_p;
setBackground(Color.white);
setPreferredSize(new Dimension(width,height));
}

public void paintComponent(Graphics page)
{
//Sørger for vi beholder værdier fra DrawArea constructoren
super.paintComponent(page);

page.setColor(Color.black);

page.drawLine(200,200,300,300);
side = page;
}

//Det er så denne metode der ikke vil kaldes, den virker _kun_ hvis jeg
kalder den fra paintComponent metoden med test()...????
//Hvordan kan jeg lave en som der vil virke, så jeg fra den anden del af
programmet (hovedklassen) kan indtaste koordinater til fx streger og så
tegne
// dem med en metode i denne klasse ??
public void test()
{
side.setColor(Color.red);
side.drawLine(400,400,600,400);
}
}


============================================================================
====
============================================================================
====

Mange tak for hjælpen !

mvh.Simon



 
 
Lars Dam (19-10-2002)
Kommentar
Fra : Lars Dam


Dato : 19-10-02 13:02

On Sat, 19 Oct 2002 13:41:24 +0200, "Simon..." <devnull@linux.org>
wrote:

>Hej,
>
>jeg er ved at lave et lille miniprojekt, der involverer noget appletværk.
>
>men jeg kan ikke finde ud af at lave en metode der må tegne på mit område,
>jeg kan godt få den til at tegne fra paintComponent delen, eller kalde en
>anden metode fra
>denne der så må tegne, men jeg kan ikke finde ud af at kalde en metode i
>samme klasse, fra en
>anden klasse og få den til at tegne...

Du har misforstået hvordan paint() mekanismen fungerer.

Du skal tegne _alt_ hvad du vil tegne i paintComponent(g). Når du så
vil opdatere, skal du kalde repaint() på den komponent du vil
opdatere; så vil systemet på et passende tidspunkt kalde
paintComponent() for dig, hvor du så selv tegner det der skal tegnes.

Lidt pseudo kode til at illustrere hvordan du skal gøre:

klasse A: // komponent der kan tegne ting
attributter der beskriver hvad der skal tegnes
paintComponent( g ) tegner hvad attributterne siger
metoder til at ændre på attributter, eks:
public void setAttribut( Type værdi ){
this.værdi = værdi;
repaint(); // giver besked om at denne komponent skal gentegnes
}

klasse B
indeholder logik til at ændre på hvordan a skal opføre sig
A a = new A();
s.setAttribut( nyværdi ); // denne metode husker værdien, og sørger
for at opdatere visningen af A, så vi ikke skal gøre det her!


Noget i den stil. Dvs. i dit tilfælde skal du, når knappen trykkes,
skal du hælde data ind i din visnings komponent som så opdatere
visningen.

Dette er den forkortede udgave. Hvis du vil gøre det godt, skal du
følge MCV (model-controller- view ) modellen:

....Men det gider jeg ikke komme ind på her >


vh. ld


Simon... (19-10-2002)
Kommentar
Fra : Simon...


Dato : 19-10-02 14:30


> Lidt pseudo kode til at illustrere hvordan du skal gøre:

1000 tak det virker som det skal nu :)
hvis andre ville se hvordan i rigtig kode er det her mine ændringer:

============
(hoved klassen)
public void actionPerformed(ActionEvent event)
{

if (event.getSource() == punkt)
{

drawingArea.setA(1);
msg.setText("muuh");

}

=============
(den anden klasse)
public void paintComponent(Graphics page)
{
//Sørger for vi beholder værdier fra DrawArea constructoren
super.paintComponent(page);

if (a == 1)
test(page);
}

public void test(Graphics page)
{
page.setColor(Color.red);
page.drawLine(400,400,600,400);
page.setColor(Color.black);
page.drawLine(200,200,300,300);
}

public void setA(int newA)
{
a = newA;
repaint();
}
==============

mvh.Simon



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste