Komponenty, przyciski, JTextField - potrzebna pomoc

0

Mam zyskać komponenty i rozkład jak na rysunku: http://i60.tinypic.com/fuw6qg.jpg
I zadanie:

  • przyciski A1-A3 są wyrównane w lewo i nie zmieniają swoich rozmiarów, zrobione +
  • przyciski B1-B3 są wyrównane w prawo i nie zmieniają swoich rozmiarów, zrobione +
    __- przyciski numeryczne nie zmieniają swoich rozmiarów,
  • pola tekstowe (JTextField) mogą zmieniać swoje rozmiary i położenie.__

Po próbowaniu wielu sposobów wyszło mi coś takiego:

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

public class Rozklady {
	
    public static void main(String[] args) {
    	
        JFrame frame = new JFrame();
        
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(400, 350));
        
        frame.setLocationRelativeTo(null); 
        frame.setLayout(new GridLayout(3, 1));

        JPanel panelTopLeft = new JPanel();
        panelTopLeft.setLayout(new FlowLayout(FlowLayout.LEFT));
        panelTopLeft.add(new JButton("A1"));
        panelTopLeft.add(new JButton("A2"));
        panelTopLeft.add(new JButton("A3"));

        JPanel panelTopRight = new JPanel();
        panelTopRight.setLayout(new FlowLayout(FlowLayout.RIGHT));
        panelTopRight.add(new JButton("B1"));
        panelTopRight.add(new JButton("B2"));
        panelTopRight.add(new JButton("B3"));

        JPanel panelTopContainer = new JPanel();
        panelTopContainer.setLayout(new GridLayout(1, 2));
        panelTopContainer.add(panelTopLeft);
        panelTopContainer.add(panelTopRight);

        frame.add(panelTopContainer);
        frame.add(new JTextArea());

          JPanel panelBottomLeft = new JPanel();
        panelBottomLeft.setLayout(new GridLayout(3, 3));
        for (int x = 1; x < 10; x++) {
            panelBottomLeft.add(new JButton("" + x));
        }

        JPanel panelBottomRight = new JPanel();
        panelBottomRight.setLayout(new GridLayout(3, 1));
        for (int x = 0; x < 3; x++) {
            panelBottomRight.add(new JTextField());
        }

        JPanel panelBottomContainter = new JPanel();
        panelBottomContainter.setLayout(new GridLayout(1, 2));
        panelBottomContainter.add(panelBottomLeft);
        panelBottomContainter.add(panelBottomRight);

        frame.add(panelBottomContainter);
        frame.pack();
        frame.setVisible(true);
    }
} 

Z tym, że jak podane wyżej tylko 2 założenia zadania się zgadzają.
Co prawda przycisków na dole jest 9 ale zmieniają swoją wielkość. Nie wiem jak sprawić by jej nie zmieniał.
Chcę by okno było na środku ekranu, dałem:

       frame.setLocationRelativeTo(null);  

ale okno pojawia mi się gdzieś na dole ekranu.
Nie wiem też jak wytworzyć ten środek okna, z napisem i suwakami.

Mógłby ktoś mi pomóc z tym?
Próbuję przerabiać jakieś kody z tutoriali ale czym więcej kombinuje tym jeszcze gorzej mi się to okno rozwala, albo znika to co już jest dobrze.
Byłbym bardzo wdzięczny, gdyby ktoś zechciał pomóc, powiedział co pozmieniać lub jak pozmieniać.
Dopiero zaczynam przygodę z GUI i już mam problem, a nie chcę potem przechodzić do innych rzeczy bez wyjaśnienia tego, bo tylko nazbiera mi się braków.

0

Poczytaj o JScrollPane, to wyjaśni Ci większość twoich problemów. Ogólnie idea jest taka że tworzysz ScrollPane, jako argument podając TextArea i dodajesz ScrollPane do kontenera :)

0

Jeśli da się LocationRelativeTo na końcu kodu:

\
frame.setLocationRelativeTo(null); 
frame.setVisible(true);

To okno będzie się wyświetlało na środku.

Ja mam pytanie co do ustawienia przycisków numerycznych, które nie zmieniają wielkości.
Jeśli jest tak:

    JPanel panelBottomLeft = new JPanel();
        panelBottomLeft.setLayout(new GridLayout(3, 3));
        for (int x = 1; x < 10; x++) {
            panelBottomLeft.add(new JButton("" + x));
        }

To mamy co prawda 9 przycisków i są w 3 wierszach i 3 kolumnach (bo GridLayout tak je ustawi) ale zmieniają rozmiar po zmianie wielkości ramki.

Jeśli z kolei zrobię tak:

 panelBottomLeft.setLayout(new FlowLayout(FlowLayout.LEFT));

To nie będą zmieniać rozmiaru ale będą w jednej linii (chyba, że ramka będzie mała, to się przemieszczą na dwie itd).
Co z tym zrobić?
Da się łączyć FlowLayout i GridLayout razem?

1

Da się.

JPanel panelBottomLeft = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel panel = new JPanel(new GridLayout(3,3,2,2));
for (int x = 1; x < 10; x++) 
{
     panel.add(new JButton("" + x));
}
panelBottomLeft.add(panel);
add(panelBottomLeft);
0

O, dziękuję ślicznie :)
Teraz jest jak należy.
Jeszcze męczę ten kod, bo chciałabym dać sobie z nim radę (pewnie dla osoby, która o niego pytała też to się przyda, przy okazji).
Udało się zrobić JTextArea (choć jest jakoś nisko względem przycisków i nie mogę znaleźć gdzie to ustawić :( ).
I jeszcze obramowanie JTextField, czy dodam w pętli czy nie to ramka jest dookoła wszystkich prostokątów, a nie każdego z osobna.
Przerobiony kod:

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

public class Rozklady {
	
    public static void main(String[] args) {
    	
        JFrame frame = new JFrame();
        
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(400, 350));
		frame.setLayout(new GridLayout(3, 1));

        JPanel panelTopLeft = new JPanel();
        panelTopLeft.setLayout(new FlowLayout(FlowLayout.LEFT));
        panelTopLeft.add(new JButton("A1"));
        panelTopLeft.add(new JButton("A2"));
        panelTopLeft.add(new JButton("A3"));

        JPanel panelTopRight = new JPanel();
        panelTopRight.setLayout(new FlowLayout(FlowLayout.RIGHT));
        panelTopRight.add(new JButton("B1"));
        panelTopRight.add(new JButton("B2"));
        panelTopRight.add(new JButton("B3"));

        JPanel panelTopContainer = new JPanel();
        panelTopContainer.setLayout(new GridLayout(1, 2));
        panelTopContainer.add(panelTopLeft);
        panelTopContainer.add(panelTopRight);

        frame.add(panelTopContainer);

	 JPanel panelMiddle = new JPanel();
	 JTextArea textArea = new JTextArea(300,300);
     frame.add(new JScrollPane(textArea));
	 textArea.append("To jest JTextArea");

        JPanel panelBottomLeft = new JPanel(new FlowLayout(FlowLayout.LEFT));
		JPanel panel = new JPanel(new GridLayout(3,3,2,2));
		for (int x = 1; x < 10; x++) {
    		 panel.add(new JButton("" + x));
			}
		panelBottomLeft.add(panel);
		frame.add(panelBottomLeft);

        JPanel panelBottomRight = new JPanel();
        panelBottomRight.setLayout(new GridLayout(3, 1));
        for (int x = 0; x < 3; x++) {
            panelBottomRight.add(new JTextField("To jest JTextField"));
            panelBottomRight.setBorder( BorderFactory.createLineBorder(Color.RED) );
        }

        JPanel panelBottomContainter = new JPanel();
        panelBottomContainter.setLayout(new GridLayout(1, 2));
        panelBottomContainter.add(panelBottomLeft);
        panelBottomContainter.add(panelBottomRight);

        frame.add(panelBottomContainter);
        frame.pack();
        frame.setLocationRelativeTo(null); 
        frame.setVisible(true);
         
    }
}

Efekt:
http://i59.tinypic.com/2hqtpw4.png
Powoli przypomina to wygląd jaki kazali uzyskać w zadaniu. Jednak jeszcze trzeba poprawić co nieco i ja niespecjalnie wiem jak :(
Rozumiem, że drobne różnice nie są tu tak istotne (np. to, że ramka ma inny kolor to chyba kwestia programu?) po prostu muszą być spełnione wymogi zadania. Więc do poprawy zostaje ta czerwona ramka i (pewnie banalny i głupi błąd) odstęp pomiędzy przyciskami A1, A2... a JTextArea.

Ok, udało mi się zrobić czerwone ramki:

        JPanel panelBottomRight = new JPanel();
        panelBottomRight.setLayout(new GridLayout(3,1,1,1));
        for (int x = 0; x < 3; x++) {
        	JTextField field = new JTextField(20);
			field.setText("To jest JTextField");
        Border border = BorderFactory.createLineBorder(Color.RED, 1);
		field.setBorder(border);
		panelBottomRight.add(field);

        } 

Teraz wygląda to tak:
http://i62.tinypic.com/kb8112.png

1

Dopóki masz w całym oknie GridLayout, to odstępu nie zlikwidujesz. Poza tym, obramowanie ma mieć każde JTextField.

 import java.awt.*;
import javax.swing.*;
 
public class Rozklady {
 
    public static void main(String[] args) {
 
        JFrame frame = new JFrame();
 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(400, 350));
        frame.setLayout(new BorderLayout(2,2));
 
        JPanel panelTopLeft = new JPanel();
        panelTopLeft.setLayout(new FlowLayout(FlowLayout.LEFT));
        panelTopLeft.add(new JButton("A1"));
        panelTopLeft.add(new JButton("A2"));
        panelTopLeft.add(new JButton("A3"));
 
        JPanel panelTopRight = new JPanel();
        panelTopRight.setLayout(new FlowLayout(FlowLayout.RIGHT));
        panelTopRight.add(new JButton("B1"));
        panelTopRight.add(new JButton("B2"));
        panelTopRight.add(new JButton("B3"));
 
        JPanel panelTopContainer = new JPanel();
        panelTopContainer.setLayout(new GridLayout(1, 2));
        panelTopContainer.add(panelTopLeft);
        panelTopContainer.add(panelTopRight);
 
        frame.add(panelTopContainer,BorderLayout.NORTH);
 
        JTextArea textArea = new JTextArea("To jest JTextArea",30,80);
        frame.add(new JScrollPane(textArea),BorderLayout.CENTER);
 
        JPanel panelBottomLeft = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JPanel panel = new JPanel(new GridLayout(3,3,2,2));
        for (int x = 1; x < 10; x++) {
             panel.add(new JButton("" + x));
            }
        panelBottomLeft.add(panel);
 
        JPanel panelBottomRight = new JPanel();
        panelBottomRight.setLayout(new GridLayout(3,1,2,2));
        for (int x = 0; x < 3; x++) {
            JTextField tf = new JTextField("To jest JTextField");
            tf.setBorder( BorderFactory.createLineBorder(Color.RED) );
            panelBottomRight.add(tf);
        }
 
        JPanel panelBottomContainter = new JPanel();
        panelBottomContainter.setLayout(new GridLayout(1, 2));
        panelBottomContainter.add(panelBottomLeft);
        panelBottomContainter.add(panelBottomRight);
 
        frame.add(panelBottomContainter,BorderLayout.SOUTH);
        frame.pack();
        frame.setLocationRelativeTo(null); 
        frame.setVisible(true);
 
    }
}
0

O, bardzo dziękuję :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1