3

Ich baue eine einfache GUI für eine Kurszuweisung, aber ich bekomme nicht das Beste daraus.Passen Sie Layout für 3 Spalten von gemeinsamen Komponenten mit anderen Komponenten über/unter

Also das ist mein Ziel:

Und ich diese bekommen (es einiger Elemente wie die Schaltfläche fehlt):

Also die Sache ist, wie kann ich Code mein Layout, enger zu sein wie im Zielbild?

-Code unten:

public class Panel1 extends JPanel{ 

    private JButton cancel = new JButton("Cancel"); 

    private JTextArea xTwin = new JTextArea(10, 30); 
    private JTextArea xCousin = new JTextArea(10, 30); 
    private JTextArea xSexy = new JTextArea(10, 30); 
    private JTextField getT = new JTextField(5); 
    private JTextField getC= new JTextField(5); 
    private JTextField getS = new JTextField(5); 

    private JLabel cnstT = new JLabel("How many twin primes do you want?"); 
    private JLabel cnstC = new JLabel("How many cousin primes do you want?"); 
    private JLabel cnstS = new JLabel("How many sexy primes do you want?"); 
    private JLabel msgTwin = new JLabel("Area primes 'twin' created"); 
    private JLabel msgCousin = new JLabel("Area primes 'cousin' created"); 
    private JLabel msgSexy = new JLabel("Area primes 'sexy' created"); 
    private JLabel msgGUI = new JLabel("GUI created"); 

    public Panel1(){ 
     xTwin.setEditable(false); 
     xCousin.setEditable(false); 
     xSexy.setEditable(false); 

     this.setLayout(new GridLayout(3, 1)); 
     JPanel p1 = new JPanel(); 
     JPanel p2 = new JPanel(); 
     JPanel p3 = new JPanel(); 

     p1.setLayout(new FlowLayout()); 
     p2.setLayout(new FlowLayout()); 
     p3.setLayout(new FlowLayout()); 

     p1.add(cnstT); p1.add(getT); p1.add(cnstC); p1.add(getC); 
     p1.add(cnstS); p1.add(getS); 
     p2.add(xTwin); p2.add(xCousin); p2.add(xSexy); 
     p3.add(msgTwin); p3.add(msgCousin); p3.add(msgSexy); 

     add(p1); add(p2); add(p3); 
    } 
+2

Für die drei Platten in der Mitte Sie eine Factory-Methode erstellen könnte, die eine 'String' (die Art der randoms) und möglicherweise auch andere Dinge, wie ein' SpinnerNumberModel' akzeptiert - und liefert ein Panel. Setzen Sie diese drei Felder in eine einzelne Zeile "GridLayout". Setzen Sie dieses Panel in die Mitte eines 'BorderLayout'. Fügen Sie ein Panel zum 'PAGE_START' mit einem' FlowLayout' für den Button hinzu. Fügen Sie ein 'JLabel' zu' PAGE_END' für die 'GUI erstellt'-Nachricht hinzu. Wenn Sie weitere Hilfe benötigen, veröffentlichen Sie ein [MCVE] oder [Short, Self Contained, Correct Example] (http://www.sscce.org/) für Ihren besten Versuch, diesen Ansatz zu implementieren. –

+1

@AndrewThompson ist korrekt; Das [Beispiel] (http://stackoverflow.com/a/37885601/230513) unten kombiniert die Fabrik- und Strategie-Muster. – trashgod

Antwort

3

Der Code unten sollten Sie den Fortschritt helfen.

 public Panel1(){ 
      xTwin.setEditable(false); 
      xCousin.setEditable(false); 
      xSexy.setEditable(false); 

      xTwin.setBorder(new LineBorder(Color.red)); 
      xCousin.setBorder(new LineBorder(Color.green)); 
      xSexy.setBorder(new LineBorder(Color.blue)); 

      this.setLayout(new BorderLayout()); 
      JPanel panel = new JPanel(new GridLayout(1, 3)); 
      JPanel buttonPane = new JPanel(new FlowLayout()); 
      buttonPane.add(cancel); 
      this.add(buttonPane,BorderLayout.NORTH); 
      this.add(panel,BorderLayout.CENTER); 



      JPanel p1 = new JPanel(); 
      JPanel p2 = new JPanel(); 
      JPanel p3 = new JPanel(); 

      p1.setLayout(new BorderLayout()); 
      p2.setLayout(new BorderLayout()); 
      p3.setLayout(new BorderLayout()); 

      JPanel twinPanel = new JPanel(new FlowLayout()); 
      twinPanel.add(cnstT); 
      twinPanel.add(getT); 
      p1.add(twinPanel, BorderLayout.NORTH); 
      p1.add(xTwin, BorderLayout.CENTER); 
      p1.add(msgTwin, BorderLayout.SOUTH); 

      JPanel cousinPanel = new JPanel(new FlowLayout()); 


      cousinPanel.add(cnstC); 
      cousinPanel.add(getC); 
      p2.add(cousinPanel, BorderLayout.NORTH); 
      p2.add(xCousin, BorderLayout.CENTER); 
      p2.add(msgCousin, BorderLayout.SOUTH); 


      JPanel sexyPanel = new JPanel(new FlowLayout()); 
      sexyPanel.add(cnstS); 
      sexyPanel.add(getS); 
      p3.add(sexyPanel, BorderLayout.NORTH); 
      p3.add(xSexy, BorderLayout.CENTER); 
      p3.add(msgSexy, BorderLayout.SOUTH); 
      panel.add(p1); 
      panel.add(p2); 
      panel.add(p3); 
     } 

Und dies war das Ergebnis. (Sorry über die Grenzen)

enter image description here

+0

Vielen Dank für den Code! Es war eine sehr nützliche Anleitung zur Verwendung der verschiedenen Java-Layouts. Ich war sicher verloren mit GridLayout und BorderLayout. – fant0me

1

Ihr Problem in der folgenden Codezeile befindet

this.setLayout(new GridLayout(3, 1)); 

Die Grid ist soll die GUI in Regionen gleicher Größe aufteilen, dh die eingebetteten Komponenten haben nicht ihre natürliche Größe z.B. gestreckt werden ...

Verwenden Sie stattdessen einen anderen Layoutmanager! Es gibt sevaral Varianten passend auf Ihre Bedürfnisse ...

Für weitere Informationen über die Layoutmanagers und ihre beabsichtigte Funktionalität, besuchen this website

+0

Ja, ich hatte kein klares Konzept darüber, wie die Java-Layouts die Komponenten verteilen. Danke vielmals! – fant0me

2

Da die die Platten unterscheiden sich nur in Name und Funktion, verwenden Sie die strategy pattern, gesehen here, um das gewünschte Verhalten zur Laufzeit auszuwählen. Das folgende Beispiel zeigt eine enum, von denen jede Instanz einen Anzeigenamen und eine Funktion enthält, die eine Ganzzahl verwendet und ein Paar oder ganze Zahlen zurückgibt: Function<Integer, Pair<Integer, Integer>>. Die tatsächlich verwendeten Funktionen sind Platzhalter; Sie können einen der Ansätze here ersetzen.

image

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.GridLayout; 
import java.util.function.Function; 
import javafx.util.Pair; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JSpinner; 
import javax.swing.JTextArea; 
import javax.swing.event.ChangeEvent; 

/** 
* @see https://stackoverflow.com/a/37885601/230513 
*/ 
public class StrategyTest { 

    private enum Kind { 
     TWIN((new Function<Integer, Pair<Integer, Integer>>() { 
      @Override 
      public Pair<Integer, Integer> apply(Integer i) { 
       return new Pair<>(i, i + 2); 
      } 
     })), 
     COUSIN((new Function<Integer, Pair<Integer, Integer>>() { 
      @Override 
      public Pair<Integer, Integer> apply(Integer i) { 
       return new Pair<>(i, i + 4); 
      } 
     })), 
     SEXY((new Function<Integer, Pair<Integer, Integer>>() { 
      @Override 
      public Pair<Integer, Integer> apply(Integer i) { 
       return new Pair<>(i, i + 6); 
      } 
     })); 
     String dsiplayName; 
     Function<Integer, Pair<Integer, Integer>> function; 

     private Kind(Function<Integer, Pair<Integer, Integer>> function) { 
      this.dsiplayName = name().toLowerCase(); 
      this.function = function; 
     } 
    } 

    private JPanel createPanel(Kind kind) { 
     JPanel panel = new JPanel(new BorderLayout()); 
     JSpinner spinner = new JSpinner(); 
     JPanel top = new JPanel(); 
     top.add(new JLabel("How many " + kind.dsiplayName + " primes?")); 
     top.add(spinner); 
     panel.add(top, BorderLayout.PAGE_START); 
     JTextArea textArea = new JTextArea(16, 20); 
     panel.add(new JScrollPane(textArea)); 
     panel.add(new JLabel("Area for " + kind.dsiplayName + " primes.", 
      JLabel.CENTER), BorderLayout.PAGE_END); 
     spinner.addChangeListener((ChangeEvent e) -> { 
      int i = (int) spinner.getValue(); 
      Pair<Integer, Integer> p = kind.function.apply(i); 
      textArea.append(p.getKey() + ":" + p.getValue() + "\n"); 
     }); 
     return panel; 
    } 

    private void display() { 
     JFrame f = new JFrame("StrategyTest"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setLayout(new GridLayout(1, 0, 5, 5)); 
     for (Kind kind : Kind.values()) { 
      f.add(createPanel(kind)); 
     } 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new StrategyTest()::display); 
    } 
} 
+0

Wow @trashgod, das ist eine recht einfach zu bedienende und unkomplizierte Layout-Konfiguration als die typische. Auch wenn ich noch nicht über SW-Designmuster informiert bin, ist es sehr interessant zu sehen, dass es angewendet wird! – fant0me

+0

@flamenquino: Wenn Sie Ihre Studien verfolgen, behalten Sie dieses Muster im Hinterkopf, wenn Sie gebeten werden, zwei (oder mehr) Algorithmen zu vergleichen. – trashgod