JInternalFrame Focus setzten geht nicht

bbth6afi

Mitglied
Ich habe ein Problem mit dem Focus beim JInternalFrame.
Bei einer Tabelle wähle ich eine Zeile aus und lasse dann
ein JInternalFrame öffnen wo ich die Daten der Tabelle bearbeiten kann.
Nur beim anzeigen wird das Frame nicht richtig angezeigt.
Hab auch schon frame.pack() und frame.requestFocus probiert, nix geht.
Hier mal der Code von dem JInternalFrame.

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import java.util.*;

public class BearbeitenDVD extends JInternalFrame {
  JLabel daten,titel,fsk,laufzeit,genre,jahr,leer;
  static JLabel labelCover;
  static JInternalFrame frame_dvd;
  static JTextField feld_titel,feld_laufzeit,feld_jahr;
  static JComboBox  combo_genre,combo_fsk;
  String[] genre_array = {"Abenteuer","Action","Drama","Drama, Krieg","Fantasy","Horror",
  "Komödie","Krieg","Science Fiction","Science Fiction","Thriller"};
  String[] fsk_array = {"6","12","16","18"};
  static JButton cover_auswahl,ok,abbrechen;
  static String cover;
  static String combo_genre_auswahl,combo_fsk_auswahl;
  
  BearbeitenDVD() {
    //super();
    frame_dvd = new JInternalFrame("Eintrag bearbeiten",true,true,true,true);
    frame_dvd.setLocation(250,100);
    frame_dvd.setLayout(null);
    frame_dvd.setSize(410,300);
    
    
    daten = new JLabel("  Hauptdaten des Eintrags");
    daten.setBounds(170,20,210,15);
    // JLabel mit Hintergrundfarbe
    daten.setOpaque(true);
    daten.setBackground(new Color(50,113,205));
    daten.setForeground(Color.white);
    
    titel = new JLabel("Titel:");
    titel.setBounds(170,60,50,15);
    
    feld_titel = new JTextField("" + VideothekMain.v.tdvd.tabelle_dvd.getValueAt(TabelleListener.auswahl_dvd,1));
    feld_titel.setBounds(240,58,140,20);
    
    genre = new JLabel("Genre:");
    genre.setBounds(170,90,50,15);
    
    combo_genre_auswahl = "" + VideothekMain.v.tdvd.tabelle_dvd.getValueAt(TabelleListener.auswahl_dvd,2);
    combo_genre = new JComboBox(genre_array);
    combo_genre.setSelectedItem(combo_genre_auswahl);
    combo_genre.setBounds(241,88,120,20);
    
    laufzeit = new JLabel("Laufzeit:");
    laufzeit.setBounds(170,120,50,15);
    
    feld_laufzeit = new JTextField("" + VideothekMain.v.tdvd.tabelle_dvd.getValueAt(TabelleListener.auswahl_dvd,3));
    feld_laufzeit.setBounds(240,118,60,20);
    
    jahr = new JLabel("Jahr:");
    jahr.setBounds(170,150,50,15);
    
    feld_jahr = new JTextField("" + VideothekMain.v.tdvd.tabelle_dvd.getValueAt(TabelleListener.auswahl_dvd,4));
    feld_jahr.setBounds(240,148,60,20);
    
    fsk = new JLabel("FSK:");
    fsk.setBounds(170,180,50,15);
    
    combo_fsk_auswahl = "" + VideothekMain.v.tdvd.tabelle_dvd.getValueAt(TabelleListener.auswahl_dvd,5);
    combo_fsk = new JComboBox(fsk_array);
    combo_fsk.setSelectedItem(combo_fsk_auswahl);
    combo_fsk.setBounds(240,178,50,20);
    
    leer = new JLabel("");
    leer.setBounds(170,215,210,15);
    leer.setOpaque(true);
    leer.setBackground(new Color(50,113,205));
    
    ok = new JButton("OK");
    ok.setBounds(170,242,80,20);
    ok.addActionListener(new ButtonListener());
    
    abbrechen = new JButton("Abbrechen");
    abbrechen.setBounds(260,242,110,20);
    abbrechen.addActionListener(new ButtonListener());
    
    cover_auswahl = new JButton("Cover");
    cover_auswahl.addActionListener(new CoverListener());
    cover_auswahl.setBounds(20,17,80,20);
    
    labelCover = new JLabel();
    labelCover.setBounds(20,60,120,170);
    labelCover.setOpaque(true);
    labelCover.setBackground(new Color(255,0,0));
    
    cover = "" + VideothekMain.v.tdvd.tabelle_dvd.getValueAt(TabelleListener.auswahl_dvd,0);
    ImageIcon icon = new ImageIcon(cover);
    icon.setImage(icon.getImage().getScaledInstance(120,170,Image.SCALE_DEFAULT));
    labelCover.setIcon(icon);
    
    
    frame_dvd.add(daten);
    frame_dvd.add(titel);
    frame_dvd.add(feld_titel);
    frame_dvd.add(genre);
    frame_dvd.add(combo_genre);
    frame_dvd.add(laufzeit);
    frame_dvd.add(feld_laufzeit);
    frame_dvd.add(jahr);
    frame_dvd.add(feld_jahr);
    frame_dvd.add(fsk);
    frame_dvd.add(combo_fsk);
    frame_dvd.add(leer);
    frame_dvd.add(ok);
    frame_dvd.add(abbrechen);
    frame_dvd.add(cover_auswahl);
    frame_dvd.add(labelCover);
    frame_dvd.setVisible(true);
    
    VideothekMain.v.desktop.add(frame_dvd);
    try {
      frame_dvd.setSelected(true);
    } catch(Exception e) {
    }
  }
}
 
Zur Ursache des Problems kann ich nicht viel sagen, aber in Deinem Code ist einiges schief gelaufen und vermutlich hängt das alles zusammen. War mir so spontan auffällt:
- Deine Klasse erbt von JInternalFrame in der Klasse erzeugst bzw. belegst Du eine !!statische!! Variable
Code:
dvd_frame
bei jedem Konstruktoraufruf neu.
- Allgemein hast Du viele statische Variablen, die schlicht und einfach falsch sind. (static nur bewusst einsetzen; i.d.R. ist die Verwendung von static gar nicht nötwendig)
- Auch so etwas hat eigentlich nichts mit Java Programmierung zu tun:
VideothekMain.v.tdvd.tabelle_dvd.getValueAt
1. sieht das wieder nach einem statischen Aufruf aus
2. zeugt die mehrfach verkettete Punktnotation von einem schlechten/falschen Klassendesign

==> Dir fehlen die Grundkenntnisse der objektorientierten Programmierung und Du hast so viele Fehler in Code und Klassendesign, dass die Problemursache überall liegen kann.
 

Zurück
Oben