Toon posts:

[JAVA] zijn panels een goede oplossing?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Heej.

ik ben zo goed als een leek in java, en ik vroeg me af of je in een bepaald frame panels het beste kunt gebruiken om vershillende schermindelingen te tonen en de verbergen ( met setVisible(false/true)...

zoja, hoe kan ik dit gebruiken. Namelijk als er in een menu wordt geklikt op een bepaale view (onderdeel van het menu), dan set ik een panel visible, maar het vorige panel blijft dan ook op visible staan... kan ik dit makkelijk oplossen?

gr jack... het zal wel niet helemaal duidelijk zijn, maar ik heb de hele avond nog dus...

Verwijderd

Bijhouden welke visible is en deze onzichtbaar maken?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik denk dat je een CardLayout nodig hebt :)
http://java.sun.com/j2se/1.4/docs/api/java/awt/CardLayout.html
http://java.sun.com/docs/books/tutorial/uiswing/layout/card.html
Hiermee kan je verschillende panels op 1 panel plaatsen en als je 1 zichtbaar maakt dan kan je de rest niet zien.

  • MisterData
  • Registratie: September 2001
  • Laatst online: 07-09 20:23
Of natuurlijk een JTabbedPane, dat ziet eruit als een soort tabblad. Dan kun je met de methode addTab een panel eraan toevoegen :)

Verwijderd

Topicstarter
cool... thanx!!

Verwijderd

Topicstarter
ik had alles al op een panel gezet, dat panel heb ik verandert van een XLlayout naar een CardLayout... als ik nu op een van de menu items klik, wertk dat 1 keer en daarna niet meer...

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

een klein :z stukje code zou misschien wel helpen. En zomaar vabn layout veranderen gaat geloof ik niet met card layout (panels worden toegevoegd onder een bep naam).

Verwijderd

Topicstarter
hier heb je de code... let niet op de slordigheid (tips zijn welkom ;) )

http://www.ghostwriterz.nl/test/frame.txt

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
El_Jacko: tips zijn welkom ;)
code:
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
46
47
  JPanel contentPane;
  BorderLayout borderLayout1 = new BorderLayout();
  JPanel pane = new JPanel();
  TransparentImage achtergrond = new TransparentImage();
  MenuBar menuBar1 = new MenuBar();
  Menu menuView = new Menu();
  MenuItem klantBeheer = new MenuItem();
  Menu menuHome = new Menu();
  Menu menuHelp = new Menu();
  MenuItem menuHelpAbout = new MenuItem();
  MenuItem menuHelpHelp = new MenuItem();
  MenuItem menuViewKlBeheer = new MenuItem();
  MenuItem menuViewBHWPPlanning = new MenuItem();
  MenuItem menuViewOpmkWerkBon = new MenuItem();
  MenuItem menuViewBSBHLeenAuto = new MenuItem();
  MenuItem menuViewSTDWerkzaamheden = new MenuItem();
  MenuItem menuHomeQuit = new MenuItem();
  JPanel panelWPPlanning = new JPanel();
  XYLayout xYLayout2 = new XYLayout();
  Database database1 = new Database();
  JdbNavToolBar jdbNavToolBar1 = new JdbNavToolBar();
  JLabel labelOpdrachtNr = new JLabel();
  JLabel labelDatum = new JLabel();
  JLabel labelTijd = new JLabel();
  JLabel labelPersoneelID = new JLabel();
  JLabel labelTitel = new JLabel();
  JdbTextField jdbOpdrachtNr = new JdbTextField();
  JdbTextField jdbDatum = new JdbTextField();
  JdbTextField jdbTijd = new JdbTextField();
  JdbTextField jdbPersoneelID = new JdbTextField();
  JdbTextField jdbDatumTijd = new JdbTextField();
  JLabel labelWerkID = new JLabel();
  JLabel labelTitel1 = new JLabel();
  XYLayout xYLayout3 = new XYLayout();
  JLabel labelPersoneelIDWB = new JLabel();
  JdbTextField jdbOpdrachtNr1 = new JdbTextField();
  JdbTextField jdbPersoneelIDWB = new JdbTextField();
  JdbTextField jdbWerkID = new JdbTextField();
  JPanel panelOpmknWerkBon = new JPanel();
  JdbNavToolBar jdbNavToolBar2 = new JdbNavToolBar();
  JLabel labelDatumTijd = new JLabel();
  JLabel labelOpdrachtNr1 = new JLabel();
  JLabel labelChassisNR = new JLabel();
  JLabel labelWerkBonID = new JLabel();
  JdbTextField jdbChassisNR = new JdbTextField();
  JdbTextField jdbWerkBonID = new JdbTextField();
  CardLayout cardLayout1 = new CardLayout();

Het is absoluut onnodig om zoveel instantie variabelen te gebruiken. Als ik mij even uit zou leven, zou dit gereduceerd worden tot 1 of 2. Voor labels is het onzin, voor menu's, buttons en menu-items is het onnodig als je nette ActionListeners gebruikt en voor layouts is het helemaal onzin. Voor textfields is het helaas noodzakelijk als je niet volledig model-gebaseerd werkt. Die zouden dus alleen overblijven :)
code:
1
2
3
4
5
6
menuHome.setLabel("Home");
menuView.setLabel("View");
menuHelp.setLabel("Help");   menuHelpAbout.setLabel("About");
menuHelpHelp.setLabel("Help");
menuViewKlBeheer.setLabel("Klantgegevens");
...

Het is efficienter en fraaier om dit gelijk aan de constructor mee te geven.
code:
1
2
3
4
5
menuViewBHWPPlanning.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(ActionEvent e) {
      menuViewBHWPPlanning_actionPerformed(e);
    }
    });

Yakkie, anonieme inner-classes en doorsluizen naar een vage methode naam ;( . Wat is die automatisch gegenereerde zooi van JBuilder toch om te grienen :'( .
code:
1
2
3
4
5
6
7
8
labelPersoneelID.setFont(new java.awt.Font("Dialog", 1, 12));
labelTitel.setFont(new java.awt.Font("Dialog", 1, 25));
labelWerkID.setFont(new java.awt.Font("Dialog", 1, 12));
labelTitel1.setFont(new java.awt.Font("Dialog", 1, 25));
labelPersoneelIDWB.setFont(new java.awt.Font("Dialog", 1,   12));
labelDatumTijd.setFont(new java.awt.Font("Dialog", 1, 12));    
labelOpdrachtNr1.setFont(new java.awt.Font("Dialog", 1, 12));
labelChassisNR.setFont(new java.awt.Font("Dialog", 1, 12));

Hier worden steeds nieuwe Fonts aangemaakt -> duur en onnodig. Bovendien heel erg lastig handmatig aan te passen.
code:
1
2
achtergrond.setImageName("C:\\Documents and
Settings\\Jacques Maas\\Desktop\\oldtimer\\oldtimer.jpg");

Hum, wilde je je applicatie ooit nog aan iemand anders geven, laat staan op een ander platform draaien? ;) .

Verder ben ik niet echt gecharmeerd van die XYLayout, maar dat moet je verder zelf weten natuurlijk :) .

Ok, dat was het... een beetje veel commentaar misschien en allemaal op automatisch gegenereerde code, maar ik zag alleen maar automatisch gegenereerde code ;) . Als ik dit zie verbaasd het mij geen moment dat Java GUIs als traag worden ervaren, want: dit is ook traag. Voor deze GUI worden werkelijke vrachten onnodige objecten aangemaakt, om het nog maar niet te hebben over de onnodige methode aanroepen... Als je echt een goede GUI in elkaar wilt zetten moet je naar mijn mening toch echt met de hand gaan werken en Swing gebruiken...

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
ja uhm... ik ben als een GEK aan het swingen in jbuilder hehe,

hoe kan ik die code reduceren dan... gebruik je gewoon setLabel ofzo?

[QOUTE]Hier worden steeds nieuwe Fonts aangemaakt -> duur en onnodig. Bovendien heel erg lastig handmatig aan te passen.[/QUOTE]


hoe...?

[QOUTE]
achtergrond.setImageName("C:\\Documents and
Settings\\Jacques Maas\\Desktop\\oldtimer\\oldtimer.jpg");


Hum, wilde je je applicatie ooit nog aan iemand anders geven, laat staan op een ander platform draaien? .
[/QOUTE]

Hehe uhm... ja... :|

en op zich is dit nog niet echt een oplossing, maar ik heb het nu opgelost door gewoon bij elke actie, alle panels invisible te maken en de juiste visible... omslachtig maar het werkt...

  • MisterData
  • Registratie: September 2001
  • Laatst online: 07-09 20:23
Op maandag 07 januari 2002 21:35 schreef El_Jacko het volgende:

[QOUTE]Hier worden steeds nieuwe Fonts aangemaakt -> duur en onnodig. Bovendien heel erg lastig handmatig aan te passen.
[/quote]




offtopic:
Quote-tags moeten met kleine letters :)



Je moet gewoon 1 font maken en dan steeds setFont(gemaakteFont) doen. Elke keer dat je een Font instantieert wordt er weer een nieuw object aangemaakt terwijl je net zo goed naar hetzelfde object kunt verwijzen :)

Edit: Oeps nou deed ik het zlef bijna verkeerd |:(
Edit2 : Nog steeds niet wat is die ubb parser hier toch brak :(

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
El_Jacko: ja uhm... ik ben als een GEK aan het swingen in jbuilder hehe
Je gebruikt inderdaad wel wat Swing componenten, maar ook AWT. Dat had ik nog geeneens gezegd: dat moet je nooit doen. Het mixen van Swing en AWT componenten kan in principe niet. Je moet dus voor al je componenten Swing componenten gebruiken...
hoe kan ik die code reduceren dan... gebruik je gewoon setLabel ofzo?
Allereerst kan je een heleboel instantie variabelen lokale variabelen van de constructor (of jbinit) maken. Je kunt in de constructors van labels, buttons etc een heleboel meegeven en dat zou ik dus ook maar doen... Dit kan je zo 3 of 4 regels schelen, is efficienter en bovendien duidelijker :) .
[Fonts]hoe...?
Zie reactie MisterData :) .

Eerlijk gezegd zou ik dit geeneens gaan herschrijven maar gewoon ff opnieuw beginnen. Bekijk eens goed hoe je met de hand GUIs schrijft in Java en hoe LayoutManagers werken. Je code wordt dan leuker, sneller, duidelijker en je krijgt veel meer inzicht in de zaak :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • MisterData
  • Registratie: September 2001
  • Laatst online: 07-09 20:23
Op maandag 07 januari 2002 21:48 schreef mbravenboer het volgende:

[..]

Je gebruikt inderdaad wel wat Swing componenten, maar ook AWT. Dat had ik nog geeneens gezegd: dat moet je nooit doen. Het mixen van Swing en AWT componenten kan in principe niet. Je moet dus voor al je componenten Swing componenten gebruiken...
Mixen kan theoretisch wel , maar vanwege een heel andere manier van tekenen (Swing werkt met verschillende lagen in frames enz.) lijkt het alsof AWT componenten boven swing-componenten komen te staan. Vergeet niet dat alle swing componenten zijn afgeleid van JComponent, die weer van java.awt.Container is afgeleid en dus ook een java.awt.Component is :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
MisterData over Swing en AWT mixen
Juist, je moet het dus nooit doen :P ;) .

In de Java Tutorial:
Programs should not, as a rule, use "heavyweight" components alongside Swing components. Heavyweight components include all the ready-to-use AWT components (such as Menu and ScrollPane) and all components that inherit from the AWT Canvas and Panel classes. This restriction exists because when Swing components (and all other "lightweight" components) overlap with heavyweight components, the heavyweight component is always painted on top.
Zie ook dit artikel voor uitgebreidde info:

http://java.sun.com/products/jfc/tsc/articles/mixing/index.html

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment

Pagina: 1