Java: jButtons/jLabels nicht nutzbar unsichtbar

-simonho-

Cadet 4th Year
Registriert
Juli 2012
Beiträge
119
Hallo,
ich arbeite gerade an einem Projekt für den Informatik Unterricht.
Das ganze soll ein Menü werden. Dafür habe ich mit einem JPanel ein Hintergrundbild erzeugt.
Jetzt habe ich allerdings das Problem, dass ich in der Methode initComponents() zwar neue Buttons erzeugen kann, diese aber ansonsten nicht nutzen kann, bzw. die Buttons, welche ich außerhalb erzeugt hab nicht sichtbar/nutzbar sind.

Code:
  public class Menue extends JFrame implements ActionListener{
  // Anfang Attribute
  private JButton b_close, b_larger, b_smaller;
  private GraphicsDevice device;
  
  private JButton jButton1 = new JButton();
  // Ende Attribute
  
  public Menue(String title) { 
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    int frameWidth = 300; 
    int frameHeight = 300;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);
    Container cp = getContentPane();
    cp.setLayout(null);
    
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    device =ge.getDefaultScreenDevice();
    
    if(device.isFullScreenSupported()){
      device.setFullScreenWindow(this);
    }
    
    
    b_close = new JButton("Beenden");
    b_close.setBounds(20, 20, 100, 30);
    b_close.addActionListener(this);
    
    b_larger = new JButton("FullScreen");
    b_larger.setBounds(20, 70, 100, 30);
    b_larger.addActionListener(this);
    b_larger.setEnabled(false);
    
    b_smaller = new JButton("Window");
    b_smaller.setBounds(20, 120, 100, 30);
    b_smaller.addActionListener(this);
    
    initComponents();
    initGui();
    
    this.play("Rolemusic_-_05_-_She_Is_My_Best_Treasure.wav");
    // Anfang Komponenten
    
    jButton1.setText("jButton1");
    jButton1.setMargin(new Insets(2, 2, 2, 2));
    jButton1.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        jButton1_ActionPerformed(evt);
      }
    });
    cp.add(jButton1);
    // Ende Komponenten
    
    setVisible(true);
  } // end of public Menue
  
  // Anfang Methoden
  private void initComponents() {
    /*
    * Neue ContentPane setzen, die das Hintergrundbild zeichnet. Hier zu
    * Vorzeigezwecken alles in einem Schritt reingeklatscht, sollte im
    * Normalfall sauberer implementiert werden.
    */
    Container cp = getContentPane();
    
    setContentPane(new JPanel() {
      /**
      * Das Hintergrundbild.
      */
      private Image               img;
      
      /*
      * Da es sich hierbei um eine anonyme Klasse handelt, kann ich
      * keinen expliziten Konstruktor deklarieren, daher wird das Bild in
      * einem Initialisierer geladen.
      */
      {
        img = getToolkit().createImage("boot.jpg");
        
        MediaTracker mt = new MediaTracker(this);
        mt.addImage(img, 1);
        try {
          mt.waitForAll();
        } catch(InterruptedException e) {
          e.printStackTrace();
        }
      }
      
      /*
      * (non-Javadoc)
      * @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
      */
      @Override
      protected void paintComponent(Graphics g) {
        g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
      }
    });
    getContentPane().add(jButton1 = new JButton("JB1"));
    jButton1.setBounds(64, 72, 113, 49);
    
  }
  
  @Override
  public void actionPerformed(ActionEvent e) {
    if(e.getSource()== b_close){
      device.setFullScreenWindow(null);
      System.exit(0);
    }
    if(e.getSource()== b_larger){
      b_larger.setEnabled(false);
      b_smaller.setEnabled(true);
      device.setFullScreenWindow(this);
    }
    if(e.getSource()== b_smaller){
      b_larger.setEnabled(true);
      b_smaller.setEnabled(false);
      device.setFullScreenWindow(null);
    }
  }
  
  private void initGui() {
    //setSize(500, 500);
    setLocationRelativeTo(null);
    setVisible(true);
  }
  
  private void play(String lied) {
    
    try {
      AudioInputStream input = AudioSystem.getAudioInputStream(new File(lied));
      SourceDataLine line = AudioSystem.getSourceDataLine(input.getFormat());
      line.open(input.getFormat());
      line.start();
      byte[] buffer = new byte[1024];
      int count;
      while((count = input.read(buffer, 0, 1024)) != -1) {
        line.write(buffer, 0, count);
      }
      line.drain();
      line.stop();
      line.close();
    } catch(Exception e) {
      e.printStackTrace();
    }            
  }  
  public void jButton1_ActionPerformed(ActionEvent evt) {
    System.exit(0);// TODO hier Quelltext einfügen
  } // end of jButton1_ActionPerformed

  // Ende Methoden
  
  public static void main(String[] args) {
    new Menue("Menue");
  } // end of main
  
} // end of class Menue

Wie kann ich das Problem lösen?

Vielen Dank,
-simonho-
 
Mein Problem ist allerdings, dass die Buttons dann nicht angezeigt werden, wenn ich einfach etwas schreibe wie:
Code:
b_close = new JButton("Beenden");
    b_close.setBounds(20, 20, 100, 30);
    b_close.addActionListener(this);
    cp.add(b_close);

Buttons werden nur angezeigt, wenn ich sie innerhalb der initComponents erstelle.
 
Dir werden nur die Buttons aus initComponents angezeigt, weil du in dieser Funktion den kompletten Container ersetzt (Zeile 73).
Versuch mal initComponents() vor deinen Buttons aufzurufen und aktualisiere dein cp nach dem Aufruf von initComponents, damit es sich auch auf den aktuellen Container bezieht...
 
-simonho- schrieb:
Mein Problem ist allerdings, dass die Buttons dann nicht angezeigt werden, wenn ich einfach etwas schreibe wie:
Code:
b_close = new JButton("Beenden");
    b_close.setBounds(20, 20, 100, 30);
    b_close.addActionListener(this);
    cp.add(b_close);

Buttons werden nur angezeigt, wenn ich sie innerhalb der initComponents erstelle.

Du setzt in initComponents() ein neues ContentPane. Folglich müssen die Buttons nach dem Setzen hinzugefügt werden.
 
Scheinbar ist auch so gemeint. Denn es hat sich jetzt rausgestellt, das nur die drei Buttons "Window, Fullscreen und Beenden funktionieren.
Code:
public Menue(String title) { 
    // Frame-Initialisierung
    super(title);
    
    initComponents();
    initGui();
    
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    int frameWidth = 1138; 
    int frameHeight = 704;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);
    Container cp = getContentPane();
    cp.setLayout(null);
    
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    device =ge.getDefaultScreenDevice();
    
    if(device.isFullScreenSupported()){
      device.setFullScreenWindow(this);
    }
    
    
    b_close = new JButton("Beenden");
    b_close.setBounds(20, 20, 100, 30);
    b_close.addActionListener(this);
    cp.add(b_close);
    
    b_larger = new JButton("FullScreen");
    b_larger.setBounds(20, 70, 100, 30);
    b_larger.addActionListener(this);
    b_larger.setEnabled(false);
    cp.add(b_larger);
    
    b_smaller = new JButton("Window");
    b_smaller.setBounds(20, 120, 100, 30);
    b_smaller.addActionListener(this); 
    cp.add(b_smaller);   
    
    this.play("Rolemusic_-_05_-_She_Is_My_Best_Treasure.wav");
    // Anfang Komponenten
    jButton1 = new JButton("Spiel starten");
    jButton1.setText("jButton1");
    jButton1.setMargin(new Insets(2, 2, 2, 2));
    jButton1.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        jButton1_ActionPerformed(evt);
      }
    });
    cp.add(jButton1);
    jButton2.setBounds(40, 130, 100, 30);
    jButton2.setText("jButton2");
    jButton2.setMargin(new Insets(2, 2, 2, 2));
    jButton2.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        jButton2_ActionPerformed(evt);
      }
    });
    cp.add(jButton2);
    jLabel1.setBounds(664, 408, 251, 121);
    jLabel1.setText("text");
    cp.add(jLabel1);
    // Ende Komponenten
 
Zuletzt bearbeitet:
-simonho- schrieb:
Scheinbar ist auch so gemeint. Denn es hat sich jetzt rausgestellt, das nur die drei Buttons "Window, Fullscreen und Beenden funktionieren.

Das ist ein anderes Problem, obschon durchaus ähnlich gelagert. Schau Dir Zeile 105 ganz genau an...
 
hmm Zeile 105 habe ich eigentlich schon gelöscht:

Code:
  public Menue(String title) { 
    // Frame-Initialisierung
    super(title);
    
    initComponents();
    initGui();
    
    Container cp = getContentPane();
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    int frameWidth = 1138; 
    int frameHeight = 704;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);
    cp.setLayout(null);
    
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    device =ge.getDefaultScreenDevice();
    
    if(device.isFullScreenSupported()){
      device.setFullScreenWindow(this);
    }
    
    
    b_close = new JButton("Beenden");
    b_close.setBounds(20, 20, 100, 30);
    b_close.addActionListener(this);
    cp.add(b_close);
    
    b_larger = new JButton("FullScreen");
    b_larger.setBounds(20, 70, 100, 30);
    b_larger.addActionListener(this);
    b_larger.setEnabled(false);
    cp.add(b_larger);
    
    b_smaller = new JButton("Window");
    b_smaller.setBounds(20, 120, 100, 30);
    b_smaller.addActionListener(this); 
    cp.add(b_smaller);   
    
    this.play("Rolemusic_-_05_-_She_Is_My_Best_Treasure.wav");
    // Anfang Komponenten
    jButton1 = new JButton("Spiel starten");
    jButton1.setBounds(40, 140, 120, 50);
    jButton1.setText("Spiel starten");
    jButton1.addActionListener(this);
    //jButton1.setMargin(new Insets(2, 2, 2, 2));
    /* jButton1.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
    jButton1_ActionPerformed(evt);
    }
    });      */
    cp.add(jButton1);
    
    jButton2.setBounds(40, 130, 100, 30);
    jButton2.setText("jButton2");
    jButton2.setMargin(new Insets(2, 2, 2, 2));
    jButton2.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        jButton2_ActionPerformed(evt);
      }
    });
    cp.add(jButton2);
    
    jLabel1.setBounds(152, 232, 251, 121);
    jLabel1.setText("Käpt'n Stahlbart");
    jLabel1.setFont(new Font("Dialog", Font.BOLD, 25));
    cp.add(jLabel1);
    // Ende Komponenten
    
    setVisible(true);
  } // end of public Menue
  
  // Anfang Methoden
  private void initComponents() {
    /*
    * Neue ContentPane setzen, die das Hintergrundbild zeichnet. Hier zu
    * Vorzeigezwecken alles in einem Schritt reingeklatscht, sollte im
    * Normalfall sauberer implementiert werden.
    */
    
    setContentPane(new JPanel() {
      /**
      * Das Hintergrundbild.
      */
      private Image               img;
      
      /*
      * Da es sich hierbei um eine anonyme Klasse handelt, kann ich
      * keinen expliziten Konstruktor deklarieren, daher wird das Bild in
      * einem Initialisierer geladen.
      */
      {
        img = getToolkit().createImage("boot1.jpg");
        
        MediaTracker mt = new MediaTracker(this);
        mt.addImage(img, 1);
        try {
          mt.waitForAll();
        } catch(InterruptedException e) {
          e.printStackTrace();
        }
      }
      
      /*
      * (non-Javadoc)
      * @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
      */
      @Override
      protected void paintComponent(Graphics g) {
        g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
      }
    });
  }
  
  @Override
  public void actionPerformed(ActionEvent e) {
    if(e.getSource()== b_close){
      device.setFullScreenWindow(null);
      System.exit(0);
    }
    if(e.getSource()== b_larger){
      b_larger.setEnabled(false);
      b_smaller.setEnabled(true);
      device.setFullScreenWindow(this);
    }
    if(e.getSource()== b_smaller){
      b_larger.setEnabled(true);
      b_smaller.setEnabled(false);
      device.setFullScreenWindow(null);
    }
  }
  
  private void initGui() {
    //setSize(500, 500);
    setLocationRelativeTo(null);
    setVisible(true);
  }
  
  private void play(String lied) {
    
    try {
      AudioInputStream input = AudioSystem.getAudioInputStream(new File(lied));
      SourceDataLine line = AudioSystem.getSourceDataLine(input.getFormat());
      line.open(input.getFormat());
      line.start();
      byte[] buffer = new byte[1024];
      int count;
      while((count = input.read(buffer, 0, 1024)) != -1) {
        line.write(buffer, 0, count);
      }
      line.drain();
      line.stop();
      line.close();
    } catch(Exception e) {
      e.printStackTrace();
    }            
  }  
  public void jButton1_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
  } // end of jButton1_ActionPerformed
  
  public void jButton2_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
  } // end of jButton2_ActionPerformed
  
  // Ende Methoden
  
  public static void main(String[] args) {
    new Menue("Menue");
  } // end of main
  
} // end of class Menue

Edit: das ganze hängt wohl mit der play-Methode zusammen.
Edit2: ich habe jetzt die play-Methode nach hinten verlegt, jetzt gehen alle Knöpfe, es fehlt nur noch das jLabel.
Edit3: Jetzt funktionier alles, vielen Dank für eure Hilfe!
 
Zuletzt bearbeitet:
Zurück
Oben