Knoppen verbinden.

Status
Niet open voor verdere reacties.

John91

Gebruiker
Lid geworden
18 nov 2009
Berichten
8
Hello:)

Voor school moet ik een profielwerkstuk maken. Ik heb ervoor gekozen om het systeembord te programmeren in java. Nu stuit ik echter op een probleem, ik krijg de knoppen, visueel, niet verbonden met elkaar.

Ik wil dus zoals in dit plaatje die rode lijnen zien te verkrijgen, door op twee knoppen te drukken.

screenshot_sysbord.gif


Het is dus de bedoeling dat ik dmv op twee knoppen te drukken deze met elkaar kan verbinden.

Ik zat zelf met een boolean te werken. Maar dat lukt niet echt.

Ik heb niet de broncode overgenomen omdat die al uit 625 regels bestaat en ik het nogal een rotkarwei vind om het zodanig aan te passen dat alleen de nodige dingen erin staan, dus hieronder de belangrijkste onderdelen meer even uitgetypt.

______________________________________
Boolean isGeklikt

init
isGeklikt = false;

paint
If( knop1a && knop1b isGeklikt){
g.drawLine( <de coordinaten van de knoppen> ) ;
}
else{
<geen lijn>;
}

actionPerformed
If( e.getSource() == knop1a && knop1b ) {
isGeklikt = true;
repaint();
}
 
Snel ff dit, elke knop moet een boolean isGeklikt hebben.

dus
public class Knop implements ActionListener {

Container parent;
public boolean isGeklikt = false;

public Knop(Container parent) {
this.parent = parent;
addActionListener(this);
}

actionPerformed() {
isGeklikt = true;
parent.repaint();
}
}
}

dan in je container...
paint() {
If( knop1a.isGeklikt && knop1b.isGeklikt){
g.drawLine( <de coordinaten van de knoppen> ) ;
knop1a.isGeklikt = false;
knop1b.isGeklikt = false;
}
else{
<geen lijn>;
}
 
Het is niet genoeg om bij te houden welke knoppen ingedrukt zijn. Als je vier knoppen hebt ingedrukt kan je nooit weten of de verbinding A-B, C-D of A-D, B-C moet zijn.

Je zal een lijst moeten bijhouden met de verbindingen.

Dus hebben de klasse verbinding

Code:
Class Verbinding

final JButton knop1
final JButton knop2

public Verbinding(JButton knop1, JButton knop2) {
this.knop1 = knop1;
this.knop2 = knop2;
}

public boolean isKnopInVerbinding(JButton knop) {
     return knop == knop1 || knop == knop2;
}

public tekenVerbinding(Grahics g) {
    //teken lijn.
}

Code:
Alle verbinding bewaar je in een list. en teken word nu ook heel eenvoudig:

List<Vervbinding> verbindingen = new ArrayList<Verbinding>;

paint(Graphics g) {

for (Verbinding verbinding : verbindingen) {
verbinding.tekenVerbinding();
}
}

in je actionPerformed() van je knoppen zou je nu twee dingen moeten doen, druk je op knop die al verbonden is, dan moet je de verbinding verbreken. Druk je op een nieuwe knop dan moet je deze bewaren en wachten op de tweede knop. Dan kan je pas een verbinding maken.

Code:
JButton vorigeKnop; //variable waarin de vorige knop wordt bewaard.

ActionPerformed() {
JButton knop = (JButton)  e.getSource();

//is knop al gebruikt in verbinding ? 

//gebruik een iterator om door de lijst te gaan, dan kan je verbinding gelijk verwijderen.
for (Iterator<Verbinding> iter = verbindingen.iterator(); iter.hasNext(); ) {
     verbinding v = iter.next();
     if (v.isKnopInVerbinding(knop)) {
          iter.remove();
          repaint();
          return;   //we zijn klaar
     }
}


if (vorigeKnop == null) {  //dit is de eerste knop die we indrukken
     vorigeKnop = knop; 
     return;  
}
if (vorigeKnop == knop) {   //huidige knop is vorige knop, dus geen verbinding
       vorigeKnop = null;
       return;
}
//we hebben een nieuwe verbinding;
verbindingen.add(new Verbinding(vorigeKnop, knop));
repaint();
vorigeKnop == null;

ps code heb ik niet test zullen vast nog wel fouten in zitten...:)
 
Bedankt voor de reactie, alleen snap ik dat met JButton niet echt.

Ik ben best een leek op dit gebied, moet dus nog een hoop leren:)

Maargoed wat houd dat Jbutton precies in? Ik heb het al eens eerder gezien toen ik ronde knoppen wilde maken, dat snapte ik niet dus daar ben ik maar vanaf gestapt..
Maar nu wordt het weer genoemd dus dan is het blijkbaar wel een belangrijke optie..

Dus zou je dat even nader willen toelichten?:$

En wat bedoel je precies met die lijst die gemaakt moet worden?

Alvast bedankt
 
JButton is standaard knop zoals je vaak ziet in een programma. De eenvoudigste manier om een knop aan te maken is met JButton knop = new JButton("tekst");

De knop zelf is nu nog niet zichtbaar je moet deze toevoegen venster. (JFrame & JPanel ;))

Als je wilt weten of je knop is ingedrukt zal je een ActionListener aan je knop moeten toevoegen.

Code:
JButton knop = new JButton("knop");  // nieuwe knop
KnopListener knopListener = new KnopListener();  // nieuwe knoplistener
knop.addActionListener(knopListener); //toevoegen van je knoplistener aan je knop.

public class KnopListener implements ActionListener {

public void actionPerformed(ActionEvent e) {
       //hier je knop ingedrukt code. 
}

//je kan dit alles ook korter schrijven door:

JButton knop = new JButton("knop");
knop.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
       //hier je knop ingedrukt code. 
}});

Als je geen standaard (ronde) knop wil maar iets anders dan kan zou je een eigen "JButton" moeten schrijven..

een goede uitleg van knoppen en checkboxen ed. staat hier: http://java.sun.com/docs/books/tutorial/uiswing/components/button.html

Je ziet soms ook nog wel eens de klasse Button (dus zonder J), dit de oude manier van Java om knoppen te tekenen, deze zou ik niet meer gebruiken..
dus gebruik altijd de "J" variant dus JButton, JCheckBox, JMenu, JPanel, JFrame ed...



succes,
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan