JInternalFrame

Status
Nicht offen für weitere Antworten.

H3llGhost

Bekanntes Mitglied
Hallo Leute,

ich habe mal eine Frage:
Also ich habe eine Main-Klasse, die eine GUI-Klasse aufruft und damit auch die Grafische Oberfläche.
Mein Problem zur Zeit ist, wenn ich den JInternalFrame über eine Funktion aufrufe muss ich erst reinklicken, damit dieser Frame sichtbar wird.
Warum?
Ich habe mir die API durchgelesen und da gibt es einen Befehl setSelectedFrame() und diesen habe ich auch schon ausprobiert.
Es gibt keine Veränderung, erst wenn ich die Anzeige vom JInternalFrame in den Konstruktor schreibe geht es.

Hier die GUI-Klasse:

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

public class GUI extends Main implements ActionListener
{
  JMenuItem aboutItem;
  JFrame frame;
  JDesktopPane desktop;
  public GUI()
  {
    frame = new JFrame();
    frame.setTitle("Protokoll für W&M");
    frame.setSize(1024,768);
    frame.setDefaultCloseOperation(0);
    frame.setResizable(false);
    
    JPanel einPanel = new JPanel();
    
    //Menübarerstellung
    
    JMenuBar menuBar = new JMenuBar();
    frame.setJMenuBar(menuBar);
    
    //Menükategorien
    JMenu helpMenu = new JMenu("?");
    
    //Menüoptionen
 
    aboutItem = new JMenuItem("Über");
    aboutItem.addActionListener(this);
    
    //Menü der Kategorie hinzufügen
    helpMenu.add(aboutItem);
    
    //Kategorie der Menübar zuweisen
    menuBar.add(helpMenu);
    frame.add(einPanel);
    
    frame.setVisible(true);
  }
  
  public void such()
  {
    desktop = new JDesktopPane();
    desktop.setDragMode(0);
    frame.add(desktop);

    JInternalFrame iFrame = new JInternalFrame("Frame 1", true, false, false, false);
    iFrame.setLayout(null);
    iFrame.putClientProperty("JInternalFrame.isPalette", Boolean.TRUE);
    JLabel jl = new JLabel();
    jl.setText("Ttest");
    iFrame.setBackground(Color.GRAY);
    iFrame.add(jl);
    iFrame.setSize(300, 300);
    iFrame.setLocation(400,400);
    iFrame.setVisible(true);
    desktop.add(iFrame);
    desktop.setSelectedFrame(iFrame);
  }
  
  public void actionPerformed(ActionEvent evt)
  {
     Object quelle = evt.getSource();
     if(quelle == aboutItem)
     {
        such();
      }
  }
}

Vielen Dank für eure Mühe!
 

Wildcard

Top Contributor
wenn du nach dem setVisible weitere einem Container weitere Components hinzufügen willst, musst du validate auf dem Container aufrufen.
 

H3llGhost

Bekanntes Mitglied
Danke für deine schnelle Antwort ... ;)
Also ich habe jetzt drei verschiedene Validates (iFrame.validate(), desktop.validate() und frame.validate()) ausprobiert und auch nach einander gesetzt.
Keine Veränderung.
 

Wildcard

Top Contributor
Code:
desktop = new JDesktopPane();
    desktop.setDragMode(0);
    frame.add(desktop); 
frame.validate();
Du solltest allerdings noch einen LayoutManager setzen der bestimmt was wo hin kommt und was wie groß sein soll, sonst ist die JDesktopPane unter Umständen 0 auf 0 Pixel groß.
 

H3llGhost

Bekanntes Mitglied
Habe es nun einmal ohne Layout probiert und einmal mit.

Code:
    desktop = new JDesktopPane();
    desktop.setLayout(new BorderLayout());
    frame.add(desktop, BorderLayout.CENTER);
    frame.validate();

Leider keine Veränderung.
 

Wildcard

Top Contributor
Kurz vervollständigt, funktioniert:
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class GUI implements ActionListener
{
  JMenuItem aboutItem;
  JFrame frame;
  JDesktopPane desktop;
  public GUI()
  {
    frame = new JFrame();
    frame.setTitle("Protokoll für W&M");
    frame.setSize(800,600);
    frame.setDefaultCloseOperation(0);
//    frame.setResizable(false);
   
    JPanel einPanel = new JPanel();
    //Menübarerstellung
   
    JMenuBar menuBar = new JMenuBar();
    frame.setJMenuBar(menuBar);
   
    //Menükategorien
    JMenu helpMenu = new JMenu("?");
   
    //Menüoptionen

    aboutItem = new JMenuItem("Über");
    aboutItem.addActionListener(this);
   
    //Menü der Kategorie hinzufügen
    helpMenu.add(aboutItem);
   
    //Kategorie der Menübar zuweisen
    menuBar.add(helpMenu);
    frame.add(einPanel, BorderLayout.SOUTH);
   
    frame.setVisible(true);
  }
 
  public void such()
  {
    desktop = new JDesktopPane();
    desktop.setDragMode(0);
    frame.add(desktop);

    JInternalFrame iFrame = new JInternalFrame("Frame 1", true, false, false, false);
    iFrame.setLayout(null);
    iFrame.putClientProperty("JInternalFrame.isPalette", Boolean.TRUE);
    JLabel jl = new JLabel();
    jl.setText("Ttest");
    iFrame.setBackground(Color.GRAY);
    iFrame.add(jl);
    iFrame.setSize(300, 300);
    iFrame.setLocation(400,400);
    iFrame.setVisible(true);
    desktop.add(iFrame);
    desktop.setSelectedFrame(iFrame);
  }
 
  public void actionPerformed(ActionEvent evt)
  {
     Object quelle = evt.getSource();
     if(quelle == aboutItem)
     {
        such();
      }
  }
  
  public static void main(String[] args) {
	new GUI();
}
}
 

H3llGhost

Bekanntes Mitglied
Danke für den Tipp.
Ja jetzt klappt es.
Aber kann ich auch das BorderLayout weglassen und das mit setBounds machen?
Und warum kann ich nicht BorderLayout.CENTER benutzen?
 

Wildcard

Top Contributor
Was hat BorderLayout mit setBorder zu tun?
Du kannst auch CENTER nehmen, dort liegt aber schon das Panel (CENTER ist default wenn man bei add nichts angibt).
 

H3llGhost

Bekanntes Mitglied
Okay dann habe ich das mit dem Frame falsch verstanden.
Ich dachte, dass könnte man über alles legen so als ob man einen Dialog zum Einstellen, Öffnen oder etc. hat wie in den Programmen Word, Excel und Co.
Kannst dir vorstellen was ich vorhabe zu schreiben?
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben