ActionListener in een applet met JComponent

Status
Niet open voor verdere reacties.

Clemens Schalkw

Gebruiker
Lid geworden
5 dec 2007
Berichten
166
Volgens mij heb ik eerder ook al vragen gesteld naar aanleiding van het maken van een applet, maar ik ben volgens mij inmiddels een stuk verder.
Ik heb de lay-out helemaal klaar, maar ActionListeners werken ook, maar alleen in de compiler en niet in de Applet zelf.

Hoe kan ik ervoor zorgen dat bij het klikken op een knop (zie regel 173) een actie wordt uitgevoerd en wordt getoond in mijn JPanel?
Ik heb het geprobeerd, zoals te zien is, met repaint() en met validate(), maar beide lijken het niet goed te doen.
Wat doe ik fout?????

Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;

public class Kreta extends JApplet
{

  protected static final long serialVersionUID = 1;

  JPanel                      headerPanel;
  JPanel                      rightPanel;
  JPanel                      footerPanel;
  JPanel                      leftPanel;
  JPanel                      centerPanel;

  /*
   * Include the JButtons which will be used in the applet.
   * 
   * @addButton @newButton @deleteButton @editButton
   */

  JButton                     addButton;
  JButton                     newButton;
  JButton                     deleteButton;
  JButton                     editButton;

  /*
   * One JList will be added to the applet to list all dishes added to the database
   * 
   * @dishesList
   */

  JList                       dishesList;

  /*
   * Three JTextFields will be added to the applet to split name, dish & price to the database @ name @ dish @ price
   */

  JTextField                  name;
  JTextField                  dish;
  JTextField                  price;

  /*
   * Two JTextArea's are added to the applet to show the ingredients and the recipe of a dish @ recipe @ ingredients
   */

  JTextArea                   recipe;
  JTextArea                   ingredients;

  /*
   * JLabels will be added to the textfields and textarea's
   */

  JLabel                      nameTextField;
  JLabel                      dishTextField;
  JLabel                      priceTextField;

  JLabel                      recipeTextArea;
  JLabel                      ingredientsTextArea;

  @Override
  public void init()
  {

    addButton = new JButton("Voeg Toe");
    newButton = new JButton("Nieuw");
    deleteButton = new JButton("Verwijder");
    editButton = new JButton("Bewerk");

    String[] dishes = { "gerecht 1", "gerecht 2", "gerecht 3", "gerecht 4", "gerecht 5", "gerecht 6", "gerecht 7",
        "gerecht 8", "gerecht 9", "gerecht 10" };

    dishesList = new JList(dishes);

    name = new JTextField(12);
    nameTextField = new JLabel();
    nameTextField.setText("naam");

    dish = new JTextField(12);
    dishTextField = new JLabel();
    dishTextField.setText("gerecht");

    price = new JTextField(5);
    priceTextField = new JLabel();
    priceTextField.setText("prijs €");

    recipe = new JTextArea(10, 20);
    recipeTextArea = new JLabel();
    recipeTextArea.setText("recept");

    ingredients = new JTextArea(10, 10);
    ingredientsTextArea = new JLabel();
    ingredientsTextArea.setText("ingrediënten");

    /*
     * Make different Jpanels for each boxLayout-region @ headerPanel @ rightPanel @ footerPanel @ leftPanel @
     * centerPanel
     */

    JPanel headerPanel = new JPanel();
    JPanel rightPanel = new JPanel();
    JPanel footerPanel = new JPanel();
    JPanel leftPanel = new JPanel();
    JPanel centerPanel = new JPanel();

    headerPanel.setBackground(Color.red);
    rightPanel.setBackground(Color.red);
    footerPanel.setBackground(Color.red);
    leftPanel.setBackground(Color.red);
    centerPanel.setBackground(Color.blue);

    JScrollPane recipeScroller = new JScrollPane(recipe);
    JScrollPane ingredientsScroller = new JScrollPane(ingredients);

    recipe.setLineWrap(true);
    ingredients.setLineWrap(true);

    recipeScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    recipeScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

    ingredientsScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    ingredientsScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

    headerPanel.add(addButton);
    headerPanel.add(newButton);
    headerPanel.add(deleteButton);
    headerPanel.add(editButton);

    //   werkt in compiler, niet in applet
    addButton.addActionListener(new addAction());
    newButton.addActionListener(new newAction());
    deleteButton.addActionListener(new deleteAction());
    editButton.addActionListener(new editAction());

    leftPanel.add(dishesList);

    footerPanel.add(nameTextField);
    footerPanel.add(name);
    footerPanel.add(dishTextField);
    footerPanel.add(dish);
    footerPanel.add(priceTextField);
    footerPanel.add(price);

    centerPanel.add(ingredientsScroller);
    centerPanel.add(ingredientsTextArea);
    centerPanel.add(ingredients);
    centerPanel.add(recipeScroller);
    centerPanel.add(recipeTextArea);
    centerPanel.add(recipe);

    getContentPane().add(BorderLayout.NORTH, headerPanel);
    getContentPane().add(BorderLayout.EAST, rightPanel);
    getContentPane().add(BorderLayout.SOUTH, footerPanel);
    getContentPane().add(BorderLayout.WEST, leftPanel);
    getContentPane().add(BorderLayout.CENTER, centerPanel);

    this.setSize(600, 600);
    setVisible(true);

  } // close init-method

  class addAction implements ActionListener
  {
    JTextField vak       = new JTextField(20);
    String     mijnTekst = "Hello World";

    public void actionPerformed(ActionEvent e)
    {
      vak.getText();
      centerPanel.add(vak);
      centerPanel.repaint();
    }
  }

  class newAction implements ActionListener
  {
    public void actionPerformed(ActionEvent e)
    {
      System.out.println("nieuw button");
    }
  }

  class editAction implements ActionListener
  {
    public void actionPerformed(ActionEvent e)
    {
      System.out.println("wijzig button");
    }
  }

  class deleteAction implements ActionListener
  {
    public void actionPerformed(ActionEvent e)
    {
      System.out.println("Verwijder button");
    }
  }

  @Override
  public void start()
  {

  } // close start-method
} // close applet
 
Laatst bewerkt:
Als je dit doet:

Code:
        addButton.addActionListener(new addAction(centerPanel));

    class addAction implements ActionListener {
        
        String     mijnTekst = "Hello World";
        JTextField vak       = new JTextField(20);
        JPanel _paneel;
        
        public void actionPerformed(ActionEvent e) {

            vak.getText();
            _paneel.add(vak);
            _paneel.repaint();
        }
        public addAction(JPanel paneel){
            _paneel = paneel;
        }
    }

Dan krijg je iig geen nullpointer exception meer als je op de knop drukt.
 
Nee, dat klopt. Ik krijg geen exception meer. Ik krijg nu helemaal niks meer :D.
Er lijkt iig niks te gebeuren.
Maar nu staat centerPanel als parameter voor new addAction(), is dit dan de defaultwaarde of hoe moet ik dit zien ?
Moet ik niet eerst de "waarde" uit centerPanel halen en deze dan met repaint() overschrijven?
Zo ja, hoe doe ik dit dan?
 
Wat je doet is je maakt een nieuwe class aan en je geeft de class een parameter mee.
Vervolgens zet je in de contructor van de class de parameter in een globale variabele

Op zo'n manier heb je een pointer naar het panel wat in een andere class zit en kan je dingen daar op aanpassen.
Dus als je dan een repaint() aanroept op het panel, dan roep je eigenlijk de repaint van het originele panel aan welke eigenlijk in de andere class staat.
 
Laatst bewerkt:
Ja ok, dat begrijp ik. Bedankt voor deze uitleg.
Kun je me ook vertellen waarom het JPanel repaint() niet lijkt te doen ?
Mis ik nog iets of ..... ?
 
Het vak werd niet toegevoegd omdat je deze geen bounds had gegeven.

Code:
    class addAction implements ActionListener {
        
        String     mijnTekst = "Hello World";
        JPanel _paneel;
        
        public void actionPerformed(ActionEvent e) {
            JTextField vak       = new JTextField("test",20);
            [COLOR="Red"]vak.setBounds(20, 20, 50, 25);[/COLOR]
            vak.getText();
            _paneel.add(vak);
            _paneel.repaint();
        }
        public addAction(JPanel paneel){
            _paneel = paneel;
        }
    }

Als je dat doet, dan voegt hij deze wel toe :)
 
:s ja idd, stom zeg. Bedankt ook hiervoor :P.
Maagoed, dit werkt. Nu wordt het paneel nog niet leeg gemaakt.
Ik ben al aan het zoeken naar remove of clear methods, maar kom er niet helemaal uit.
Ik heb het geprobeerd met _paneel.add(vak).validate(); , ook heb ik het geprobeerd met centerPanel.remove(component).
Het gaat er dus om dat de default Panel wordt overschreven (of leeg gemaakt).
 
Bedoel je dat je het vak er weer af wil hebben?

Dat kan met een _panel.remove(vak);

Of echt dat er op de hele panel niets meer komt te staan?
 
Nee, het gaat er om dat ik de content moet kunnen verversen door op een knop te klikken.
Er staat een standaard content in mijn centerPanel, dit moet zeg maar de default zijn als de applet start en als ik op de knop Home (moet nog gemaakt worden) klik.
Als ik op een andere knop klik, dus bijvoorbeeld addAction, moet de content leeg gemaakt worden en worden vervangen door, in dit geval de JTextArea, of iets anders dat ik dus declareer.
Eigenlijk moet ik dus in elke ActionListener een nieuw content kunnen maken, als het kan zonder de achtergrond te wijzigen.
 
Wat je dan zou kunnen doen is een aantal classes maken die JPanel extenden.
Deze dan om de beurt in het 'centerpanel' laden naar gelang de knop welke ingedrukt wordt.
 
Is het niet zo dat omdat Kreta al Japplet extend dat die automatisch in de inner-classes zit waarin de buttons (onder andere) een ActionListener krijgen?
Als ik centerPanel als default kan gebruiken zonder content, dan kan ik misschien een class makeGui() maken waarin de content van de default-pagina staat en dan in elke class met ActionHandler een nieuw JPanel maken voor de daarbij behorende content.
Ben ik nu heel erg moeilijk aan het denken (ik denk dat het wel makkelijker moet kunnen toch ?).


[EDIT]
Is het misschien een idee om het helemaal anders op te gaan zetten?
Ik denk dan aan onderstaande:

Code:
public class KretaApplet extends JApplet {
    // instance variabelen, dus onder andere alle JComponents

    public class createGui {
        // Hier de layout zoals die er in basic moet uitzien, dus zonder componenten en content
    }

    public void init() {
        new createGui();
    }

    public void start() {
         // verder alle componenten die in de default-pagina moeten staan.
    }

    public void stop() {
        // waar stop voor bedoeld is
    }

    public void destroy() {
        // waar destroy voor bedoeld is
    }
}

Zou ik hier een paint(Graphics g) method bij kunnen/moeten gebruiken ?
 
Laatst bewerkt:
Ik ben inmiddels weer ween stap verder.
Ik heb mijn class iets anders opgezet.
Om mijn centerPanel leeg te maken gebruik ik de method removeAll().
Verder heb ik de functie paint(Graphics g) toegevoegd.

De volgende stap is het maken van een connectie met de database. Ik heb op mijn Linux server JDBC laten toevoegen. Dit is gedaan. Nu weet ik alleen nog niet hoe ik deze kan benaderen.
JDBC staat in de root-map van de server, het lijkt mij dat je dit ongeveer hetzelfde moet kunnen benaderen als met php (hier ben ik meer bekend mee).
Weet iemand hier toevallig meer over?

Voor de liefhebbers zal ik de code hieronder plaatsen. Ik hoop dat anderen er ook iets aan hebben.

Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;

public class Kreta extends JApplet
{

  protected static final long serialVersionUID    = 1;

  JPanel                      headerPanel         = new JPanel();
  JPanel                      rightPanel          = new JPanel();
  JPanel                      footerPanel         = new JPanel();
  JPanel                      leftPanel           = new JPanel();
  JPanel                      centerPanel         = new JPanel();

  /*
   * Include the JButtons which will be used in the applet.
   * 
   * @addButton @newButton @deleteButton @editButton
   */

  JButton                     addButton           = new JButton("Voeg Toe");
  JButton                     newButton           = new JButton("Nieuw");
  JButton                     deleteButton        = new JButton("Verwijder");
  JButton                     editButton          = new JButton("Bewerk");

  /*
   * One JList will be added to the applet to list all dishes added to the database
   * 
   * @dishesList
   */

  /*
   * Three JTextFields will be added to the applet to split name, dish & price to the database @ name @ dish @ price
   */

  JTextField                  name                = new JTextField(12);
  JTextField                  dish                = new JTextField(12);
  JTextField                  price               = new JTextField(5);

  /*
   * Two JTextArea's are added to the applet to show the ingredients and the recipe of a dish @ recipe @ ingredients
   */

  JTextArea                   recipe              = new JTextArea(10, 20);
  JTextArea                   ingredients         = new JTextArea(10, 10);

  /*
   * JLabels will be added to the textfields and textarea's
   */

  JLabel                      nameTextField       = new JLabel();
  JLabel                      dishTextField       = new JLabel();
  JLabel                      priceTextField      = new JLabel();

  JLabel                      recipeTextArea      = new JLabel();
  JLabel                      ingredientsTextArea = new JLabel();

  JScrollPane                 recipeScroller      = new JScrollPane(recipe);
  JScrollPane                 ingredientsScroller = new JScrollPane(ingredients);

  @Override
  public void init()
  {

    String[] dishes = { "gerecht 1", "gerecht 2", "gerecht 3", "gerecht 4", "gerecht 5", "gerecht 6", "gerecht 7",
        "gerecht 8", "gerecht 9", "gerecht 10" };

    JList dishesList = new JList(dishes);

    headerPanel.add(addButton);
    headerPanel.add(newButton);
    headerPanel.add(deleteButton);
    headerPanel.add(editButton);

    addButton.addActionListener(new addAction());
    newButton.addActionListener(new newAction());
    deleteButton.addActionListener(new deleteAction());
    editButton.addActionListener(new editAction());

    leftPanel.add(dishesList);

    footerPanel.add(nameTextField);
    footerPanel.add(name);
    footerPanel.add(dishTextField);
    footerPanel.add(dish);
    footerPanel.add(priceTextField);
    footerPanel.add(price);

    centerPanel.add(ingredientsScroller);
    centerPanel.add(recipeScroller);
    centerPanel.add(recipeTextArea);
    centerPanel.add(recipe);
    centerPanel.add(ingredientsTextArea);
    centerPanel.add(ingredients);

    getContentPane().add(BorderLayout.NORTH, headerPanel);
    getContentPane().add(BorderLayout.EAST, rightPanel);
    getContentPane().add(BorderLayout.SOUTH, footerPanel);
    getContentPane().add(BorderLayout.WEST, leftPanel);
    getContentPane().add(BorderLayout.CENTER, centerPanel);

    this.setSize(600, 600);
    setVisible(true);

  } // close init-method

  @Override
  public void paint(Graphics g)
  {
    headerPanel.setBackground(Color.red);
    rightPanel.setBackground(Color.red);
    footerPanel.setBackground(Color.red);
    leftPanel.setBackground(Color.red);
    centerPanel.setBackground(Color.blue);

    nameTextField.setText("naam");
    dishTextField.setText("gerecht");
    priceTextField.setText("prijs €");
    recipeTextArea.setText("recept");
    ingredientsTextArea.setText("ingrediënten");

    recipe.setLineWrap(true);
    ingredients.setLineWrap(true);

    recipeScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    recipeScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

    ingredientsScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    ingredientsScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
  } // close paint-method

  @Override
  public void start()
  {

  } // close start-method

  @Override
  public void stop()
  {

  } // close stop-method

  @Override
  public void destroy()
  {

  } // close destroy-method

  class addAction implements ActionListener
  {
    public void actionPerformed(ActionEvent e)
    {
      centerPanel.removeAll();
      centerPanel.setBackground(Color.red);
      doLayout();
      //repaint();
    }
  } //close addAction

  class newAction implements ActionListener
  {
    public void actionPerformed(ActionEvent e)
    {
      System.out.println("nieuw button");
    }
  } // close class newAction

  class editAction implements ActionListener
  {
    public void actionPerformed(ActionEvent e)
    {
      System.out.println("wijzig button");
    }
  } // close class editAction

  class deleteAction implements ActionListener
  {
    public void actionPerformed(ActionEvent e)
    {
      System.out.println("Verwijder button");
    }
  } // close class deleteAction
} // close applet
 
Bedankt voor de informatie.
Ik heb het gelezen, maar er stond niet zo heel veel nieuws voor me in.
Waar het mij om gaat is dat ik niet weet of alles op de server zo gekoppeld is dat ik de driver ook echt kan benaderen.
Ik hoopte dat daar een simpele test voor zou zijn.
Ik weet wel waar de file staat
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan