GUI wygląda dobrze pod Linuksem, na Windows nieco ucięte - dlaczego?

0

Cześć.

Mam nadzieję, iż nie obrazicie się, że zakładam tematy często ostatnimi czasy :) Wiem, że z perspektywy bardziej zaawansowanej osoby me pytania mogą wyglądać tak banalnie, że aż nie chce się na nie odpowiadać, jednak może znajdzie się ktoś, kto zechce podzielić się swoją wiedzą.

Mianowicie napisałem sobie prosty notatnik i TextArea ustawiłem tak, iż idelnie lewa i prawa strona ze scrollem dotykają krawędzi okna. Niestety pod Linuksem wygląda to wszystko OK, ale pod Windows - prawa część okna (scroll) jest ucięty - wygląda to tak, że prawa część okna ze scrollem chowa się od połowy za ramką okna, nadawaną przez Windows. Ogólnie mam spore cuda z tym, ponieważ choć wyśrodkowałem idealnie TextArea i wyglądało to świenie pod Linuksem, to zawsze pod Windows nieco się chrzaniło - a to coś było nieco bardziej w lewo, a to coś za nisko, przesunąłem coś w lewo i pod Linuksem wyglądało dobrze, pod Windows źle (a korzystam odgórnie z LookAndFeel Nimbus, więc nie jest to kwestia oddzielnego wyglądu dla każdego z systemów). Dziwne :-/ Znam tego typu cuda z webmasterki, ale Java? :) Myślałem, że GUI zawsze będzie wyglądać tak samo między systemami (a może coś w tym jest, że czasem niektórzy wydają program w Javie osobno na każdy system?). Nie wiem już, czy jest to kwestia ramkowania po stronie systemu operacyjnego, czy to coś w kwestii Javy.

Czy przyczyną może być to, że mam zablokowane okno (setResizable na false, jednak ten notatnik piszę dla siebie i nie potrzebuję rozciągania, choć z drugiej strony nie wiedziałem jak ustawić TextArea na rozmiar dynamiczny do okna)?

Kod odpowiedzialny za obszar tekstu:

//ADDING TEXT_AREA
		JTextArea textArea = new JTextArea();
		add(textArea);

		//ADDING SCROOL
		JScrollPane scrollPane = new JScrollPane(); 
		scrollPane.setBounds(-3, 10, 643, 420) //chowanie lewej krawędzi nieco za krawędź okna;
		scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		scrollPane.setViewportView(textArea);
		add(scrollPane);

Wygląda to tak:

1

ucina Ci, bo nie doliczyłeś tego że na windowsie masz grubsze obramowanie okna, które też się liczy w rozmiar. a jtextarea jeśli masz dobry layout to powinno się samo rozciągać (już nie pamiętam nic ze swinga ;) )

1

Ogólnie rzecz biorąc jeżeli zależy Ci na przenośności raz napisanego GUI, to powinieneś tą przenośność zapewnić. Jednym ze sposobów, jest stosowanie się do zasad responsywności implementowanych komponentów. Tak jak napomknął @Johnny_Bit, i co zresztą widać gołym okiem, w Windowsie masz inne wymiary ramki okna, w którym wyświetlasz zawartość swojej apki. Powinieneś więc zastosować taki Layout, aby komponenty układały się względem siebie uniwersalnie niezależnie od środowiska, w którym odpalasz apkę. Jedną z możliwości jest skorzystanie z BorderLayout i osadzenie JScrollPane'a w jego centrum:

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class DemoWindow extends JFrame {
	
	private static final long serialVersionUID = 1L;

	public static void main(String args[]) {
		
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				DemoWindow window = new DemoWindow();
				window.setVisible(true);
			}
		});
	}
	
	DemoWindow() {
		
		/* layout */
		JPanel layout = new JPanel();
		layout.setLayout(new BorderLayout());
		
		/* layout -> scrollpane */
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		
		/* layout -> scrollpane -> textarea */
		JTextArea textArea = new JTextArea();
		
		/* */
		scrollPane.setViewportView(textArea);
		layout.add(scrollPane, BorderLayout.CENTER);
		this.setContentPane(layout);
		
		this.setSize(400, 400);
		this.setResizable(false);
	}
}
0

@Gjorni_Na_Obiedzie - o to chodziło. Nie wiedziałem o istnieniu BorderLayout, tylko układałem układ z palca. Dziękuję Wam serdecznie za pomoc.

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