Avatar billede marianneoginga Nybegynder
14. december 2002 - 15:57 Der er 6 kommentarer

kontrol af GUI frames

for at få et godt design, vil jeg have en kontrolklasse, der styrer de GUI'er jeg har. Har nogen eksempler på fx. hvordan koden ser ud, hvis en GUI skal åbne en anden??(via kontrolklassen)
Avatar billede abpdk Nybegynder
14. december 2002 - 18:35 #1
Jeg kan ha' misforstået dig, men hvis du har en GUI-klasse med en constructor metode alla:

public klassenavn() {
  setSize(250,250);
  setTitle("klassetitel");
  setVisible(true);
}

så bliver den automatisk åbnet når du i kontrol-klassen skriver:
klassenavn GUI = new klassenavn();
Avatar billede marianneoginga Nybegynder
14. december 2002 - 18:55 #2
det er ikke lige det jeg er ude efter!men tak
hvis du har fx 3 gui'er og ved at trykke på en button i gui1 skal gui2 åbnes.
men det skal forgå via en fx handler-klasse, der styrer gui'erne
Avatar billede abpdk Nybegynder
14. december 2002 - 19:36 #3
Ok. Hvis du bare har et par vinduet kan dette gøre ret nemt. Jeg har lavet et lille eksempel:

--- run.java ---
public class run {
    public static void main(String[] args) {
    handler h = new handler();
    }
}
--------------

--- handler.java ---
public class handler {

    gui1 g1;
    gui2 g2 = null;

    public handler() {
    g1 = new gui1(this);
    g2 = new gui2();
    }
   

    public void openGUI2() {
    if (g2 != null) {
        g2.open();
    }
    }
}
--------------

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


public class gui1 extends JFrame implements MouseListener {

    handler h;

    public gui1(handler hand) {
    h = hand;
   
    setSize(250,250);
    setTitle("gui1");
    setVisible(true);
    addMouseListener(this);
    }

    public void mouseClicked(MouseEvent e) {
    h.openGUI2();
    }

    public void mousePressed(MouseEvent e) {}
    public void mouseReleased(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
}
--------------

--- gui2.java ---
import java.awt.*;
import javax.swing.*;

public class gui2 extends JFrame {

    public gui2() {
    setSize(250,250);
    setTitle("gui2");
    }

    public void open() {
    setVisible(true);
    }
}
--------------

Er det noget i den retning?
Avatar billede r9 Nybegynder
14. december 2002 - 19:53 #4
Du kan jo lave en controller klasser som modtager alle events, og bestemmer hvad du skal gøre.

Herunder er 2 klasser, som viser et simpelt eksempel:


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

class Gui extends JFrame {

  public Gui( String title) {
    super( title );

    getContentPane().setLayout( new GridLayout( 2, 1 ) );

    JPanel numbers = new JPanel();
    numbers.setLayout( new FlowLayout() );

    JPanel buttons = new JPanel();
    buttons.setLayout( new FlowLayout() );

    JButton knap1 = new JButton("knap1");
    knap1.setActionCommand("knap1");
    new Controller(knap1);
    buttons.add(knap1);

    JButton knap2 = new JButton("knap2");
    knap2.setActionCommand("knap2");
    new Controller(knap2);
    buttons.add(knap2);

    getContentPane().add( numbers );
    getContentPane().add( buttons );

    addWindowListener( new ApplicationTerminator() );

    pack();
    setVisible( true );
  }
}

class ApplicationTerminator extends WindowAdapter {

  public void windowClosing( WindowEvent e ) {
    System.exit(0);
  }
}






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

public class Controller implements ActionListener {

  protected JButton button;

  public Controller( JButton button) {
    this.button = button;
    button.addActionListener(this);
  }

    public void actionPerformed( ActionEvent e ) {
        if (e.getActionCommand().equalsIgnoreCase("knap1")){
            System.out.println("Du har trykker på knap1");

        }
        else if (e.getActionCommand().equalsIgnoreCase("knap2")){
            System.out.println("Du har trykker på knap2");

        }


    }




}
Avatar billede viht Nybegynder
16. december 2002 - 01:23 #5
En anden god ide er at lade dine gui klasser være Singletons og så bare kalde dem statisk fra din styreklasse.

Eksempel:

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

public class TestFrame extends JFrame {
   
private static TestFrame instance = null;

private Container contentPane;

private JTextArea area;

    protected TestFrame() {
       
        contentPane = getContentPane();
        setTitle("test");
        setSize(300,300);
        area = new JTextArea();
        area.setEditable(false);
        contentPane.add(area, BorderLayout.CENTER);
    }
   
    public static TestFrame getInstance() {
       
        if( instance == null )
          instance = new TestFrame();
        return instance;
    }
   
    public void setText(String text) {
        area.append(text+"\n");
    }
}

class Test {
   
    public static void main(String[] args) {
        TestFrame.getInstance().show();
       
        for( int i = 0; i < 3; i++ ) {
            try { Thread.sleep(1000); } catch( InterruptedException ie ) { System.out.println (ie); }
            TestFrame.getInstance().setText(""+i);
        }
    }
   
}
Avatar billede viht Nybegynder
16. december 2002 - 01:24 #6
Singletons er perfekte til at holde koblingen lav.. det er essentielt i godt design. Jeg bruger selv Singletons i stor stil når jeg laver gui.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester