Layout Problem

Guten Tag,

mittlerweile hab ich ja schon fast ein schlechtes Gewissen, drei Fragen von mir hintereinander :smile:

Nun will ich ein größeres Programm (einer Art Rechner) schreiben, es soll ein Hauptfenster enthalten, aus dem man zwischen vier Buttons wählen kann: Normal, Fläche, Volumen und Funktion. Das Hauptfenster habe ich fertig. Nun geht es zu den Unterfenstern jetzt hänge ich am Normal, das soll einen ganz normalen Taschenrechner gleichen.

Hier mal der Code

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

public class Normal extends JFrame {

JPanel ausgabe = new JPanel();
JPanel tasten = new JPanel();
JPanel platzhalter1 = new JPanel();
JPanel platzhalter2 = new JPanel();

public Normal(){
super(„Normal“);

TextField anzeige = new TextField(„Machen Sie ihre Eingabe“,75);

ausgabe.add(anzeige);
ausgabe.setPreferredSize(new Dimension(300, 100));

JButton b1 = new JButton(„7“);
JButton b2 = new JButton(„8“);
JButton b3 = new JButton(„9“);
JButton op1 = new JButton(":");
JButton b4 = new JButton(„4“);
JButton b5 = new JButton(„5“);
JButton b6 = new JButton(„6“);
JButton op2 = new JButton("*");
JButton b7 = new JButton(„1“);
JButton b8 = new JButton(„2“);
JButton b9 = new JButton(„3“);
JButton op3 = new JButton("-");
JButton b10 = new JButton(„0“);
JButton b11 = new JButton(",");
JButton b12 = new JButton("+");
JButton op4 = new JButton("=");

tasten.setLayout(new GridLayout(4,4,20,20));
b1.setPreferredSize(new Dimension(50, 50));
b2.setPreferredSize(new Dimension(50, 50));
b3.setPreferredSize(new Dimension(50, 50));
op1.setPreferredSize(new Dimension(50, 50));
b4.setPreferredSize(new Dimension(50, 50));
b5.setPreferredSize(new Dimension(50, 50));
b6.setPreferredSize(new Dimension(50, 50));
op2.setPreferredSize(new Dimension(50, 50));
b7.setPreferredSize(new Dimension(50, 50));
b8.setPreferredSize(new Dimension(50, 50));
b9.setPreferredSize(new Dimension(50, 50));
op3.setPreferredSize(new Dimension(50, 50));
b10.setPreferredSize(new Dimension(50, 50));
b11.setPreferredSize(new Dimension(50, 50));
b12.setPreferredSize(new Dimension(50, 50));
op4.setPreferredSize(new Dimension(50, 50));

platzhalter1.setPreferredSize(new Dimension(200, 100));
platzhalter2.setPreferredSize(new Dimension(200, 100));

tasten.add(b1);
tasten.add(b2);
tasten.add(b3);
tasten.add(op1);
tasten.add(b4);
tasten.add(b5);
tasten.add(b6);
tasten.add(op2);
tasten.add(b7);
tasten.add(b8);
tasten.add(b9);
tasten.add(op3);
tasten.add(b10);
tasten.add(b11);
tasten.add(b12);
tasten.add(op4);

getContentPane().add(BorderLayout.NORTH, ausgabe);
getContentPane().add(BorderLayout.CENTER, tasten);
getContentPane().add(BorderLayout.EAST,platzhalter1);
getContentPane().add(BorderLayout.WEST, platzhalter2);

}

public static void main(String[] args){

Normal n = new Normal();
n.setSize(800,500);
n.setLocation(400,300);
n.setVisible(true);

}

}

Mein Problem ist ich möchte dass die Tasten die Größe haben die ich angebe beispielsweise 50*50. Wenn ich das Panel der Buttons dann mit dem BorderLayout ins CENTER lege, nehmen die Buttons aber die Größe 50*50 nicht an, sondern sind ca. 130*70. Dann viel mir ein ich könnte die seitlichen Teile des BorderLayout also WEST und EAST einfach als Platzhalter leer lassen, dann dürfte das CENTER gar nicht erst soweit aufgehen sonst gingen die Buttons halt immer bis zum Rand des Fensters. Das hat dann auch gut Funktioniert aber das muss doch auch anders gehen.

Dann würde ich gerne noch die Größe des TextField vergrößern, am besten dynamisch, denn die Buttons vergrößern sich schließlich auch dynamisch.

Kann mir jemand einen Rat geben?

Abschließend noch eine Frage.
Der Button „Funktionen“ im Hauptfenster soll wie der Name schon sagt Graphen von Funktionen zeichnen können, unser Mathe Prof. hat mit Informatikern ein Programm entwickelt dass Funktionsgraphen in Echtzeit darstellen lässt, also man gibt eine Funktion an und der Graph wird gezeichnet, denkt ihr ich bekomme dass auch hin? :smile:

liebe Grüße Matthias

Hallo,

ich würde dir empfehlen, dich mal mit dem gridlayout zu befassen, dass ist für dein problem woll besser geeignet, als das borderlayout. an sonsten versuch es mal mit setSize, statt mit setPreferredSize.
Zu deinem zweiten Problem:
eine Funktion zeichnen zu lassen ist recht einfach. du gehst die funktion einfach in zB 0,001er schritten durch und zeichnest die entsprechenden punkte.
was sehr viel schwiegiger ist, ist der funktionsparser, also der teil, der die eingabe, zB „f(x)=3x^2-sin(x-5)“ erkennt. du wirst sehen, dass das recht kompliziert werden kann, besonders wenn das prog auch solche verketteten funktionen erkennen soll.

So das wars erstmal

Grüße, Keks

Hallo,

also mit setSize kommst du vermutlich nicht weiter, weil das der Layoutmanager macht, denn dafür ist er ja da. Dieser richtet sich in der Regel nach der preferredSize von daher ist es richtig, dieses Attribut zu setzen. Mit dem Borderlayout kenn ich mich kaum aus und ich bin auch der Meinung, dass das Gridlayout da besser ist und wenn du dynamische Größenänderung realisieren willst ist vermutlich das GridBagLayout noch besser. Wenn du vor dem Öffnen des JFrames noch pack() aufrufst, sollte der Layoutmanager alles richten.
Zu der buttonansammlung kann ich nur sagen, dass das kein schöner code ist :confused: ich würde evtl einen string vorschlagen „789:456*123-0,+=“ der in einer schleife durchlaufen wird und ich würde die buttons gleich hinzufügen.
Das ganze sähe dann so aus:

String string = "789:456\*123-0,+=";
Button button;
Dimension dim = new Dimension(50,50);
for(int i=0;i

Immer dran denken: der gute Programmierer ist der faule Programmierer.

Das Problem mit dem Parser könnte man evtl. umgehen indem man kein freies Textfeld für die Eingabe nutzt, sondern über ein Tastenfeld die Eingabe direkt ausliest. Aber wie man damit dann eine Funktion erstellt, könnte ich dir jetzt so auch nicht sagen aber ich werde demnächst mal ein ähnliches Projekt starten, in dem viel mit Funktionen gearbeitet wird.
Wenn du willst, schicke ich dir die Lösung, sobald ich eine gefunden habe.

Gruß
Swen