Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Programmeren

Java programma van AWT naar Swing

human printer
14 antwoorden
  • Hoi,

    om mijn proggies op iedere computer te laten werken, ongeacht het operating system. Wil ik graag mijn programmaatjes omzetten van AWT package naar de Swing package.
    Dit wil nog niet zo lukken. Op internet heb ik ook nog geen voorbeelden kunnen vinden die het echt zonder AWT doen.
    Weet iemand hoe ik simpel programma's omzet van AWT naar Swing?
    En hoe de BorderLayout te vervangen is?

    en nog bedankt voor alle hints en tips….

    Bij voorbaat dank.

    Greetings,

    ErX.
  • Het is al weer even geleden dat ik serieus met Java heb gewerkt, maar je kunt toch gewoon alle AWT componenten vervangen door Swing componenten? (Dus Button wordt JButton enz).

    Wat betreft de Border Layout, daar heb ik zo even geen antwoord op. Als ik nog een antwoord bedenk/tegen kom, dan post ik hem hier als nog wel even.
  • ik heb dat ook ooit gedaan en wel als volgt:
    1) zoals [i:bacc350d07]human printer[/i:bacc350d07] al zei, alle AWTcomponenten vervangen door Swing.
    2) gewoonlijk voeg je met this.add(component) een button toe aan het scherm. Nu moet dat als volgt:
    Container c = this.getContentPane();
    c.setLayout(new BorderLayout());
    c.add(component)

    Je hebt AWT dus nog wel nodig (voor Container en BorderLayout - of elke andere layout), maar je zet er geen dingen van op het scherm. Volgens mij werkt het dan nog steeds op elk OS.
  • Hoi,
    hartelijk dank voor de tips zover.
    Dit heeft me al een eindje op weg geholpen.
    Nu zit ik nog met de 'paint' functie. Volgens mij gebruikt ie die nog van AWT. Ik moet namelijk met de muis over de applicatie bewegen om de knoppen te laten zien. Hoe krijg ik dit nog opgelost?

    Bij voorbaat dank.

    Greetings,

    ErX.
  • gebruik een paintcomponent:

    public void paintComponent(Graphics g) {

    super.paintComponent(g);

  • ik ben niet bekend met deze methode. Wat ik altijd doe is een aparte klasse [i:257e6d9ccf]Canvas[/i:257e6d9ccf] ofzo aanmaken, extends JPanel. Die bevat de paint()-methode. Het tekenen gebeurt dan geheel via die aparte klasse.
    De hoofdapplicatie heeft dan een variabele [i:257e6d9ccf]canvas[/i:257e6d9ccf] van het type [i:257e6d9ccf]Canvas[/i:257e6d9ccf] die je toevoegt met container.add()
    als je wil repainten vanuit de applic kan dat dan met canvas.repaint()
    Hoop dat het zo duidelijk is.
  • Nou het is al bijna helemaal gelukt. Behalve dan het painten.
    Dit is zo ongeveer het resultaat:
    [img:f809f25f92]http://photos.egnie.nl/calc.jpg[/img:f809f25f92]

    De knoppen links boven worden wel getoond, maar werken niet. Gelukkig maar. Maar hoe krijg ik deze nu weg.
    De rest van de applicatie werkt overigens wel prima.

    Al vast bedankt.

    Greetings,

    ErX.
  • ik kan zo niet zeggen wat er mis is. Je moet wat code (alleen de relevante delen) plaatsen.
  • Het zijn 8 verschillende classes, dus ik weet niet precies wat ik dan wel en niet moet sturen.

    Maar ik maak gebruik van: paintComponents(g). Wanneer ik dit niet deed, moest ik met de muis over de applicatie bewegen en kwamen de knoppen één voor één te voorschijn.
    Als ik voor paintComponents(g) de methode paintComponent(g) gebruik, dan is het deel onder de display (op de hoogte van de witte balk) wel schoon van virtuele knoppen.

    Greetings,

    ErX.
  • ik ben niet bekend met die methode. Misschien kan januz je hier verder helpen. Ik zie nu trouwens dat mijn oplossing helemaal niet hierop van toepassing is omdat je niet ook nog eens tekent.

    En 8 klassen :o Het ziet er uit dat je een rekenmachine maakt. Volgens mij moet je met 3 klassen dan echt wel klaar zijn, kan zelfs in 1 klasse. Als je iets wil posten, post dan de code waarin de elementen op het scherm worden geplaatst en wat er gebeurt als ergens op geklikt wordt. De rest (het rekengedeelte, …) hoeft niet
  • ik begrijp niet helemaal waarom je een paintComponent gebruikt. dat is toch helemaal niet nodig als je alleen maar wat buttons en een textfield gebruikt?
  • inderdaad. Er gaat iets anders mis. Ik denk dat het ergens in het begin fout zit.

    Even heel snel hoe je de boel op zou 'moeten' bouwen:
    [code:1:ed9303f706]import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;

    public class Test extends JApplet implements ActionListener {

    private static final long serialVersionUID = 1004610918617847546L;
    JButton b1, b2, b3;
    JTextField t;

    public void init() {
    Container c = this.getContentPane();
    c.setLayout(new BorderLayout());
    c.add(maakPanel(), BorderLayout.SOUTH);

    t = new JTextField();
    c.add(t, BorderLayout.NORTH);
    }

    public Panel maakPanel() {
    Panel panel = new Panel();
    panel.setLayout(new GridLayout(1,3));

    b1 = new JButton("1");
    b1.addActionListener(this);
    panel.add(b1);

    b2 = new JButton("2");
    b2.addActionListener(this);
    panel.add(b2);

    b3 = new JButton("3");
    b3.addActionListener(this);
    panel.add(b3);

    return panel;
    }

    public void actionPerformed(ActionEvent e) {
    JButton source = (JButton)e.getSource();
    if (source == b1)
    t.setText("vier");
    else t.setText(source.getText());
    }
    }[/code:1:ed9303f706]
    Ik denk dat je het plaatsen van de buttons in een paint-methode herhaalt ofzo, dan gaat het mis. Buttons hoeven maar eenmaal worden geplaatst, dus in de init() - of bij een Applic: de constructor

    Als je er niet uitkomt, plaats dan toch eens wat code. We kunnen je zo niet verder helpen.
  • Ik kreeg van mijn docent (alsnog) een antwoord. Het blijkt dat ik de verkeerde methode overridden heb. Ik heb namelijk in iedere klasse de paint() overridden in plaats van de paintComponent(). Ik moet dus de paintComponent() gebruiken en niet de paint().
    Antwoord van de docent:
    [quote:13d70321b8]Gebruik paintComponent i.p.v. paint().

    Java Notes:

    You sometimes see code that overrides paint() instead of paintComponent().
    This was necessary in the older AWT, however in Swing paint() calls three methods: paintComponent(), paintBorder(), and paintChildren.
    The general rule is to override paintComponent() if you're using Swing (JComponent, JPanel, JApplet) and paint() if you're using one of the AWT classes (Applet, Canvas).
    [/quote:13d70321b8]

    Ik laat nog wel weten of het nu wel gelukt is….

    Greetings,

    ErX
  • en het is gelukt. paintComponent() overriden en het werkt.
    Zie hier het resultaat:

    [img:4c3d4ccd82]http://photos.egnie.nl/calcwerkt.jpg[/img:4c3d4ccd82]

    Waarbij het eerste JTextField aangeeft of het geheugen gebruikt wordt, ja of nee. Ik weet alleen niet waarom daar juist de cursor ingezet wordt. Maar ja, de rest doet het prima.

    En nog bedankt voor alle hints en tips……

    Greetings,

    ErX.

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.