Portal > Foren > Java > Desktop-Applikationen und Grafik > Unterschiedliche Inhalte in einem Fenster ..
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 17.06.2005, 18:52 Nach oben    #1
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard Unterschiedliche Inhalte in einem Fenster ..

Hi,
ich habe mal eine allgemeine Frage bzgl. der Anzeige von Inhalt.

Wenn ich nun eine Anwendung habe, die unterschiedliche Sachen anzeigen soll (alles andere wäre ja auch irgendwie Schwachsinn *g*), wie realisiere ich das ma besten?

Ich meine. Ich habe zuerst mit einem JInternalFrame gearbeitet, aber dann habe ich hier gelesen, dass es das gar nicht überall gibt.
[EDIT]
Das war ein Fehlinterpretation meinerseits!


Nun gut, dann hab ich das so umgestellt, dass es eben doch nur ein normales JFrame ist. Ich habe mir nun überlegt, dass ich da z.B. ein JPanel einfüge, welches ich dann je nachdem, was gewünscht ist, mit Inhalt fülle.

Wie aber macht man so etwas am besten?
Oder bin ich total auf dem falschen Weg?

So wie ich das sehe müsste ich meinen Actions, über die ich eine Methode zur Erstellung des entsprechenden GUI aufrufe, eine Panel-Instanz mitgeben .. aber das möchte ich eigentlich vermeiden, weil das irgendwie nicht ... in meinen Kram passt

Danke für Tipps, Ideen und Ratschläge.

Grüße Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.06.2005, 14:36 Nach oben    #2
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

Hab ich meine Frage schlecht gestellt?
Also eventuell nochmal etwas ausführlicher mit einigen Codepassagen.

Hier definiere ich die Menüleiste.
PHP-Code:
    private JMenuBar createMenuBar() {
        
JMenuBar menuBar;
        
JMenu menu;

        
menuBar = new JMenuBar();   
        
        
        
// erster Haupt-Menüpunkt
        
menu = new JMenu("Verwaltung");
        
menu.setMnemonic(KeyEvent.VK_V);
        
        
// Einträge des ersten Menüs
        
menu.add(new CloseAppAction(this));
        
        
menuBar.add(menu);
        
        
        
// zweiter Haupt-Menüpunkt
        
menu = new JMenu("Erfassen");
        
menu.setMnemonic(KeyEvent.VK_E);
        
menuBar.add(menu);

        
// Einträge des zweiten Menüs 
        
menu.add(new RecordInputDataAction());
        
menu.add(new RecordOutputDataAction());
        
        
        
// dritter Haupt-Menüpunkt
        
menu = new JMenu("Anzeige");
        
menu.setMnemonic(KeyEvent.VK_A);
        
menuBar.add(menu);

        
// Einträge des dritten Menüs 
        
menu.add(new ShowItemAction());    
      
        return 
menuBar;
    } 
Ich gehe jetzt erstmal auf den Menüpunkt hier ein:
PHP-Code:
menu.add(new ShowItemAction()); 
Die Klasse ShowItemAction sieht folgendermaßen aus:
PHP-Code:
package net.yebs.logic.action;

import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import net.yebs.ui.ItemListView;


public class 
ShowItemAction extends AbstractAction {

    public 
ShowItemAction() {
        
super("alle Artikel");        
    }
    

    public 
void actionPerformed(ActionEvent event) {
        
ItemListView.createAndShowGUI();
    }

Hier greife ich jetzt aus dem Controller, der ja in diesem Fall nicht wirklich einer ist, direkt auf den View zu, weil ich ja nichts im Model ändere. Ich hoffe mal, dass das korrekt ist.

Ich habe mir jetzt einfach mal aus dem Java Tutorial folgenden Artikel als Basis genommen:
--> How To Use Tables.
Dort ist ein Model und ein View implementiert. Diese beiden Klassen habe ich jetzt einfach mal sinngemäß übernommen.

Mein View sieht demnach so aus:
PHP-Code:
package net.yebs.ui;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

import net.yebs.logic.ItemListModel;



public class 
ItemListView extends JPanel {
    
    private 
boolean DEBUG false;
    private 
JPanel contentPane;
    
    public 
ItemListView() {
        
super(new GridLayout(1,0));
        
        
JTable table = new JTable(new ItemListModel());
        
table.setPreferredScrollableViewportSize(new Dimension(50070));
                
        
JScrollPane scrollPane = new JScrollPane(table);
        
        
this.initColumnSizes(table);
        
this.add(scrollPane);
        
        
this.setOpaque(true);
    }
    
    
    private 
void initColumnSizes(JTable table) {
        
        
ItemListModel model = (ItemListModel)table.getModel();
        
TableColumn column   null;
        
Component component null;
        
        
int headerWidth     0;
        
int cellWidth       0;
        
        
Object[] longValues model.longValues;
        
        
TableCellRenderer headerRenderer table.getTableHeader().getDefaultRenderer();

        for(
int i 05i++) {
            
column table.getColumnModel().getColumn(i);

            
component headerRenderer.getTableCellRendererComponent(null
                                                                      
column.getHeaderValue(),
                                                                      
false
                                                                      
false
                                                                      
0
                                                                      
0);
            
            
headerWidth component.getPreferredSize().width;

            
component   table.getDefaultRenderer(model.getColumnClass(i)).getTableCellRendererComponent(
                                        
table
                                        
longValues[i],
                                        
false
                                        
false
                                        
0
                                        
i);
            
            
cellWidth component.getPreferredSize().width;

            if (
this.DEBUG) {
                
System.out.println("Initializing width of column "
                                   
". "
                                   
"headerWidth = " headerWidth
                                   
"; cellWidth = " cellWidth);
            }
        }        
    }
    
    public static 
void createAndShowGUI() {  
        
ItemListView newContentPane = new ItemListView();        
    }    
    

Der Quellcode des Models ist hier zu finden (innere Klasse
--> http://java.sun.com/docs/books/tutor...TableDemo.java

Jut.
Ich habe jetzt eine Klasse DesktopFrame, welches sozusagen das Anwendungsfenster repräsentiert. Es ist ein JFrame, kein JInternalFrame.

ich weiß jetzt nicht, wie ich es schaffe, dass in diesem DesktopFrame ein JPanel bzw. ein Container mit Inhalt gefüllt wird. Zu Beginn fülle ich den Container einfach mittels einer Methode, die mir da ein JLabel reindrückt:
PHP-Code:
    private void addCompontentsToPane() {
        
this.getContentPane().setLayout(new GridBagLayout());

        
JLabel welcome;
        
GridBagConstraints constr = new GridBagConstraints();

        
constr.fill GridBagConstraints.HORIZONTAL;

        
welcome = new JLabel("startseite - test");
        
constr.weightx 0.5;
        
        
constr.gridx 15;
        
constr.gridy 15;
        
this.getContentPane().add(welcomeconstr);
    } 
Toll.
Jetzt bin ich aber ja in der Lage, dass im View ein JPanel erstellt wird .. der View ist ja ein Panel
PHP-Code:
public class ItemListView extends JPanel 
nur wie bekomme ich das Panel jetzt im DesktopFrame angezeigt?


Sollten noch weitere Unklarheiten vorhanden sein, dann fragt doch bitte nach. Ich danke Euch.

Grüße und Dank im Voraus.
Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2005, 00:04 Nach oben    #3
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 581
Standard

Das Problem hatte ich bei Applets, dort gibt es ja eh nur ein Fenster.

Ich werde mich mal hinsetzen und für dich was ausprobieren. Gib mir mal bitte Zeit bis morgen Abend.

Gruß
Sparrow
sparrow ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2005, 00:58 Nach oben    #4
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 581
Standard

OK, ich habs.
Das hier sollte deine Frage beantworten:

PHP-Code:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class 
PanelChanger extends JFrame {
    
    
Container content;
    
JPanel panel = new JPanel();
    
    public 
PanelChanger() {
        
super("Panel-Switch für Ben");
        
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static 
void main(String[] args) {
        
PanelChanger pc = new PanelChanger();
        
pc.setSize(400,400);
        
pc.content pc.getContentPane();
        
pc.content.add(pc.panel);
        
pc.showFirstPanel();
        
pc.setVisible(true);
    }
    
    private 
void showFirstPanel() {
        
panel.removeAll();
        
panel.setLayout(new BorderLayout());
        
JLabel first = new JLabel("Ich bin der erste Panel");
        
panel.add(firstBorderLayout.CENTER);
        
JButton klick = new JButton("Switch to 2");
        
klick.addActionListener(new ActionListener() {
            public 
void actionPerformed(ActionEvent e) {
                
showSecondPanel();                
            }            
        });
        
panel.add(klickBorderLayout.SOUTH);
        
panel.doLayout();
    }
    
    private 
void showSecondPanel() {
        
panel.removeAll();
        
panel.setLayout(new BorderLayout());
        
JLabel oben = new JLabel("Zum Beweisen, alles wird neu");
        
panel.add(obenBorderLayout.NORTH);
        
JLabel first = new JLabel("Ich bin der zweite Panel");
        
panel.add(firstBorderLayout.CENTER);
        
JButton klick = new JButton("Switch to 1");
        
klick.addActionListener(new ActionListener() {
            public 
void actionPerformed(ActionEvent e) {
                
showFirstPanel();                
            }            
        });
        
panel.add(klickBorderLayout.SOUTH);
        
panel.doLayout();
    }
    

Bitte keine unmotivierten Kommentare zum Code

Man beachte folgende Methoden des Panels:

Code:
JPanel.removeAll();
Um alle bisherigen Komponenten vom Panel zu enfernen.

und
Code:
JPanel.doLayout();
um den LayoutManager anzuweisen das Panel neu zu berechnen. Ohne dise Zeile friert das Bild ein.
Diese Neuberechnugn darf aber erst passieren nachdem alle Komponenten bereits mit JPanel.add(JComponent) auf dem JPanel eingefügt sind.

Das funktioniert auch bei verschachtelten Panels, also ein Panel in einem Panel in einem Panel aktualisieren.
Allerdings müssen die Panels erst "bestückt" und dann von unten nach oben mit doLayout() neu berechnet werden.

Zum Beispiel:
JPanel ganz_oben beinhaltet
JPanel in_der_Mitte das beinhaltet
JPanel ganz_unten

Zuerst werden alle Panels "bestückt", also alle nötigen Komponenten mit JPanel.add(JComponent) hinzugefügt.
Das doLayout() erfogt dann entgegen der Hierarchie:

ganz_unten.doLayout();
in_der_Mitte.doLayout();
ganz_oben.doLayout();

Hoffe das hilft weiter.

Gruß
Sparrow
sparrow ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.06.2005, 13:44 Nach oben    #5
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

Yeah. Danke
Ich sitz hier gerade bei meinen Eltern an so eine mverschimmelten Rechner .. *g* .. aber ich werde das daheim mal testen.

Ich meld mich dann nochmal mit motivierten Kommentaren

Grüße Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Durchsichtiges fenster Xean Desktop-Applikationen und Grafik 7 15.05.2006 15:18
Fenster verschieben - anderes Fenster mit verschieben? Binary Allgemeine Java-Programmierung 2 15.08.2005 10:24
JLabeltext als Link zu neuem Fenster bacarni Desktop-Applikationen und Grafik 15 23.06.2005 21:57
NOOB FRAGE: Fenster bei Buttondruck Muluf Allgemeine Java-Programmierung 2 21.06.2005 15:06
Neues Fenster öffnen bacarni Allgemeine Java-Programmierung 2 10.01.2005 21:27


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:19 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45