/ / GUI JTextArea & JScrollPane i pozycjonowanie - java, swing, layout-manager

GUI JTextArea i JScrollPane i pozycjonowanie - java, swing, layout-manager

Chciałbym dodać do okna zaczynając od pozycji x, y JTextArea zwojami. Problem polega na tym, że kiedy wizualizuję kod, wypełnia on okno 500x500 i chcę wypełnić tylko 200x200 pełnych w x, y pos.

Co ja robię źle? Oto mój kod:

public static void main(String args[])
{
JFrame window = new JFrame();
window.setSize(500, 500);
window.setResizable(false);

JTextArea ta = new JTextArea("Default message");
ta.setEditable(true);

JScrollPane scroll = new JScrollPane(ta);
scroll.setBounds(10,10,200,200);
window.add(scroll);

window.setVisible(true);
}

Odpowiedzi:

3 dla odpowiedzi № 1

Obszar tekstowy wyściełany

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

public class PaddedTextArea {

public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
// the GUI as seen by the user (without frame)
JPanel gui = new JPanel(new BorderLayout());
// adjust as needed
gui.setBorder(new EmptyBorder(20,10,20,10));

// better way to size a text area is using columns/rows
// in the constructor
JTextArea ta = new JTextArea(3,40);
JScrollPane sp = new JScrollPane(ta);
gui.add(sp);

JFrame f = new JFrame("Padded Text Area");
f.add(gui);
// Ensures JVM closes after frame(s) closed and
// all non-daemon threads are finished
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
// See https://stackoverflow.com/a/7143398/418556 for demo.
f.setLocationByPlatform(true);

// ensures the frame is the minimum size it needs to be
// in order display the components within it
f.pack();
// should be done last, to avoid flickering, moving,
// resizing artifacts.
f.setVisible(true);
}
};
// Swing GUIs should be created and updated on the EDT
// http://docs.oracle.com/javase/tutorial/uiswing/concurrency
SwingUtilities.invokeLater(r);
}
}

Bardziej ogólnie: Interfejsy graficzne Java mogą działać na wielu platformach, na różnych rozdzielczościach ekranu i wykorzystywać różne PLAF. Jako takie nie sprzyjają dokładnemu rozmieszczeniu komponentów. Aby uporządkować komponenty dla niezawodnego interfejsu GUI, zamiast tego użyj menedżerów układu lub ich kombinacje1, wraz z wypełnieniem układu i granicami dla Biała przestrzeń2.


4 dla odpowiedzi nr 2

Nie używaj setBounds () do ustawiania rozmiaru komponentu Swing używa menedżerów układu do zmiany rozmiaru komponentu.

Domyślnie JFrame używa BorderLayout i dodajesz komponent do CENTER, aby komponent zajmował całą dostępną przestrzeń.

Zamiast tego wykonaj coś takiego:

JTextArea text Area = new JTextArea(5, 40);
JScrollPane scrollPane = new JScrollPane( textArea );
frame.add(scrollPane, BorderLayout.NORTH);
frame.pack();
frame.setVisible();

Po wyświetleniu ramki obszar tekstowy będziezajmują całą przestrzeń, ale jeśli zmienisz rozmiar ramki, obszar tekstowy będzie wyświetlany tylko w PÓŁNOCY, aw CENTRUM będzie puste miejsce.