2016-07-01 59 views
6

Voglio creare la seguente GUI con Java Swing.Come posso creare la seguente GUI in Java Swing?

GUI I want to have

Dal momento che non ho abbastanza esperienza con Java Swing, non sono sicuro di come ricreare esattamente questo GUI.

Ho provato con GridLayout che assomiglia a questo:

GridLayout

Ho provato altri LayoutManagers, ma a causa della mia inesperienza, non ho potuto ottenere qualcosa di simile anche lontanamente l'interfaccia grafica che voglio raggiungere.

Probabilmente devo usare GridBagLayout ma l'ho provato e semplicemente non è stato in grado di ottenere nulla. Non sono sicuro di come utilizzare esattamente GridBagLayout, soprattutto perché c'è una varianza della quantità di colonne necessarie (2, 2 e 3).

Ecco il codice utilizzato per la creazione del secondo GUI:

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

public class GUITest extends JFrame { 

public GUITest() { 
    super("Testing Title"); 
    Container pane = getContentPane(); 

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

    pane.add(getHeader()); 
    pane.add(getTextArea()); 
    pane.add(getButtonPanel()); 

} 

public JComponent getHeader() { 
    JPanel labelPanel = new JPanel(); 
    labelPanel.setLayout(new GridLayout(1,2)); 
    labelPanel.setSize(getPreferredSize()); 

    JLabel labelLocal = new JLabel("Left value: ", JLabel.CENTER); 
    JLabel labelDB = new JLabel("Right value: ", JLabel.CENTER); 

    labelPanel.add(labelLocal); 
    labelPanel.add(labelDB); 

    return labelPanel; 
} 

public JComponent getTextArea() { 
    JPanel textPanel = new JPanel(); 
    textPanel.setLayout(new GridLayout(1,2,5,0)); 

    JTextArea testTextArea = new JTextArea(); 
    testTextArea.setEditable(false); 
    JScrollPane sp1 = new JScrollPane(testTextArea); 

    JTextArea testTextArea2 = new JTextArea(); 
    JScrollPane sp2 = new JScrollPane(testTextArea2); 
    testTextArea2.setEditable(false); 

    testTextArea.setText("Hello Hello Hello\nTesting!\ntesterino\ntesteroni"); 
    testTextArea2.setText("Hello Hello Hello\nTesting!\ntest\nABC123\ncdef123\nhijk123"); 

    textPanel.add(sp1); 
    textPanel.add(sp2); 
    return textPanel; 
} 

public JComponent getButtonPanel() { 
    JPanel inner = new JPanel(); 
    inner.setLayout(new FlowLayout((FlowLayout.CENTER),0,100)); 
    inner.add(new JButton("Do something")); 
    inner.add(new JButton("Do something different")); 
    inner.add(new JButton("Do something even more different")); 
    return inner; 
} 

public static void main(String[] args) { 
    GUITest e = new GUITest(); 
    e.setSize(700, 500); 
    e.setVisible(true); 
    e.setResizable(false); 
    e.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    e.setLocationRelativeTo(null); 
} 
} 

Sono grato per qualsiasi tipo di supporto!

+0

Si potrebbe utilizzare 'MigLayout'. È facile –

+1

L'editor della GUI dell'IDE NetBeans sarebbe il mio approccio. Come tutto quel codice non è davvero interessante rispetto alla logica di business. Anche le proprietà e tali sono presentati per provare. –

+2

@JoopEggen Non capisco cosa stai cercando di dire .... è come quando ci sono due cose ma ti concentri su uno – taclight

risposta

5

Ecco il codice con solo alcuni piccoli cambiamenti :)

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

    public class GUITest extends JFrame { 

     public GUITest() { 

       super("Testing Title"); 
       Container pane = getContentPane(); 
       pane.setLayout(new BorderLayout());//Modified Layout to BorderLayout 
       pane.add(getHeader(),BorderLayout.NORTH); //BorderLayout.NORTH 
       pane.add(getTextArea(),BorderLayout.CENTER);//BorderLayout.CENTER 
       pane.add(getButtonPanel(),BorderLayout.SOUTH);//BorderLayout.SOUTH 

     } 

     public JComponent getHeader() { 

      JPanel labelPanel = new JPanel(); 
      labelPanel.setLayout(new GridLayout(1,2)); 
      labelPanel.setSize(getPreferredSize());  
      JLabel labelLocal = new JLabel("Left value: ", JLabel.CENTER); 
      JLabel labelDB = new JLabel("Right value: ", JLabel.CENTER); 
      labelPanel.add(labelLocal); 
      labelPanel.add(labelDB); 
      return labelPanel; 

     } 

    public JComponent getTextArea() { 

      JPanel textPanel = new JPanel();  
      textPanel.setLayout(new GridLayout(1,2,5,0)); 
      JTextArea testTextArea = new JTextArea(); 
      testTextArea.setEditable(false); 
      JScrollPane sp1 = new JScrollPane(testTextArea); 
      JTextArea testTextArea2 = new JTextArea(); 
      JScrollPane sp2 = new JScrollPane(testTextArea2); 
      testTextArea2.setEditable(false); 
      testTextArea.setText("Hello Hello Hello\nTesting!\ntesterino\ntesteroni"); 
      testTextArea2.setText("Hello Hello Hello\nTesting!\ntest\nABC123\ncdef123\nhijk123"); 
      textPanel.add(sp1); 
      textPanel.add(sp2); 
      return textPanel; 
    } 

    public JComponent getButtonPanel() { 

      JPanel inner = new JPanel(); 
      inner.setLayout(new FlowLayout());//Modified to standard FlowLayout 
      inner.add(new JButton("Do something")); 
      inner.add(new JButton("Do something different")); 
      inner.add(new JButton("Do something even more different")); 
      return inner; 

    } 

    public static void main(String[] args) { 

      GUITest e = new GUITest(); 
      e.pack(); //Modified setSize(700,500) to pack() 
      e.setVisible(true); 
      e.setResizable(false); 
      e.setDefaultCloseOperation(EXIT_ON_CLOSE); 
      e.setLocationRelativeTo(null); 
    } 
} 
+1

Rientra il codice correttamente. – user1803551

4

GridLayout dimensiona tutte le celle allo stesso modo, ovvero il layout esterno con 3 righe e 1 colonna crea 3 celle di tutte le stesse dimensioni.

Al contrario, utilizzare BorderLayout per il contenitore esterno e aggiungere la parte superiore, medio e pannelli inferiori con i vincoli BorderLayout.NORTH, BorderLayout.CENTER e BorderLayout.SOUTH rispettivamente

7

si potrebbe provare qualcosa di simile:

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

public class Example { 

    public static void main(String[] args) { 

     JFrame jFrame = new JFrame(); 
     jFrame.setTitle("Testing Title"); 
     jFrame.setLocationRelativeTo(null); 

     JPanel mainPanel = new JPanel(new BorderLayout()); 
     mainPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); 

     JPanel listPanel = new JPanel(new GridLayout(0, 2, 10, 0)); 

     JPanel leftListPanel = new JPanel(new BorderLayout(0, 10)); 
     JLabel leftLabel = new JLabel("Left value:"); 
     JTextArea leftTextArea = new JTextArea("Hello Hello Hello\nTesting!\ntest"); 
     JScrollPane leftScrollPane = new JScrollPane(leftTextArea); 
     leftListPanel.add(leftLabel, BorderLayout.NORTH); 
     leftListPanel.add(leftScrollPane, BorderLayout.CENTER); 

     JPanel rightListPanel = new JPanel(new BorderLayout(0, 10)); 
     JLabel rightLabel = new JLabel("Right value:"); 
     JTextArea rightTextArea = new JTextArea("Hello Hello Hello\nTesting!\ntest"); 
     JScrollPane rightScrollPane = new JScrollPane(rightTextArea); 
     rightListPanel.add(rightLabel, BorderLayout.NORTH); 
     rightListPanel.add(rightScrollPane, BorderLayout.CENTER); 

     listPanel.add(leftListPanel); 
     listPanel.add(rightListPanel); 
     mainPanel.add(listPanel, BorderLayout.CENTER); 

     JPanel buttonsPanel = new JPanel(new BorderLayout()); 
     buttonsPanel.setBorder(new EmptyBorder(10, 10, 10, 10)); 
     buttonsPanel.add(new JButton("Do something"), BorderLayout.WEST); 
     buttonsPanel.add(new JButton("Do something different"), BorderLayout.CENTER); 
     buttonsPanel.add(new JButton("Do something even more different"), BorderLayout.EAST); 
     mainPanel.add(buttonsPanel, BorderLayout.SOUTH); 

     jFrame.setContentPane(mainPanel); 
     jFrame.pack(); 
     jFrame.setVisible(true); 
    } 
} 

Spiegazione:

In primo luogo ho creato un principale JPanel con un BorderLayout. Questo JPanel verrà diviso orizzontalmente, il componente CENTRE sarà un altro JPanel contenente le aree di testo e le etichette e il componente SOUTH sarà un JPanel contenente i pulsanti.

Il JPanel che contiene le aree di testo viene dato un GridLayout modo che possa essere facilmente divisa verticalmente, ed è anche dato un hgap di 10 di aggiungere qualche spaziatura.

I numeri di telefono sinistro e destro JPanels inseriti sono identici. Hanno un BorderLayout con un vgap per aggiungere spaziatura. Il componente NORTH è un JLabel e il componente CENTRE è un JScrollPane contenente un JTextArea.

Infine, il componente SOUTH del principale JPanel è un'altra JPanel che è dato un BorderLayout nuovamente. Tre JButton vengono aggiunti con gli attributi WEST, CENTRE e EAST assegnati di conseguenza.

Il risultato complessivo si presenta come:

enter image description here

+0

Aggiungi le aree di testo nei riquadri di scorrimento. – user1803551

+0

@ user1803551 grazie, aggiornato – explv

Problemi correlati