Hallo,
ich habe hier bei einer Klasse die von JInternalFrame abgeleitet wird bei der die Methode protected finalizie() nicht aufgerufen wird.
Die Klasse ist ein Singelton damit ich von überall zugriff darauf habe und z.B. wenn sie schon geladen ist aber im Hintergerund steht, wieder nach vorne zu holen. Dazu benutze ich wiederum ein flag
welches ich gerne in finalizie() zurücksetzten möchte. Hier ein Beispiel um das ganze zu verdeutlichen:
CStart.java
CMainFrame.java
CTestFrame1.java
CTestFrame2.java
Und wo ich schon mal hier bin :wink: noch ein weiter Frage:
Ich lade per Default das SystemLookAndFeel kann aber auch zum DefaultLookAndFeel, was ja Java/Metal LnF sein sollte, umschalten. Das klappt auch wunderbar nur sind dann alle Swing komponenten die von AWT abgeleitet sind z.B. JFrame im nativen LookAndFeel und nehmen nicht das neue an.
Kann diese AWT/Swing komponenten irgendwie das andere LookAndFeel aufzwingen?
Freundliche Grüsse und danke
Spontex
ich habe hier bei einer Klasse die von JInternalFrame abgeleitet wird bei der die Methode protected finalizie() nicht aufgerufen wird.
Die Klasse ist ein Singelton damit ich von überall zugriff darauf habe und z.B. wenn sie schon geladen ist aber im Hintergerund steht, wieder nach vorne zu holen. Dazu benutze ich wiederum ein flag
Code:
private static boolean m_State;
CStart.java
Code:
public class CStart {
public static void main(String[] args) {
CMainFrame app = new CMainFrame();
}
}
CMainFrame.java
Code:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyVetoException;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;
public class CMainFrame extends JFrame implements ActionListener {
private JPanel m_Panel;
private JDesktopPane m_Desktop;
private JButton m_Button1;
private JButton m_Button2;
public CMainFrame () {
m_Panel = new JPanel(new BorderLayout());
m_Desktop = new JDesktopPane();
m_Button1 = new JButton ("Zeige oder lade erstes Fenster");
m_Button1.setActionCommand("actionbtnWindow1");
m_Button1.addActionListener(this);
m_Button2 = new JButton ("Zeige oder lade zweites Fenster");
m_Button2.setActionCommand("actionbtnWindow2");
m_Button2.addActionListener(this);
m_Panel.add(m_Button1, BorderLayout.NORTH);
m_Panel.add(m_Button2, BorderLayout.SOUTH);
m_Panel.add(m_Desktop, BorderLayout.CENTER);
this.setContentPane(m_Panel);
this.setLocation(100,100);
this.setSize(800, 600);
this.setVisible(true);
}
public void actionPerformed(ActionEvent event) {
String action = event.getActionCommand();
Object item = event.getSource();
if (item instanceof JButton) {
if (action.equals("actionbtnWindow1")) {
this.setWindow1();
}
else if (action.equals("actionbtnWindow2")) {
this.setWindow2();
}
}
}
private void setWindow1() {
System.out.print("\n(1) Status vorher: " + CTestFrame1.getState());
if (CTestFrame1.getState()) {
try {
CTestFrame1.getInstance().setSelected(true);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
} else {
this.addChildFrame(CTestFrame1.getInstance(), 30);
}
System.out.print("\n(1) Status nachher: " + CTestFrame1.getState());
}
private void setWindow2() {
System.out.print("\n(2) Status vorher: " + CTestFrame1.getState());
if (CTestFrame2.getState()) {
try {
CTestFrame2.getInstance().setSelected(true);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
} else {
this.addChildFrame(CTestFrame2.getInstance(), 60);
}
System.out.print("\n(2) Status nachher: " + CTestFrame1.getState());
}
private void addChildFrame(JInternalFrame fChild, int iLocation) {
fChild.setLocation(iLocation, iLocation/2);
fChild.setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);
fChild.setClosable(true);
fChild.setIconifiable(true);
fChild.setMaximizable(true);
fChild.setResizable(true);
m_Desktop.add(fChild);
fChild.setVisible(true);
fChild.show();
}
}
CTestFrame1.java
Code:
import java.awt.Dimension;
import javax.swing.JInternalFrame;
public class CTestFrame1 extends JInternalFrame{
private static CTestFrame1 m_Frame;
private static boolean m_State;
private CTestFrame1() {
this.setTitle("Erstes Fenster");
Dimension dimSize = new Dimension(640, 480);
this.setSize(dimSize);
this.setMinimumSize(dimSize);
}
public static synchronized CTestFrame1 getInstance() {
if (m_Frame == null) {
m_Frame = new CTestFrame1();
}
m_State = true;
return m_Frame;
}
public static synchronized boolean getState() {
return m_State;
}
protected void finalize() {
m_State = false;
}
}
CTestFrame2.java
Code:
import java.awt.Dimension;
import javax.swing.JInternalFrame;
public class CTestFrame2 extends JInternalFrame{
private static CTestFrame2 m_Frame;
private static boolean m_State;
private CTestFrame2() {
this.setTitle("Zweites Fenster");
Dimension dimSize = new Dimension(640, 480);
this.setSize(dimSize);
this.setMinimumSize(dimSize);
}
public static synchronized CTestFrame2 getInstance() {
if (m_Frame == null) {
m_Frame = new CTestFrame2();
}
m_State = true;
return m_Frame;
}
public static synchronized boolean getState() {
return m_State;
}
protected void finalize() {
m_State = false;
}
}
Und wo ich schon mal hier bin :wink: noch ein weiter Frage:
Ich lade per Default das SystemLookAndFeel kann aber auch zum DefaultLookAndFeel, was ja Java/Metal LnF sein sollte, umschalten. Das klappt auch wunderbar nur sind dann alle Swing komponenten die von AWT abgeleitet sind z.B. JFrame im nativen LookAndFeel und nehmen nicht das neue an.
Kann diese AWT/Swing komponenten irgendwie das andere LookAndFeel aufzwingen?
Freundliche Grüsse und danke
Spontex