Grafische Oberflächen Probleme

Hallo zusammen,

ich lerne gerade mit Java zu programmieren und stehe vor der Aufgabe, die Oberfläche des Windows Rechners nachzuprogrammieren.

Hier sind die Vorgaben und mein bisheriger Stand: http://img837.imageshack.us/img837/9103/rechnerm.png

Wie auf dem dritten Bild zu sehen, habe ich quasi als Grundlayout das BorderLayout gewählt und dessen CENTER nochmals in ein BorderLayout unterteilt. Mit JPanels und dem GridLayout habe ich den Rest angeordnet.

Probleme:

  • Im vorgegebenen Menü ist links immer noch so ein Streifen, bei mir nicht. Wie bekomme ich den?
  • Die vier Buttons auf der linken Seite sind ein wenig zu tief; sie sollten eigentlich mit den Buttons rechts bündig sein. Ich kann mir nicht erklären, warum das so ist. Habt ihr eine Idee?
  • Und wenn wir grad schon dabei sind: Ich hätte gerne, dass bei „Ansicht“ „Standard“ schon beim Start ausgewählt ist. Mit set.Enabled oder sowas gings nicht. Mit was geht’s? (Ja, ich weiß, Standard schreibt man mit d, werde das noch abändern :wink:)

Danke für eure Antworten, Juli

Hier noch der Code (Ich weiß, Listen wären übersichtlicher, aber ich habs jetzt eben schon so gemacht):

package x;

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

public class TaschenrechnerView extends JFrame {
Container c;
JTextField t;
JPanel gitter, jp1, jp2, jp3;
JButton b2, b3, b4;
JButton c1, c2, c3, c4, c5;
JButton d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15,
d16, d17, d18, d19, d20;

public TaschenrechnerView() {
// Basiscontainer
c = getContentPane();
c.setLayout(new BorderLayout(12, 20)); // Abstände: (vertikal, horizontal)

// Zahlenzeile
t = new JTextField(„0,“);
t.setHorizontalAlignment(JTextField.RIGHT);
c.add(t, BorderLayout.NORTH);

// Zeile eins: 3 Buttons
jp1 = new JPanel(new GridLayout(1, 3, 5, 5));
b2 = new JButton(„Rücktaste“);
b3 = new JButton(„CE“);
b4 = new JButton(„C“);
b2.setMargin(new Insets(0, 0, 0, 0));
b2.setForeground(Color.RED);
b3.setForeground(Color.RED);
b4.setForeground(Color.RED);
jp1.add(b2);
jp1.add(b3);
jp1.add(b4);

// rechtes Gitter
jp3 = new JPanel(new GridLayout(4, 5, 5, 5));
d1 = new JButton(„7“);
d1.setForeground(Color.BLUE);
d2 = new JButton(„8“);
d2.setForeground(Color.BLUE);
d3 = new JButton(„9“);
d3.setForeground(Color.BLUE);
d4 = new JButton("/");
d4.setForeground(Color.RED);
d5 = new JButton(„sqrt“);
d5.setForeground(Color.RED);
d6 = new JButton(„4“);
d6.setForeground(Color.BLUE);
d7 = new JButton(„5“);
d7.setForeground(Color.BLUE);
d8 = new JButton(„6“);
d8.setForeground(Color.BLUE);
d9 = new JButton("*");
d9.setForeground(Color.RED);
d10 = new JButton("%");
d10.setForeground(Color.RED);
d11 = new JButton(„1“);
d11.setForeground(Color.BLUE);
d12 = new JButton(„2“);
d12.setForeground(Color.BLUE);
d13 = new JButton(„3“);
d13.setForeground(Color.BLUE);
d14 = new JButton("-");
d14.setForeground(Color.RED);
d15 = new JButton(„1/x“);
d15.setForeground(Color.RED);
d16 = new JButton(„0“);
d16.setForeground(Color.BLUE);
d17 = new JButton("+/-");
d17.setForeground(Color.BLUE);
d18 = new JButton(",");
d18.setForeground(Color.BLUE);
d19 = new JButton("+");
d19.setForeground(Color.RED);
d20 = new JButton("=");
d20.setForeground(Color.RED);

d1.setMargin(new Insets(0, 0, 0, 0));
d2.setMargin(new Insets(0, 0, 0, 0));
d3.setMargin(new Insets(0, 0, 0, 0));
d4.setMargin(new Insets(0, 0, 0, 0));
d5.setMargin(new Insets(0, 0, 0, 0));
d6.setMargin(new Insets(0, 0, 0, 0));
d7.setMargin(new Insets(0, 0, 0, 0));
d8.setMargin(new Insets(0, 0, 0, 0));
d9.setMargin(new Insets(0, 0, 0, 0));
d10.setMargin(new Insets(0, 0, 0, 0));
d11.setMargin(new Insets(0, 0, 0, 0));
d12.setMargin(new Insets(0, 0, 0, 0));
d13.setMargin(new Insets(0, 0, 0, 0));
d14.setMargin(new Insets(0, 0, 0, 0));
d15.setMargin(new Insets(0, 0, 0, 0));
d16.setMargin(new Insets(0, 0, 0, 0));
d17.setMargin(new Insets(0, 0, 0, 0));
d18.setMargin(new Insets(0, 0, 0, 0));
d19.setMargin(new Insets(0, 0, 0, 0));
d20.setMargin(new Insets(0, 0, 0, 0));

jp3.add(d1);
jp3.add(d2);
jp3.add(d3);
jp3.add(d4);
jp3.add(d5);
jp3.add(d6);
jp3.add(d7);
jp3.add(d8);
jp3.add(d9);
jp3.add(d10);
jp3.add(d11);
jp3.add(d12);
jp3.add(d13);
jp3.add(d14);
jp3.add(d15);
jp3.add(d16);
jp3.add(d17);
jp3.add(d18);
jp3.add(d19);
jp3.add(d20);

// CENTER vom ‚GrundBorderLayout‘ wird gespalten in neues BorderLayout
gitter = new JPanel(new BorderLayout(5, 5));
gitter.add(jp1, BorderLayout.NORTH);
gitter.add(jp3, BorderLayout.CENTER);
c.add(gitter, BorderLayout.CENTER);

// linke Spalte
jp2 = new JPanel(new GridLayout(5,1,5,5));
c5 = new JButton("");
c1 = new JButton(„MC“);
c2 = new JButton(„MR“);
c3 = new JButton(„MS“);
c4 = new JButton(„M+“);
c5.setMargin(new Insets(0, 0, 0, 0));
c1.setMargin(new Insets(0, 0, 0, 0));
c2.setMargin(new Insets(0, 0, 0, 0));
c3.setMargin(new Insets(0, 0, 0, 0));
c4.setMargin(new Insets(0, 0, 0, 0));
c1.setForeground(Color.RED);
c2.setForeground(Color.RED);
c3.setForeground(Color.RED);
c4.setForeground(Color.RED);
jp2.add(c5);
jp2.add(c1);
jp2.add(c2);
jp2.add(c3);
jp2.add(c4);
c.add(jp2, BorderLayout.WEST);

// Menü
JMenuBar men = new JMenuBar();
setJMenuBar(men);

JMenu bearbeiten = new JMenu(„Bearbeiten“);
men.add(bearbeiten);
JMenu ansicht = new JMenu(„Ansicht“);
men.add(ansicht);
JMenu hilfe = new JMenu("?");
men.add(hilfe);

JMenuItem kopieren = new JMenuItem(„Kopieren Strg+C“);
JMenuItem einfuegen = new JMenuItem(„Einfügen Strg+V“);
bearbeiten.add(kopieren);
bearbeiten.addSeparator();
bearbeiten.add(einfuegen);

JRadioButtonMenuItem standart = new JRadioButtonMenuItem(„Standart“);
JRadioButtonMenuItem wissenschaftlich = new JRadioButtonMenuItem(
„Wissenschaftlich“);
ButtonGroup bg = new ButtonGroup();
bg.add(standart);
bg.add(wissenschaftlich);
ansicht.add(standart);
// standart.setEnabled(true);
ansicht.add(wissenschaftlich);
ansicht.addSeparator();
JMenuItem zifferngrupierung = new JMenuItem(„Zifferngruppierung“);
ansicht.add(zifferngrupierung);

JMenuItem hilfethemen = new JMenuItem(„Hilfethemen“);
JMenuItem info = new JMenuItem(„Info“);
hilfe.add(hilfethemen);
hilfe.addSeparator();
hilfe.add(info);

}
}

Hallo,

Probleme:

  • Die vier Buttons auf der linken Seite sind ein wenig zu
    tief; sie sollten eigentlich mit den Buttons rechts bündig
    sein. Ich kann mir nicht erklären, warum das so ist. Habt ihr
    eine Idee?

Die Buttons liegen auf unterschiedlichen Containern, die „Grids“ des GridLayouts sind daher unabhängig voneinander. Java versucht beim Anpassen der Fenstergröße die Komponenten möglichst gut zu verteilen. Wenn du das Fenster in der Größe änderst wird sich auch der Versatz ändern. Wenn du nur ein Panel verwendest (und in der obersten Zeile einzelne Grids leer lässt) sollte das passen.

  • Und wenn wir grad schon dabei sind: Ich hätte gerne, dass
    bei „Ansicht“ „Standard“ schon beim Start ausgewählt ist. Mit
    set.Enabled oder sowas gings nicht. Mit was geht’s?

setSelected lautet die Methode: http://docs.oracle.com/javase/7/docs/api/javax/swing…

HTH
Heavy

Hallo,

danke für die schnelle Antwort!

Das mit der Methode hat natürlich geklappt, das mit den ‚Grids‘ noch nicht so…

Du meinst, ich soll nur ein Panel verwenden und ‚leere Grids‘ einfügen. Wie mach ich das?

Danke, Juli

Hallo,

Das mit der Methode hat natürlich geklappt, das mit den
‚Grids‘ noch nicht so…

Du meinst, ich soll nur ein Panel verwenden und ‚leere Grids‘
einfügen. Wie mach ich das?

ich benötige selten grafische Oberflächen, deshalb ist mir das nicht so geläufig. Leer lassen kann man beim GridLayout nichts, weil die Zellen nach und nach aufgefüllt werden. Als Workaround könnte man an den Stellen die „leer“ bleiben sollen z.B. ein Label ohne Text einfügen.

panel.add(new JLabel(""));

Keine elegante Lösung, sollte aber funktionieren.

Alternativ kannst du auch das GridBagLayout verwenden, da können einzelne Zellen größer werden.

Das TableLayout ist keine Standard Java-Klasse, wäre aber evtl. einfacher in der Verwendung: http://www.oracle.com/technetwork/java/tablelayout-1…

HTH
Heavy

Hi,

Ich glaub das MigLayout kann leere Zellen bzw auch nachträglich einfügen, ist aber etwas komplizierter.

http://www.miglayout.com/QuickStart.pdf

Gruß