# JFrame, JMenuBar, ScrollBar



## Happyguck (29. Aug 2003)

Moin moin,

ich hab da ein Problem. Ich versuche einen Frame zu proggen, in dem ein Dateimenü oben ist.
In diesem Frame möchte ich ein weiteren Frame mit Scrollbalken. 
Wenn ich das angehängte Programm compiliere, spuckt er immer einen Fehler aus.

Generalisierung.java:33: cannot resolve symbol 
symbol   :  constructor JMenuBar (Generalisierung.generalmenu)
location  :  class javax.swing.JMenuBar
                menuleiste = new JMenuBar(new generalmenu());
                                    ^ 
Ich weiß nicht, ob das so geht, wenn ich das Menü in eine extra Klasse schreib.
Ich hatte auch versucht, das Menü mit in der Generalisierungsklasse reinzuhauen.
Da hatte ich aber Probleme beim implementieren vom Adjustment- und ActionListener.
Geht das überhaupt, beide Listener für eine Klasse zu implementieren?

Vielleicht hat ja jemand nen Lösungsvorschlag.
Danke im voraus.


Gruß Happyguck 



```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.lang.Math.*;

//--------------------Hauptklasse

public class Generalisierung extends JPanel implements AdjustmentListener {
       private JScrollPane scroll;
       private JMenuBar menuleiste;
       
       public static void main(String[] args) {
         JFrame frame = new JFrame("Generalisierung");
         frame.getContentPane().add(new Generalisierung());
         
         frame.addWindowListener(new WindowAdapter() {
             public void windowClosing(WindowEvent e) {
                  System.exit(0);
             }
         } );
         frame.setSize(800,600);
         frame.setVisible(true);
       }
       
       public Generalisierung(){
            setLayout(new BorderLayout());
            scroll = new JScrollPane(new Zeichnung());
            JScrollBar hor = scroll.getHorizontalScrollBar();
            JScrollBar ver = scroll.getVerticalScrollBar();
            hor.addAdjustmentListener(this);
            ver.addAdjustmentListener(this);
            add(scroll);
        [b]menuleiste = new JMenuBar(new generalmenu());[/b]


       }
       
       public void adjustmentValueChanged(AdjustmentEvent e) {
            //Ausgabe der Position der Komponente, die im oberen linken Eckpunkt angezeigt wird
            Point p = scroll.getViewport().getViewPosition();
            System.out.println("("+p.x+","+p.y+")");
       }
//---------------------Klasse Menü-------------------------------------------

class generalmenu extends JMenuBar implements ActionListener
{
  public generalmenu()
  {

   menuleiste.add(projektmenu());
   menuleiste.add(koordmenu());
   add(menuleiste);

  }

  //öffentliche methode zur ausgabe des gewählten menüpunktes als text
  public void actionPerformed(ActionEvent event)
  {
    System.out.println(event.getActionCommand());
  }

  //private methhoden für menü Karte
  private JMenu projektmenu()
  {
    JMenu pro = new JMenu("Projekt");   //anlage obermenü projekt
    pro.setMnemonic('P');               //tastenbelegung
    JMenuItem mi;                       //variable für untermenüs

    //anlegen
    mi = new JMenuItem("Projekt anlegen", 'a');
    setCtrlAccelerator(mi, 'A');
    mi.addActionListener(this);
    pro.add(mi);
    //öffnen
    mi = new JMenuItem("Projekt öffnen", 'f');
    setCtrlAccelerator(mi, 'F');
    mi.addActionListener(this);
    pro.add(mi);
    //Speichern
    mi = new JMenuItem("Projekt speichern", 's');
    setCtrlAccelerator(mi, 'S');
    mi.addActionListener(this);
    pro.add(mi);
    //Separator
    pro.addSeparator();
    //Beenden
    mi = new JMenuItem("Beenden", 'e');
    mi.addActionListener(this);
    pro.add(mi);
    return pro;
  }
  private JMenu koordmenu()
  {
    JMenu koo = new JMenu("Koordinaten");
    koo.setMnemonic('K');
    JMenuItem mi;

    //eingeben
    mi = new JMenuItem("eingeben", 'g');
    setCtrlAccelerator(mi, 'G');
    mi.addActionListener(this);
    koo.add(mi);
    //einlesen
    mi = new JMenuItem("einlesen", 'l');
    setCtrlAccelerator(mi, 'L');
    mi.addActionListener(this);
    koo.add(mi);
    //ausgeben
    koo.add(ausgabemenu());
    return koo;
  }
  private JMenu ausgabemenu()
  {
    JMenu koo = new JMenu("ausgeben");
    koo.setMnemonic('A');
    JMenuItem mi;
    //drucker
    mi = new JMenuItem("Drucker", 'd');
    setCtrlAccelerator(mi, 'D');
    mi.addActionListener(this);
    koo.add(mi);
    //datei
    mi = new JMenuItem("Datei", 'a');
    setCtrlAccelerator(mi, 'A');
    mi.addActionListener(this);
    koo.add(mi);
    return koo;
  }

  //private methode zur tastenausführung ohne rückgabewert
  private void setCtrlAccelerator(JMenuItem mi, char buchst)
  {
    KeyStroke ks = KeyStroke.getKeyStroke(
      buchst, Event.CTRL_MASK
    );
    mi.setAccelerator(ks);
  }
}

//--------------------Klasse Zeichnung(Fensterinhalt)------------------------

 class Zeichnung extends JPanel{
   public Zeichnung() {
        setBackground(Color.white);
        setPreferredSize(new Dimension(1024,780));
   }


   public void paintComponent(Graphics g) {
     super.paintComponent(g);
 
     int k = 11;


     int b = 1;
     int[] x = {50, 150,150, 175, 175, 225, 225, 250, 250, 225, 225, 300, 300, 225, 225, 175, 100, 100, 50, 50, 150, 150, 50};
     int[] y = {50, 50, 25, 25, 50, 50, 75, 75, 125, 125, 175, 175, 200, 200, 225, 225, 210, 225, 225, 150, 150, 100, 100};

     g.drawString("Die Anzahl der Koordinaten beträgt: " + x.length, 100, 10);
    
        
       /*if(((x[1] / k) <= (x[0] / k + 10)) & ((x[1] / k) > (x[0] / k)) ^ ((x[1] / k) >= (x[0] / k - 10) & (x[1] / k) < (x[0] / k)) ^ ((y[1] / k) <= (y[0] / k + 10) & (y[1] / k) > (y[0] / k)) ^((y[1] / k) >= (y[0] / k - 10) & (y[1] / k) < (y[0] / k))) {
         g.drawLine(x[0] / k, y[0] / k, x[4] / k, y[4] / k); }
       //else g.drawLine(x[0] / k, y[0] / k, x[1] / k, y[1] / k);

       /*if(((x[1] / k) <= (x[0] / k + 10))  ^ ((x[1] / k) >= (x[0] / k - 10)) ^ ((y[1] / k) <= (y[0] / k + 10)) ^ ((y[1] / k) >= (y[0] / k - 10))) {
          g.drawLine(x[0] / k, y[0] / k, x[4] / k, y[4] / k);
       }*/
       //else g.drawLine(x[0] / k, y[0] / k, x[1] / k, y[1] / k);

     //}
   }

 }
}[b][/b]
```


----------



## DTR (1. Sep 2003)

Der Fehler der bei dir auftritt kommt, weil du einen Konstruktor benutzt, den es nicht gibt. Laut API gibt es in der Klasse JMenueBar nur den default-Konstruktor. 

Es dürfte keine Probleme geben, wenn man zwei Listener für die selbe Klasse implementiert.


----------



## Happyguck (12. Sep 2003)

Mein Problem hab ich sogar selber gelöst bekommen.


----------



## Nobody (12. Sep 2003)

schreib zur vollständigkeit bitte die korrekte lösung rein(nur der korrigierte teil) und wo der fehler lag und was er war. das kann anderen bei evtl auftretenden fehlern helfen


----------

