Reflection - getTitle - JInternalFrame

MScalli

Erfahrenes Mitglied
Hi leutz.
Ich habe ein JDesktopPane in dem mehrere JInternalFrames sein können.

leider muss ich die einzelnen klassen mittels reflection aufrufen da ich den namen nur als string habe.

jetzt kommts.
z.B in der Klasse M0100 die ich mittels reflection aufrufe wird ein JInternalFrame erzeugt. Ich nenn es frame.

in der Klasse gibt es eine Methode die das JInternalFrame frame zurück gibt

Code:
public static JInternalFrame getInternalFrame(){
    return frame;
}

wenn ich jetzt die Klasse M0100 einfach so aufrufe (1.Parameter ist der Titel)
Code:
new M0100("M0100", desktop, width, height);

kann ich später sagen
Code:
JInternalFrame frame =  M0100.getInternalFrame()
frame.setSelected(true);

ohne Reflection geht das auch..
aber wenn ich die Klasse per Reflection aufrufe wird zwar alles gemacht, und ich bekomme so auch ein JInternalFrame zurück bei getInternalFrame(),
aber leider kann ich es nicht auf setSelected(true); setzten.
mehr noch.. im titel steht nicht mal was drin obwohl es in dem Fenster aber oben als titel steht!!

das JInternalFrame das ich zurück bekomme ist dieses

Code:
javax.swing.JInternalFrame[,0,0,0x0,invalid,layout=javax.swing.plaf.basic.BasicInternalFrameUI$Handler,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.metal.MetalBorders$InternalFrameBorder@1a28362,flags=264,maximumSize=,minimumSize=,preferredSize=,closable=false,defaultCloseOperation=DISPOSE_ON_CLOSE,desktopIcon=javax.swing.JInternalFrame$JDesktopIcon[,0,0,160x31,invalid,layout=java.awt.BorderLayout,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@18235ed,flags=8,maximumSize=,minimumSize=,preferredSize=],frameIcon=sun.swing.ImageIconUIResource@9be79a,iconable=false,isClosed=false,isIcon=false,isMaximum=false,isSelected=false,maximizable=false,opened=true,resizable=false,rootPane=javax.swing.JRootPane[,0,0,0x0,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=449,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true,title=]
 
Hallo,

Code:
javax.swing.JInternalFrame[,0,0,0x0,invalid,layout=javax.swing.plaf.basic.BasicInternalFrameUI$Handler,alignmentX=0.0,alignment Y=0.0,border=javax.swing.plaf.metal.MetalBorders$InternalFrameBorder@1a28362,flags=264,maximumSize=, minimumSize=,preferredSize=,closable=false,defaultCloseOperation=DISPOSE_ON_CLOSE,desktopIcon=javax. swing.JInternalFrame$JDesktopIcon[,0,0,160x31,invalid,layout=java.awt.BorderLayout,alignmentX=0.0,alignmentY=0.0,border=javax.swing.pl af.BorderUIResource$CompoundBorderUIResource@18235ed,flags=8,maximumSize=,minimumSize=,preferredSize =],frameIcon=sun.swing.ImageIconUIResource@9be79a,iconable=false,isClosed=false,isIcon=false,isMaximum =false,isSelected=false,maximizable=false,opened=true,resizable=false,rootPane=javax.swing.JRootPane[,0,0,0x0,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags =449,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true,title=]
Was sollen wir jetzt damit anfangen?

Poste mal bitte den Code, wie du ein Object der Klasse erzeugst und wie du dann alles setzen möchtest.
Den Code den du oben gepostet hast, ist für dieses Problem unrelevant.

Die Klasse M0100 wäre auch noch interessant.

MFG

Sascha
 
mich hats halt gewundert das nichts im titel steht! deswegen hab ich das gepostet.
wenn ich es auf setSelected(true) setzt ist danach immer noch false drin!!

Leider hab ich gerade auch probleme die normalen JInternalFrames in den vordergrund zu stellen
bis jetzt ging das ohne probleme mit setSelected(true);
jetzt nicht mehr.. lol

auch moveTorFront() bringt mir nichts jetzt versteh ich gar nichts mehr :)
 
Könntest du bitte den Code posten, wie ich es vorhin schon gefragt hab?

Achte bitte auch auf deine Groß- und Kleinschreibung.

MFG

Sascha
 
ok.. M0100 ist von MyInternalFrame abgeleitet
(hier sollten paar buttons stehen die jedes der JInternalFrames gebraucht hätte aber das hat Probleme gegeben deswegen habe ich sie erst mal in jede Klasse einzeln geaddet.)
hier wird das Objekt erzeugt
Code:
package Auftrag;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.border.Border;

public class MyInternalFrame implements ActionListener{
	private static final long serialVersionUID = 3001190420235484550L;
	
  static JInternalFrame frame;
  static int frameWidth = 850;
  static int frameHeight = 620;
  
  //Buttonleiste oben
  JButton btn_close, btn_save, btn_skip_forward, btn_skip_backward, btn_copy, btn_search, btn_print, btn_delete;
  JLabel lbl, lbl_meldung;
  
  // Border
  Border etchedBdr ,titledBdr ,emptyBdr ,compoundBdr;
	  
	 MyInternalFrame(){
		 
		frame = new JInternalFrame();
		 
	    frame.setResizable(false);
	    frame.setVisible(true);	    
	 } 

	@Override
	public void actionPerformed(ActionEvent arg0) {	
	}
	public static int getHeightFrame(){
	    return frameHeight;
	}
	public static int getWidthFrame(){
	    return frameWidth;
	}
}// ENDE

dann ein ausschnitt aus der Klasse M0100
Code:
package Auftrag;

import static java.lang.Math.random;

import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.ParseException;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JSeparator;
import javax.swing.JTabbedPane;
import javax.swing.event.InternalFrameAdapter;
import javax.swing.event.InternalFrameEvent;
import javax.swing.text.MaskFormatter;

public class M0100 extends MyInternalFrame{
  private static final long serialVersionUID = 3001190420235484550L;
  
  // Desktop
  Container desktop;
  
  public M0100(){
	  System.out.println("In Klasse M0100 --> ohne Parameter");
  }
  public M0100(String title, Container _desktop, int _x, int _y) {  
	   
	desktop = _desktop;
	
    // Frame-Initialisierung
    //frame = new JInternalFrame();
	frameWidth = 850;
	frameHeight = 620;

    frame.setSize(frameWidth, frameHeight);
    int x = _x;
    int y = _y ;
    
    frame.setLocation((int) (random() * x), (int)(random() * y)); 
    frame.setIconifiable(true);
    frame.setMaximizable(true);
    frame.setFrameIcon(new ImageIcon(".\\pic\\klein_Calendar.png"));
    frame.setBorder(BorderFactory.createLineBorder(new Color(111,111,111), 2));
    frame.setClosable(true);
    frame.setTitle(title);
    frame.setLayout(null);
	frame.addInternalFrameListener(new InternalFrameAdapter(){
		@Override
		public void internalFrameClosing(InternalFrameEvent e) {
			System.out.println("Schliesse M0100-Artikel");
		}
	});
.
.
. 

public static JInternalFrame getInternalFrame(){
    return frame;
}

}// ENDE

und jetzt der Aufruf mittels reflection(methode callClass)
Code:
	private void callClass(String klassenname) {

		// erst den Packagenamen vor den Klassennamen stellen
		String str_klassenname = "Auftrag." + klassenname;
		
		// so heissen die Methoden der Klassen(brauche ich um den ort zu bestimmen an denen die JInternalFrames stehen sollen)
		String method_name1 = "getWidthFrame";
		String method_name2 = "getHeightFrame";
		
		try {
			Class c = Class.forName(str_klassenname);
			Object object = c.newInstance();
			
			// hier hole ich height und witdh der ausgesuchten Klasse
			Method method1 = object.getClass().getMethod(method_name1, new Class[] {});
			Object width_frame = method1.invoke(object, new Object [] {});
			
			Method method2 = object.getClass().getMethod(method_name2, new Class[] {});
			Object height_frame = method2.invoke(object, new Object [] {});
		       // prüfen was drin steht
			System.out.println(str_klassenname);
			System.out.println(klassenname);
			System.out.println(width_frame = Auftrag.desktop.getWidth() - Integer.parseInt(width_frame.toString()));
			System.out.println(height_frame= Auftrag.desktop.getHeight() - Integer.parseInt(height_frame.toString()));
			

			// Ist diese Klasse schon geöffnet soll sie nur in den Vordergrund gestellt werden
                        // ist dieses JInternalFrame schon offen
			if(!MyAuftrag.offen(klassenname)){
				System.out.println("In offen");
				// eigentlicher Klassenaufruf
				Object[] args = new Object[] {klassenname, Auftrag.desktop, width_frame, height_frame};
				Class[] ArgsClass = new Class[] {String.class, Container.class, int.class, int.class};
				Constructor constructor = c.getConstructor( ArgsClass);
				object = constructor.newInstance(args);
			}else{
                               System.out.println("Hier komme ich rein wenn JInternalFrame schon Offen ist --> funktioniert ");
				Method method_get_internal_frame = object.getClass().getMethod("getInternalFrame", new Class[] {});
				Object obj_get_internal_frame = method_get_internal_frame.invoke(object, new Object [] {});
				JInternalFrame pane = (JInternalFrame) obj_get_internal_frame;
				try {
//Das sollte eigentlich das JInternalFrame in den vordergrund setzten.
					pane.setSelected(true);
				} catch (PropertyVetoException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}			
			}
			
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		}
	}

sry hat bisschen gedauert ;)
 
Zuletzt bearbeitet:
Du solltest deine Klasse nochmal überdenken.
Das mit dem static JInternalFrame ist keine gute Lösung.

Code:
package Auftrag;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.border.Border;

public class MyInternalFrame extends JInternalFrame implements ActionListener{
	private static final long serialVersionUID = 3001190420235484550L;
	
  static int frameWidth = 850;
  static int frameHeight = 620;
  
  //Buttonleiste oben
  JButton btn_close, btn_save, btn_skip_forward, btn_skip_backward, btn_copy, btn_search, btn_print, btn_delete;
  JLabel lbl, lbl_meldung;
  
  // Border
  Border etchedBdr ,titledBdr ,emptyBdr ,compoundBdr;
	  
	 MyInternalFrame(){
	
		 
	    setResizable(false);
	    setVisible(true);	    
	 } 

	@Override
	public void actionPerformed(ActionEvent arg0) {	
	}
	public static int getHeightFrame(){
	    return frameHeight;
	}
	public static int getWidthFrame(){
	    return frameWidth;
	}
}// ENDE

Code:
package Auftrag;

import static java.lang.Math.random;

import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.ParseException;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JSeparator;
import javax.swing.JTabbedPane;
import javax.swing.event.InternalFrameAdapter;
import javax.swing.event.InternalFrameEvent;
import javax.swing.text.MaskFormatter;

public class M0100 extends MyInternalFrame{
  private static final long serialVersionUID = 3001190420235484550L;
  
  // Desktop
  Container desktop;
  
  public M0100(){
	  System.out.println("In Klasse M0100 --> ohne Parameter");
  }
  public M0100(String title, Container _desktop, int _x, int _y) {  
	   
	desktop = _desktop;
	
    setSize(frameWidth, frameHeight);
    int x = _x;
    int y = _y ;
    
    setLocation((int) (random() * x), (int)(random() * y)); 
    setIconifiable(true);
    setMaximizable(true);
    setFrameIcon(new ImageIcon(".\\pic\\klein_Calendar.png"));
    setBorder(BorderFactory.createLineBorder(new Color(111,111,111), 2));
    setClosable(true);
    setTitle(title);
    setLayout(null);
	addInternalFrameListener(new InternalFrameAdapter(){
		@Override
		public void internalFrameClosing(InternalFrameEvent e) {
			System.out.println("Schliesse M0100-Artikel");
		}
	});
.
.
. 

public static JInternalFrame getInternalFrame(){
    return this;
}

}// ENDE

MFG

Sascha
 
Also jetzt gehts..
Aber nur beim ersten mal. Na das reicht mir auch, denn wenn es das JInternalFrame schon gibt muss es nur in den Vordergrund wenn ich drauf klicke.
So hier mal meine Lösung.

Mit der Gross- und Kleinschreiberei gelobe ich Besserung ;)

Code:
			// Ist diese Klasse schon geöffnet soll sie nur in den Vordergrund gestellt werden
			if(!Auftrag.offen(klassenname)){
				// eigentlicher Klassenaufruf
				Object[] args = new Object[] {klassenname, Auftrag.desktop, width_frame, height_frame};
				Class[] ArgsClass = new Class[] {String.class, Container.class, int.class, int.class};
				Constructor constructor = c.getConstructor( ArgsClass);
				object = constructor.newInstance(args);
				
				// hier hole mir das JInternalFrame mit der methode getInternalFrame
				Method method3 = object.getClass().getMethod("getInternalFrame", new Class[] {});
				Object jint_pan = method3.invoke(object, new Object [] {});
				JInternalFrame frame;
				frame = (JInternalFrame) jint_pan;
				try {
					frame.setSelected(true);
				} catch (PropertyVetoException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
 
Zurück