2016-04-13 5 views
0

Wie würde ich meinem Code Gridbag-Layout hinzufügen, damit das Ausgabefeld die Länge von gui innerhalb der Rahmenparameter im folgenden Code umfasst? Ich habe zwei andere Klassen, die mit dieser Arbeit gut gehen. Wenn das GUI auffüllt, funktioniert alles, außer das Ausgabe-Textfeld überspannt nicht die Länge von gui, so dass der Text im Textfeld abgeschnitten ist und ich das beheben will, aber ich weiß nicht, wie ich es so machen soll wie nie gebrauchte Gittertasche.Wie muss ich GridBagLayout implementieren?

unten zeigt das Bild, wie die GUI aussehen soll:

ATM GUI Der Code in Frage

gegeben unten:

public ATMGui() { 
     checkingAcc = new Account(1000); 
     savingAcc = new Account(2000); 
     currentSelect = new Account(0); 
     atmFrame = new JFrame("Automated Teller Machine"); 
     output = new JTextField(); 
     panel = new JPanel(); 

, dass ich glaube, das Problem, weil sein kann ich hat die Größe der Ausgabebox nicht vollständig deklariert, so dass sie nur ein Raster sozusagen überspannt, während ich möchte, dass sie beide überspannt. Kann mir jemand bei der Entscheidung helfen, ob ich das Raster im obigen Code anders deklariere oder ob es untergeht? Außerdem habe ich über GridBagLayout und andere Methoden gelesen, aber mein Problem ist, dass ich nicht sicher bin, wie/wo ich es hier implementieren soll.

 atmWithdraw = new JButton("Withdraw"); 
     atmDeposit = new JButton("Deposit"); 
     transfer = new JButton("Transfer to"); 
     balance = new JButton("Balance"); 
     atmWithdraw.addActionListener(this); 

     panel.setLayout(new GridLayout(4, 2)); 
     panel.setBorder(BorderFactory.createEmptyBorder(15, 15, 0, 15)); 
     panel.add(atmWithdraw, 0); 
     panel.add(atmDeposit, 1); 
     panel.add(transfer, 2); 
     panel.add(balance, 3); 
     panel.add(checking, 4); 
     panel.add(savings, 5); 
     panel.add(output, BorderLayout.LINE_END); 
     atmFrame.add(panel); 

     atmFrame.setSize(300, 175); 
     atmFrame.setVisible(true); 
+0

Wenn Sie noch nie GridBagLayout verwendet haben, jetzt ist die Zeit, – ControlAltDel

+0

zu lernen, das kein SSCCE ist !!! Wir sind an keinem Code interessiert, der NICHT direkt mit dem Layout der Komponenten auf dem Frame verbunden ist, da sich Ihre Frage speziell auf Layout-Manager bezieht. – camickr

+0

habe es danke und danke für den Link – 3monkeys1gorilla

Antwort

2

i nie GridBagLayout

starten durch das Lesen der Abschnitt aus dem Swing-Tutorial auf How to Use GridBagLayout für den Arbeitsbeispielen verwendet haben.

Das Arbeitsbeispiel zeigt, wie eine Schaltfläche die gesamte Breite des Rahmens umfassen kann. Sie müssen mit der "grid width" Einschränkung spielen. Das Lernprogramm erläutert, wie alle Einschränkungen verwendet werden.

Die andere Möglichkeit besteht darin, Layout-Manager zu verschachteln. Vielleicht verwenden Sie also den Standard des Frames. Dann erstellen Sie ein Panel und fügen mit dem GridBagLayout einige Komponenten zum Panel hinzu und fügen dann das Panel zum CENTER hinzu. Dann können Sie Ihre "Ausgabebox" zu BorderLayout.PAGE_END hinzufügen. Standardmäßig füllt die Komponente den horizontalen Raum aus.

Der Punkt ist die Tutorials lesen und lernen Sie die Grundlagen der einzelnen Layout-Manager. Verwenden Sie dann die entsprechende Kombination von Layoutmanagern, um die Aufgabe zu erledigen.

+0

Ich habe es gelesen und ich lese das Problem ist ich selbst unterrichtet hauptsächlich mit Online-College, das überhaupt nicht hilft, so das Lesen ist wie ein bisschen verwirrend, aber ich versuche, die Konzepte zu verstehen, so dass alles Sinn macht – 3monkeys1gorilla

+0

'Ich bin Autodidakt' Ich auch, deshalb benutze ich das Tutorial für Arbeitsbeispiele, um die Grundlagen zu verstehen. Laden Sie den Demo-Code herunter und testen Sie ihn. Lernen Sie mit Beispiel. Wenn es eine bestimmte Frage zum Tutorial-Code gibt, dann fragen Sie sie, aber wir raten Ihnen, was Sie vielleicht über den Arbeitscode verstehen oder nicht. – camickr

+0

Also habe ich mit dem c.fill herumgespielt und was nicht und ich habe es laufen lassen, aber das nächste, was ich bekommen habe war, dass das Ausgabefenster praktisch verschwunden war und neben dem Radioknopf war. Ich nehme an, dass ich an diesem Punkt das Konzept verstehe. Ich bin mir nicht sicher, wie ich es auf meine spezifische Problemstellung anwenden soll, wenn das Sinn macht. – 3monkeys1gorilla

1

Mein Rat ist nicht, GridBagLayout zu verwenden, sondern etwas, das etwas einfacher zu verwenden ist (aber genauso leistungsstark) wie TableLayout (http://www.oracle.com/technetwork/java/tablelayout-141489.html). So verwenden Sie umfassen laden Sie die Bibliothek und umfassen in Classpath oder verwenden Sie die folgenden Maven gehören: -

<dependency> 
    <groupId>info.clearthought</groupId> 
    <artifactId>table-layout</artifactId> 
    <version>4.3.0</version> 
</dependency> 

(Siehe https://github.com/nerro/table-layout für weitere Details)

Einmal aufgenommen, dann können Sie Ihre Tabellen-Layout als einfacher definieren 2 dimensionales Zahlenfeld z

import info.clearthought.layout.TableLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JRadioButton; 
import javax.swing.JTextField; 

public class Test { 

    public static void main(String [] args) { 

     // Create JPanel using TableLayout as layout manager 

     double PREF = TableLayout.PREFERRED; 
     double BORDER = 10; 
     double size[][] = { { BORDER, 0.50, 10, 0.50, 10 }, { 10, PREF, 10, PREF, 10, PREF, 10, PREF, 10 } }; 

     JPanel panel = new JPanel(new TableLayout(size)); 

     panel.add(new JButton("Withdraw"), "1,1"); 
     panel.add(new JButton("Deposit"), "3,1"); 
     panel.add(new JButton("Transfer to"), "1,3"); 
     panel.add(new JButton("Balance"), "3,3"); 

     panel.add(new JRadioButton("Checking"), "1,5"); 
     panel.add(new JRadioButton("Savings"), "3,5"); 

     panel.add(new JTextField(), "1,7,3,7"); 

     // Add to JFrame and Display 

     JFrame frame = new JFrame("ATM Machine"); 
     frame.setSize(300, 200); 
     frame.setContentPane(panel); 
     frame.setVisible(true); 
    } 
} 

Der vorherige Code erzeugt den folgenden: -

enter image description here

Hinweis, dass das Layout ist wie folgt definiert: -

double size[][] = { { WIDTH1, WIDTH2, ... }, { HEIGHT1, HEIGHT2, ... } };` 

Die 2 Spaltenbreiten sind als 50% festgelegt oder 0,50. Alle reellen Zahlen in dem Bereich [0.0..1.0) repräsentieren Prozentsätze z.B. siehe die BORDER Variable. Die Konstante FILL wird zu 100% dem skalierbaren Raum zugewiesen, und PREFERRED füllt die bevorzugte Größe der Komponente. Dies ermöglicht eine schöne Größenänderung des Fensters.

Um dann zu diesem Rahmen hinzuzufügen, ist es meilenweise einfacher als GridBagLayout, d.h. einfach die Zellen-X/Y-Positionen, z.

panel.add(new JButton("Withdraw"), "1,1"); 
panel.add(new JButton("Deposit"), "3,1"); 

Wir können mehrere Spalten erstrecken, wie folgt: -

panel.add(new JTextField(), "1,7,3,7"); 

Dieser erstreckt sich über die JTextField von Spalte 1 Spalte 3 in Reihe 7.

Für anspruchsvollere Anwendungen finden Sie unter: -

http://www.clearthought.info/sun/products/jfc/tsc/articles/tablelayout/Simple.html

+0

Ich habe das Tutorial gelesen, aber ich glaube nicht, dass dies helfen wird, aber ich werde mit diesem experimentieren, nur nicht auf dieses Projekt, ich versuche einfach einen Weg zu finden, um die Ausgangs-Box auf die anfängliche gui Pop-up-Erweiterung in den Rahmen, so dass die Ausgabe nicht abgeschnitten wird, wenn die Funktionen dieser Code Vielen Dank für Ihre Eingabe obwohl – 3monkeys1gorilla

+0

können Sie einen Screenshot von dem, was Sie versuchen zu erreichen (Ich habe versucht, Ihren Code auszuführen, aber es didn wegen fehlender Klassen nicht funktionieren. Es gibt noch keinen GUI-Bildschirm in Java, den ich nicht mit TableLaoyout erstellen kann. – bobmarksie

+0

Aktualisierte Antwort, um zu zeigen, wie TableLayout dies implementieren würde – bobmarksie