addInternalToDesktop

Status
Nicht offen für weitere Antworten.

r74

Aktives Mitglied
Hallo Forum

Im "Hauptfenster" öffne ich mittels addInternalToDesktop ein neues Fenster ("Input"). Im "Input"-Fenster
kann man eine Eingabe machen. Je nach Eingabe soll sich dann ein weiteres Fenster im "Hauptfenster"
öffnen (hier Part1, Part2, ...)

Wie krieg ich das Öffnen von weiteren Fenstern nach einer Eingabe hin?

Hier mein Versuch:
Code:
import javax.swing.*;
import java.awt.*;

public class Main extends JFrame {
	
	static void addInternalToDesktop( JDesktopPane desktop, String type ) {
		JInternalFrame iframe = new JInternalFrame();
		iframe.setLocation( 100, 100 );
		iframe.setSize( 450, 450 );
		iframe.setBackground(Color.cyan);
		if( type.equals( "input" ) ) iframe.add( new Input() );
		if( type.equals( "1" ) ) iframe.add( new Part1() );
		if( type.equals( "2" ) ) iframe.add( new Part2() );
		if( type.equals( "3" ) ) iframe.add( new Part3() );
		iframe.setVisible( true );
		desktop.add( iframe );
	}
	
	public static void main( String[] args ) {
		JFrame f = new JFrame("hauptfenster");
		f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		JDesktopPane desktop = new JDesktopPane();
		f.add( new JScrollPane( desktop ) );
		f.setSize( 1000, 1000 );
		addInternalToDesktop( desktop, "input" );
		f.setVisible( true );
	}
}

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

public class Input extends JPanel {

	JTextField inpt = new JTextField( 1 );
	
	Input() {
		inpt.addActionListener(
			new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					//addInternalToDesktop( desktop, inpt.getText() ); //<------------------
				}
			}
		);
		add( inpt );
	}
}
 

0x7F800000

Top Contributor
womit hast du jetzt probleme? dass der action listener nicht die nötigen referenzen zur verfügung hat?
dann wäre sowas hier eine imho etwas unübersichtliche Lösung, die aber funktionieren sollte:
Code:
import javax.swing.*; 
import java.awt.event.*; 

public class Input extends JPanel implements ActionListener{ 

   private JTextField inpt; 
   private JDesktopPane desktop;

   Input(JDesktopPane _desktop) { 
      desktop=_desktop;
      inpt=new JTextField( 1 ); 

      inpt.addActionListener(this);
      add( inpt ); 
   }

   public void actionPerformed(ActionEvent e){
      addInternalToDesktop( desktop, inpt.getText() ); 
   }
}
Ansonsten leite dir vom normalen ActionListener irgendetwas spezialisierteres ab, das zusäzlich im Konstruktor die ganzen notwendigen referenzen übergeben kriegt...

oder hab ich das problem völlig falsch verstanden?
 

r74

Aktives Mitglied
@Andrey: Völlig falsch hast du mich nicht verstanden.

Das Problem ist aber der Aufruf der Methode addInternalToDesktop.

Diese Methode liegt ja nicht in der Klasse Input, deshalb kann er die
auch nicht finden. Es erscheint folgende Fehlermeldung:

Input.java:26: cannot find symbol
symbol : method addInternalToDesktop(javax.swing.JDesktopPane,java.lang.String,Tree,int)
location: class Input
addInternalToDesktop( desktop, "toolbox", t1, 0 );
 

0x7F800000

Top Contributor
ist doch eine statische methode der "Main" klasse? Warum rufst du die funktion nicht einfach mit
Code:
Main.addInternalToDesktop(..???...);
auf? ???:L
wenn die public ist und im selben packege rumliegt dürfte es da doch gar keine probleme geben...
 

HLX

Top Contributor
Eine Lösung: DesktopPane ableiten, Methode an DesktopPane hängen, DesktopPane an InternalFrame übergeben:

Code:
public class Main
	extends JFrame {

	public static void main(String[] args) {
		JFrame f = new JFrame("hauptfenster");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		MyDesktopPane desktop = new MyDesktopPane();
		desktop.addInternalFrame("input");
		f.add(new JScrollPane(desktop));
		f.setSize(1000, 1000);
		f.setVisible(true);
	}
}

Code:
public class MyDesktopPane
	extends JDesktopPane {

	public void addInternalFrame(String type) {
		JInternalFrame iframe = new JInternalFrame();
		iframe.setLocation(100, 100);
		iframe.setSize(450, 450);
		iframe.setBackground(Color.cyan);
		if (type.equals("input"))
			iframe.add(new Input(this));
		if (type.equals("1"))
			iframe.add(new Part1());
		iframe.setVisible(true);
		add(iframe);
	}
}
Code:
public class Input
	extends JPanel {

	private JTextField inpt = new JTextField(1);
	private MyDesktopPane desktopPane;

	public Input(MyDesktopPane pane) {
		desktopPane = pane;
		inpt.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				getDesktopPane().addInternalFrame(inpt.getText() );
			}
		});
		add(inpt);
	}
	
	protected MyDesktopPane getDesktopPane() {
		return desktopPane;
	}
}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben