# Infofenster zentrieren und HTML-formatierten Text readonly a



## Noar (19. Nov 2006)

Hi,

ich habe ein kleines Problem mit Swing.

Ich habe eine Applikation, die unter anderem ein Infofenser enthalten soll (also kurze Info zum Programm). 
Also ich habe das Fernster, das legt sich auch brav über alle anderen Fenster drüber.

Aber ich habe noch zwei Probleme:
Ich bekomme das Infofenster nicht zentriert. Ich möchte, daß das Infofenster immer zentriert über dem Arbeitsbereich erscheint. Horizontal funktioniert das, aber vertikal ist das Fenster nicht zentriert.

So sieht es momentan aus:

```
Dimension desktopSize = contentPane.getPreferredSize();
internalFrame.setLocation((desktopSize.width)/2-100, (desktopSize.height)/2);
```
Kann mir da jemand einen Tipp geben?

Meine zweite Frage ist:
Wie kann ich im Infofenster formatierten Text anzeigen?


```
private void showInfo() {
        JInternalFrame internalFrame = new JInternalFrame("Info", false, true, false, false);
        internalFrame.setSize(200,150);
        
        //Internal Frame zentrieren:
        Dimension desktopSize = contentPane.getPreferredSize();
        internalFrame.setLocation((desktopSize.width)/2-100, (desktopSize.height)/2);
        
        jtp_InfoPane = new JTextPane();
                
        desktop.add(internalFrame, 300);
        internalFrame.setVisible(true);
    }
```

Kann mir auch dazu jemand einen Tipp geben?

Vielen Dank,
Noar[/quote]


----------



## Wildcard (19. Nov 2006)

Nimm entweder JOptionPane oder einen eigenen JDialog. Übergib deinen Haupt-Frame als owner.
Für formatierten Text kannst du ein JLabel mit html Formatierung nehmen.


----------



## kaie (20. Nov 2006)

Zentrieren kann man ganz einfach mit folgender Zeile:

```
meinDialog.setLocationRelativeTo(null);
```
Für InternalFrame klappt das vermutlich jedoch nicht, da musst Du dann wohl selbst die Position setzen. Warum ziehst Du die 100 von der x-Koordinate ab, aber nicht die 75 von der y-Koordinate?


----------



## Noar (23. Nov 2006)

Hi,

danke für eure Antworten.
Leider bin ich mit dem zentrieren der Fenster noch nicht so richtig weitergekommen. 
Zwar sind sie in X-Richtung mittig, in Y-Richtung jedoch nicht.
Das mit den -100/-75 hatte ich mal durch Ausprobieren so hinbekommen. Sinnig erscheint mir das aber nicht.

Denn wenn ich z.B. in y-Richtung eine Fenstergröße von 100 habe, und das wird dann durch 2 geteilt, und davon werden 75 abgezogen, dann bin ich bei -25. Und das erscheint mir als Wert für die Y-Koordinate doch eher unsinnig.

Allerdings kann es auch sein, das ich das falsch verstanden habe.

Ich Stelle daher hier mal den Code der zwei Klassen ein (falls ihr das mal ausprobieren möchtet).
Ist etwas länger, aber der relevante Teil steht in der Klasse "SwingFrame", in der Methode "private void showHelp()" und "private void showInfo()".


```
import java.awt.event.*;
import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.net.URL;

import javax.swing.*;

public class SwingFrame extends JFrame implements ActionListener {
    
    Container contentPane;
    JTextField jtf_Status;
    
    JLayeredPane desktop;
        
    private Action actNewFile, actOpenFile, actOpenWeb, actSaveFile, actHelp, actAbout;
    private JToolBar toolBar;
    private String iconSize="16";
    
    private KeyStroke keyStroke;

    //Menueobjekte
    JMenuBar menuBar;
    JMenu menuFile, menuOpen, menuHelp;
    JMenuItem jmi_New, jmi_OpenFile, jmi_OpenWeb, jmi_Close, jmi_Save, jmi_SaveAs, jmi_Help, jmi_About;
    private JButton jbtn_New, jbtn_OpenFile, jbtn_OpenWeb, jbtn_Save, jbtn_Help, jbtn_About;
    
    //Definition der ToolTip-Konstanten
    private final String TTT_New = "Create new File";
    private final String TTT_OpenFile = "Open File";
    private final String TTT_OpenWeb = "Open Web";
    private final String TTT_Save = "Save File";
    private final String TTT_Help = "Help";
    private final String TTT_About = "About this program";
    
    private JEditorPane jep_EditorPane;
    private FileBrowser fileBrowser;
    
    private JTextPane jtp_HelpPane, jtp_InfoPane;
    
    File file;
    
    public SwingFrame() {
        super("Simple Editor");
        setSize(600,450);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        contentPane = this.getContentPane();
        
        desktop = getLayeredPane();
        
        buildMenu();
        defineTooltips();
        createToolBar();
      
        //Statusfeld
        jtf_Status = new JTextField("");
        jtf_Status.setBackground(Color.black);
        jtf_Status.setForeground(Color.white);
        
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.add(BorderLayout.SOUTH, jtf_Status);
        
        jep_EditorPane = new JEditorPane();
        JScrollPane jsp_ScrollPane = new JScrollPane(jep_EditorPane);
        panel.add(BorderLayout.CENTER,jsp_ScrollPane); 
        
        contentPane.add(BorderLayout.CENTER, panel);
        setVisible(true);
        
        fileBrowser = new FileBrowser(jtf_Status);
    }
    
    public static void main(String[] args) {
        new SwingFrame();
    }
    
    private void buildMenu() {
        //Menuebar
        menuBar = new JMenuBar();
        setJMenuBar(menuBar);
        
        //Dateimenue
        menuFile = new JMenu("File");
        menuFile.setMnemonic('F');
        actNewFile = new AbstractAction("New...", new ImageIcon("images/New"+iconSize+".gif")) {
            public void actionPerformed(ActionEvent ae) {
                jep_EditorPane.setContentType("text/plain");
                jep_EditorPane.setText("");
                jtf_Status.setText("Created new file");
                }
            };
        actNewFile.putValue(Action.SHORT_DESCRIPTION, TTT_New);
        jmi_New = menuFile.add(actNewFile);
        jmi_New.setMnemonic('N');
        
        //Oeffnen-Untermenue
        menuOpen = new JMenu("Open");
        menuOpen.setMnemonic('O');
        
        actOpenFile = new AbstractAction("Filesystem...", new ImageIcon("images/Open"+iconSize+".gif")) {
            public void actionPerformed(ActionEvent ae) {
                String str = fileBrowser.chooseText("Datei waehlen", "./");
                file = fileBrowser.getFile();
                jep_EditorPane.setContentType("text/plain");
                if(str!=null) {
                    jep_EditorPane.setText(str);
                    jtf_Status.setText("'Open File...' selected");
                } else {
                    jtf_Status.setText("No file selected!");
                }
            }
        };

        //KeyStroke-Objekt (Shortcut) definieren und im Action-Objekt speichern
        keyStroke = keyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK);
        actOpenFile.putValue(Action.ACCELERATOR_KEY, keyStroke);
        
        actOpenFile.putValue(Action.SHORT_DESCRIPTION, TTT_OpenFile);            
        jmi_OpenFile = menuOpen.add(actOpenFile);
        jmi_OpenFile.setMnemonic('y');

        actOpenWeb = new AbstractAction("Web...", new ImageIcon("images/WebComponent"+iconSize+".gif")) {
            public void actionPerformed(ActionEvent ae) {
                URL url = fileBrowser.chooseURL("HTML-Seite wählen", "./");
                if(url != null) {
                    try {
                        jep_EditorPane.setPage(url);
                        file = fileBrowser.getFile();
                    } catch (IOException ioe) {
                        System.out.println(ioe.toString());
                    }
                }
            }
        };
        actOpenWeb.putValue(Action.SHORT_DESCRIPTION, TTT_OpenWeb);
        jmi_OpenWeb = menuOpen.add(actOpenWeb);
        jmi_OpenWeb.setMnemonic('W');
        
        menuFile.add(menuOpen);
        
        jmi_Close = new JMenuItem("Close");
        jmi_Close.setMnemonic('C');
        jmi_Close.addActionListener(this); //Listener registrieren
        menuFile.add(jmi_Close);
        
        menuFile.addSeparator();

        actSaveFile = new AbstractAction("Save", new ImageIcon("images/Save"+iconSize+".gif")) {
            public void actionPerformed(ActionEvent ae) {
                if(file != null) {
                    jtf_Status.setText("'Save' selected");
                    save();
                } else {
                    jtf_Status.setText("'Save as...' selected");
                    saveAs();
                }
            }
        };
        actSaveFile.putValue(Action.SHORT_DESCRIPTION, TTT_Save);
        jmi_Save = menuFile.add(actSaveFile);
        jmi_Save.setMnemonic('S');
        
        jmi_SaveAs = new JMenuItem("Save as...");
        jmi_SaveAs.addActionListener(this);
        jmi_SaveAs.setMnemonic('a');
        menuFile.add(jmi_SaveAs);
        menuBar.add(menuFile); //zur Menuebar hinzufuegen
        
        //Hilfemenue
        menuHelp = new JMenu("?");
        menuHelp.setMnemonic('?');
        
        actHelp = new AbstractAction("Help", new ImageIcon("images/Help"+iconSize+".gif")) {
            public void actionPerformed(ActionEvent ae) {
                jtf_Status.setText("'Help' selected");
                showHelp();
                }
            };
        keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0);
        actHelp.putValue(Action.ACCELERATOR_KEY, keyStroke);
        actHelp.putValue(Action.SHORT_DESCRIPTION, TTT_Help);
        jmi_Help = menuHelp.add(actHelp);
        jmi_Help.setMnemonic('H');
        
        menuHelp.addSeparator();

        
        actAbout = new AbstractAction("Info", new ImageIcon("images/About"+iconSize+".gif")) {
            public void actionPerformed(ActionEvent ae) {
                jtf_Status.setText("'Info' selected");
                showInfo();
                }
            };
        keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_I, InputEvent.CTRL_MASK);
        actAbout.putValue(Action.ACCELERATOR_KEY, keyStroke);
        actAbout.putValue(Action.SHORT_DESCRIPTION, TTT_About);
        jmi_About = menuHelp.add(actAbout);
        jmi_About.setMnemonic('I');
        
        menuBar.add(menuHelp); //zur Menuebar hinzufuegen           
    }
    
    public void actionPerformed(ActionEvent ae) {
        if(ae.getSource().equals(jmi_Close))
            System.exit(0);
        else if(ae.getSource().equals(jmi_SaveAs))
            jtf_Status.setText("'Save as' selected");
            saveAs();
    }
    
    private void defineTooltips() {
        jmi_New.setToolTipText("Create a new file");
        jmi_OpenFile.setToolTipText("Open a existing local file");
        jmi_OpenWeb.setToolTipText("Open a existing file from browser");
        jmi_Save.setToolTipText("Save selected file");
        jmi_Help.setToolTipText("Open help");
        jmi_About.setToolTipText("Something about this program");
    }
    
    private void createToolBar() {
        toolBar = new JToolBar();
        
        //alle ToolBar-Buttons initialisieren
        jbtn_New = toolBar.add(actNewFile);
        jbtn_OpenFile = toolBar.add(actOpenFile);
        jbtn_OpenWeb = toolBar.add(actOpenWeb);
        jbtn_Save = toolBar.add(actSaveFile);
        toolBar.addSeparator();
        jbtn_Help = toolBar.add(actHelp);
        jbtn_About = toolBar.add(actAbout);
        
        contentPane.add(BorderLayout.NORTH, toolBar);
        
    }
    
    private void save() {
        fileBrowser.saveFile(file, jep_EditorPane.getText());
    }

    private void saveAs() {
        fileBrowser.saveFileAs(jep_EditorPane.getText(), "Choose file", "./");                
    }
    
    private void showHelp() {
        JInternalFrame internalFrame = new JInternalFrame("Help", true, true, false, false);
        internalFrame.setSize(400, 300);
        
        //Internal Frame zentrieren:
        Dimension desktopSize = jep_EditorPane.getPreferredSize();
        internalFrame.setLocation((desktopSize.width)/2-200, (desktopSize.height)/2);
        System.out.println(desktopSize.width);
        System.out.println(desktopSize.height);
        
        jtp_HelpPane = new JTextPane();
        JScrollPane jsp_ScrollPane = new JScrollPane(jtp_HelpPane);
        internalFrame.add(BorderLayout.CENTER,jsp_ScrollPane);
        
        desktop.add(internalFrame, 200);
        internalFrame.setVisible(true);
    }
    

    private void showInfo() {
        JInternalFrame internalFrame = new JInternalFrame("Info", false, true, false, false);
        internalFrame.setSize(200,150);

        
        //Internal Frame zentrieren:
        Dimension desktopSize = contentPane.getPreferredSize();
        internalFrame.setLocation((desktopSize.width)/2-100, (desktopSize.height)/2);
        
        jtp_InfoPane = new JTextPane();
                
        desktop.add(internalFrame, 300);
        internalFrame.setVisible(true);
    }
}
```

und


```
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.JFileChooser;
import javax.swing.JTextField;
import javax.swing.plaf.FileChooserUI;

public class FileBrowser {

    private JTextField jtf_Status;
    private JFileChooser jfs_FileChooser;
    private File file;
    
    public FileBrowser(JTextField jtf_Status) {
        this.jtf_Status = jtf_Status;
    }
    
    public URL chooseURL(String title, String startDir) {
        URL url = null;
        jfs_FileChooser = new JFileChooser(new File(startDir));
        int returnVal = jfs_FileChooser.showDialog(null, title);
        if(returnVal == JFileChooser.APPROVE_OPTION) {
            try {
                file = jfs_FileChooser.getSelectedFile();
                url = file.toURL();
            } catch (MalformedURLException murlex) {
                jtf_Status.setText("MalformedURLException: "+murlex.getMessage());
            }
        } else if(returnVal == JFileChooser.CANCEL_OPTION) {
            jtf_Status.setText("No file selected.");
        }
        return url;
    }
    
    public String chooseText(String title, String startDir) {
        file = null;
        jfs_FileChooser = new JFileChooser(new File(startDir));
        int returnVal = jfs_FileChooser.showDialog(null, title);
        if(returnVal == JFileChooser.APPROVE_OPTION) {
            file = jfs_FileChooser.getSelectedFile();
        } else if(returnVal == JFileChooser.CANCEL_OPTION) {
            jtf_Status.setText("No file selected.");
            return null;
        }
        FileReader reader = null;
        try {
            reader = new FileReader(file);
        } catch(FileNotFoundException fnfe) {
            System.out.println("FileNotFoundException: "+fnfe.getMessage());
        }
        BufferedReader bufReader = new BufferedReader(reader);
        String str;
        StringBuffer sb = new StringBuffer();
        try {
            while((str = bufReader.readLine()) != null) {
                sb.append(str);
                sb.append(System.getProperty("line.separator"));
            }
            bufReader.close();
        } catch(IOException ioe) {
            System.out.println("IOException: "+ioe.getMessage());
        }
        return sb.toString();

    }
    
    public void saveFile(File file, String text) {
        try {
            BufferedWriter bufWriter = new BufferedWriter(new FileWriter(file));
            bufWriter.write(text);
            bufWriter.flush();
            bufWriter.close();
        } catch (IOException ioe) {
            jtf_Status.setText("IOException: "+ioe.getMessage());
        }
    }
    
    public File saveFileAs(String text, String title, String startDir) {
        File file;
        jfs_FileChooser = new JFileChooser(new File(startDir));
        jfs_FileChooser.setDialogType(JFileChooser.SAVE_DIALOG);
        jfs_FileChooser.setApproveButtonText(title);
        int returnVal = jfs_FileChooser.showDialog(jtf_Status, null);
        if(returnVal == JFileChooser.APPROVE_OPTION) {
            file = jfs_FileChooser.getSelectedFile();
            saveFile(file, text);
            jtf_Status.setText("Saved text in file "+file);
            return file;
        } else if(returnVal == JFileChooser.CANCEL_OPTION) {
            jtf_Status.setText("Canceled 'Save as...'");
        }
        return null;
    }

    public File getFile() {
        return file;
    }
}
```

Vielen Dank für eure Hilfe

Gruß,
Noar


----------



## kaie (23. Nov 2006)

Was ist denn mit folgender Version?

```
internalFrame.setLocation( desktopSize.width/2-internalFrame.getSize().width/2, desktopSize.height/2-internalFrame.getSize().height/2);
```
Die Desktopmitte liegt im Punkt desktopSize.width/2 und desktopSize.height/2, die linke obere Ecke des internen Frames liegt die halbe Fensterbreite links davon und eine halbe Fensterhöhe darüber. Wo liegt das Problem?


----------



## Noar (23. Nov 2006)

Hallo kaie,

danke, jetzt klappt es, 

Ich musste nur statt:


```
Dimension desktopSize = contentPane.getPreferredSize();
```


```
Dimension desktopSize = contentPane.getSize();
```

verwenden.

Damit ist es zentriert.

Jetzt ist mir nur noch nicht klar, wie ich auf das internalFrame einen formatierten Text
draufbekomme, der NICHT bearbeitet werden kann.

Also nicht so, wie im EditorPane, dort kann und soll der User den Text ja erstellen/ändern können. Dort kann ich auch html-Code einladen, der dann korrekt dargestellt wird.

D.h., kann ich den Pane dann irgendwie sperren?

Vielen Dank für eure Hilfe,
Noar


----------



## kaie (23. Nov 2006)

Nimm einfach ein JLabel:

```
JLabel label = new JLabel( "<html><h1>Achtung!</h1>Sie haben irgendetwas falsch gemacht.
Bitte kontaktieren Sie [b]sofort[/b] Ihren Kundenservice." );
```


----------



## Noar (23. Nov 2006)

Hallo kaie,

manchmal habe ich echt ein Brett vor dem Kopf...
Das funktioniert natürlich prima.
Vielen Dank für deine Hilfe.

Gruß,
Noar


----------

