Swing Button über Canvas


  • 360Boarder
  • 1219 Aufrufe 6 Antworten
  • Swing Button über Canvas

    Hi Leute

    Ich hab da ein Problem bei einem Programm...

    Ich habe einen Canvas erstellt und dann ein gif geladen, ich will es als Hintergrund benutzen und einen Button drüber legen. Dem Button will ich ein Icon hinzufügen deshalb mach ichs mit swing doch irgenwie funktioniert das nicht, wenn ich das Programm starte werden die Buttons nicht angezeigt. Mit "normalen" Buttons funktionierts.

    Hat jemand einen Vorschlag für mich?

    lg.Boarder

    [FONT="Century Gothic"]"...erst wollte ich was über deine dürren Ärmchen sagen, doch dann fiel mir deine hässliche Fresse auf..." (Gothic 1 ist Kult)[/FONT]
  • Hi,

    den ersten Vorschlag, den Dir jetzt geben kann ist mal deinen Source zu posten. Welche Frage mir jetzt noch spontan einfallen wuerde ist, warum du mit Canvas arbeitest?


    gruss tuney
    [FONT="Arial Black"]
    os:[SIZE="1"]linux slackware 10.0[/SIZE]
    machine:[SIZE="1"]intel core dual 3.6GHz[/SIZE]
    [/FONT]
  • Ich verwende Canvas weil ich nichts anderes kenne...

    Hier mal der Code (hab die ganzen "Listener" Methoden rausgenommen)

    CODE]//START// Imports

    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import java.io.*;
    import java.awt.FileDialog;
    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.InputStreamReader;
    import java.lang.String;
    import java.io.FileReader;
    import java.awt.print.*;
    import java.applet.*;
    import java.awt.event.MouseEvent.*;
    import java.awt.image.*;
    import javax.swing.*;
    import java.awt.MediaTracker.*;
    import javax.swing.colorchooser.*;
    import javax.swing.border.LineBorder;
    import javax.swing.border.TitledBorder;

    //ENDE// Imports


    //START////////////
    //Class: Game //
    ///////////////////
    public class Game extends Frame implements WindowListener, ActionListener,
    Runnable {

    //START//Deklarationen der verwendeten Variablen
    Image Menuebild;
    MyCanvas canv = new MyCanvas();
    Toolkit toolkit = Toolkit.getDefaultToolkit();


    ImageIcon icon1 = new ImageIcon("Start.jpg");
    javax.swing.JButton b1 = new JButton(icon1);

    //ENDE//Deklarationen der verwendeten Variablen

    public static void main(String[] args) {
    Game a = new Game();
    }

    //START// GAME
    public Game() {
    //Game Name
    super("Das Spiel");

    //START// Fenster Einstellungen
    this.addWindowListener(this);
    this.setLayout(null);
    this.setResizable(false);
    this.setBounds(150, 50, 500, 450);
    this.setBackground(Color.white);
    this.setVisible(true);
    //ENDE// Fenster Einstellungen

    //START// Button: Neues Spiel
    b1.setBackground(Color.LIGHT_GRAY);
    b1.addActionListener(this);
    b1.setBounds(375, 275, 100, 35);
    this.add(b1);
    //ENDE// Button: Neues Spiel


    //START// Canvas deklarationen
    this.add(canv);
    canv.setSize(500, 450);
    canv.setLocation(0, 0);
    canv.addKeyListener(canv);
    canv.addMouseListener(canv);
    //ENDE// Canvas deklarationen

    this.setVisible(true);
    }

    //EDNE// Game


    //START////////////
    //Class: MyCanvas//
    ///////////////////
    class MyCanvas extends Canvas implements MouseMotionListener, MouseListener,
    KeyListener {

    //START// paint
    public void paint(Graphics g) {

    //START// Menübild zeichnen
    Menuebild = toolkit.getImage("Titelbild.gif");
    if (start == 0) {
    System.out.println("Zeichne Titelbild");
    if (Menuebild != null) {
    g.drawImage(Menuebild, 0, 22, this);
    }
    }
    //ENDE// Menübild zeichnen

    }
    //ENDE// paint
    }
    //ENDE////////////
    //Class: MyCanvas//
    ///////////////////

    }
    //ENDE////////////
    //Class: Game//
    ///////////////////
    [/CODE]

    [FONT="Century Gothic"]"...erst wollte ich was über deine dürren Ärmchen sagen, doch dann fiel mir deine hässliche Fresse auf..." (Gothic 1 ist Kult)[/FONT]
  • hi,

    sry hab es gestern nicht mehr geschafft on zu kommen. also so wie ich das sehe verwendest du in deinem programm swing, awt und swt. das is natürlich reichlich und auch nicht unbedingt notwendig. swt is ein etwas aelteres paket um eine benutzeroberflaeche zu erstellen (bsp. eclipse wurde in swt erstellt). vorteil von dem swt is eben das es auch allen systemen gleich aussieht, weil es eben native ist. die klasse die du aus swt verwendest, ist die canvas. musste mich erstmal wieder einlesen in das thema. aber canvas sind fast gleichbedeutend mit panels (awt) oder den jpanels (swing). von der leistung her sind swt und swing gleich auf und es macht auch keinen grossen unterschied, allerdings werden sie soweit ich weiss, kaum noch eingesetzt.

    awt verwendest du u.a. mit der klasse toolkit, die dir das bild importiert. konnte den teil leider nicht testen, weil ich grade kein z. h. hatte. zu guter letzt ist dein jbutton aus dem paket swing. grundsaetzlich kann man sagen du haettest bei deinem programm auf swt komplett verzichten koennen und das programm nur mit awt und swing programmieren koennen und dir sehr, sehr viel arbeit ersparen koennen.

    hab das programm im wesentlichen nicht veraendert, sondern einfach nur nachgeschaut an was das liegen koennte. dein jbutton wird dargestellt genauso wie dein canvas. allerdings wird dein button vom canvas verdeckt. hab als erstes versucht mit layout managern eine gewisse positionierung zu erreichen aber da du ja mittels

    Quellcode

    1. this.setLayout(null);

    alle layout manager abschaltest, wird das nicht viel bringen. dein button und dein canvas positionierst du mittels setbound, das auch nur dann sinn macht wenn man den lay.man. abgeschaltet hat.
    den auruf der methode

    Quellcode

    1. this.setVisible(true);
    taetigst du an dem falschen platz, die methode blockiert den aufbau des fensters d.h. an dieser stelle wird angehalten um das fenster staendig anzeigen zu koennen, aus diesem grund solltest du die methode nach allen initialisierungsoperationen
    aufrufen.

    zu gute letzt die groesse von deinem canvas das zum schluss auch den button verdeckt

    Quellcode

    1. canv.setSize(500, 450);
    . die groesse ist etwas zu gross und sollte kleiner gewaehlt werden. hab dem canvas mal eine andere hintergrundfarbe gegeben, damit man besser sehen kann wie und wo der entlang laeuft. du musst einfach nur die auskommentiert methode aktivieren.

    dein programm ist im allg. sehr sehr unstrukturiert. kann dir nur das openbook vom ullenboom empfehlen, da steht alles gut erklaert drin. wenn du mal sehen moechtest wie das programm mit panels aussieht dann schreib einfach.

    hier der source:

    Quellcode

    1. public class Game extends Frame implements WindowListener, ActionListener,Runnable {
    2. private static final long serialVersionUID = 1L;
    3. private MyCanvas canv = new MyCanvas();
    4. private ImageIcon icon1 = new ImageIcon("Start.jpg");
    5. private JButton b1 = new JButton(icon1);
    6. public Game() {
    7. super("Das Spiel");
    8. this.addWindowListener(this);
    9. // fuer lm deaktivieren
    10. this.setLayout(null);
    11. this.setResizable(false);
    12. this.setBounds(150, 50, 500, 450);
    13. this.setBackground(Color.white);
    14. b1.setText("Hans");
    15. b1.setBackground(Color.GRAY);
    16. b1.addActionListener(this);
    17. // unnoetig bei lm
    18. b1.setBounds(375, 275, 100, 35);
    19. // kleiner
    20. canv.setSize(300, 300);
    21. // zum testen, welche masse canvas hat
    22. //canv.setBackground(new Color(0,0,0));
    23. // die location ist default (0,0) bei deaktiviertem lm
    24. canv.setLocation(0, 0);
    25. canv.addKeyListener(canv);
    26. canv.addMouseListener(canv);
    27. // canvas und button dem frame hinzufuegen
    28. this.add(canv);
    29. this.add(b1);
    30. }
    31. public static void main(String[] args) {
    32. Game game = new Game();
    33. //nach initialisierung wird alles angezeigt
    34. game.setVisible(true);
    35. }
    36. }
    Alles anzeigen


    gruss tuney
    [FONT="Arial Black"]
    os:[SIZE="1"]linux slackware 10.0[/SIZE]
    machine:[SIZE="1"]intel core dual 3.6GHz[/SIZE]
    [/FONT]
  • Wow, das nenn ich mal "Hilfe". Dank deiner ausführlichen Beschreibung der Probleme uns so, hab ichs jetzt geschafft und auch etwas mehr Struktur rein gebracht.
    Vielen, vielen Dank für deine Bemühungen.

    lg.Boarder

    [FONT="Century Gothic"]"...erst wollte ich was über deine dürren Ärmchen sagen, doch dann fiel mir deine hässliche Fresse auf..." (Gothic 1 ist Kult)[/FONT]