TextArea zmienia rozmiar po naciśnięciu Enter

0

Mam problem. Umieściłem w GridBagLayoucie 2 obszary tekstowe i chciałbym żeby podczas wpisywania czegoś po naciśnięciu ENTER, TextArea "tren" oraz "diet" nie rozszerzał mi się w dół.

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.GregorianCalendar;
import javax.swing.*;

class OknoWpiszDane extends JFrame 
{
	private static final long serialVersionUID = 2331143241L;
	private JComboBox<String> godzina;
	private JComboBox<String> minuta;
	private JComboBox<String> dzien;
	private JComboBox<String> miesiac;
	private JTextArea tren;
	private JTextArea diet;
	private JCheckBox alarm;
	private JButton zapisz;
	private GregorianCalendar terminTren;
	private ButtonGroup grupa;
	private JRadioButton pm;
	private JRadioButton am;
	
	public OknoWpiszDane()
	{
		setTitle("Edycja treningów");
		setSize(450,600);
		Toolkit ekran = Toolkit.getDefaultToolkit();
		setLocation((ekran.getScreenSize().width/2)-217, (ekran.getScreenSize().height/2)-290);
		
		Container powOpcji = getContentPane();
		GridBagLayout ukladOpcji = new GridBagLayout();
		powOpcji.setLayout(ukladOpcji);
		
		// dodaj komponenty
		JLabel opis_l = new JLabel("Dodaj trening / dietę:");
		opis_l.setFont(new OknoGlowne().celF);
		opis_l.setBorder(BorderFactory.createEtchedBorder());
		JLabel godzina_l = new JLabel("Godzina treningu:");
		JLabel dzien_l = new JLabel("Dzień:");
		JLabel miesiac_l = new JLabel("Miesiąc:");
		JLabel opisTr_l = new JLabel("Opis treningu:");
		JLabel opisDiet_l = new JLabel("Opis diety:");
		
		godzina = new JComboBox<String>(OpcjeCzasu.wstawGodziny());
		minuta = new JComboBox<String>(OpcjeCzasu.wstawMinuty());
		dzien = new JComboBox<String>(new String[]{"lolo","lolo2"});
		miesiac = new JComboBox<String>(OpcjeCzasu.wstawMiesiace());
		
		grupa = new ButtonGroup();
		pm = new JRadioButton("PM.",true);
		am = new JRadioButton("AM.");
		grupa.add(pm);
		grupa.add(am);
		
		alarm = new JCheckBox("Alarm");
		alarm.setEnabled(true);
		
		zapisz = new JButton("Zapisz", new ImageIcon("accepted_48.png"));
		
		terminTren = new GregorianCalendar();
		
		JScrollPane trenSuw = new JScrollPane(tren);
		
		/*************** to te dwa obszary tekstowe, które źle działają */
		tren = new JTextArea();
		tren.setBorder(BorderFactory.createEtchedBorder());
		
		JScrollPane dietSuw = new JScrollPane(diet);
		diet = new JTextArea();
		diet.setBorder(BorderFactory.createEtchedBorder());
	    /****************************************************************/
		
		GridBagConstraints wytyczne = new GridBagConstraints();
		
		// opis okna
		wytyczne.weightx = 0;
		wytyczne.weighty = 0;
		wytyczne.anchor = GridBagConstraints.CENTER;
		wytyczne.fill = GridBagConstraints.NONE;
		wytyczne.insets = new Insets(20,0,40,0);
		dodajKomponent(opis_l, wytyczne, 0, 0, 5,1);
		
		// etykiety do ustalenia daty
		
		wytyczne.insets = new Insets(0,20,0,10);
		wytyczne.anchor = GridBagConstraints.EAST;
		dodajKomponent(godzina_l, wytyczne, 0, 1, 1,1);
		dodajKomponent(dzien_l, wytyczne, 0, 2, 1,1);
		dodajKomponent(miesiac_l, wytyczne, 0, 3, 1,1);
		
		// etykiety do ustalenia treningów/diet
		wytyczne.insets = new Insets(20,20,0,10);
		wytyczne.anchor = GridBagConstraints.NORTHEAST;
		dodajKomponent(opisTr_l, wytyczne, 0, 4, 1,1);
		dodajKomponent(opisDiet_l, wytyczne, 0, 5, 1,1);
		
		// listy rozwijane oraz radiobuttony do ustalenia daty treningu
		wytyczne.insets = new Insets(0,0,10,0);
		wytyczne.anchor = GridBagConstraints.WEST;
		wytyczne.fill = GridBagConstraints.HORIZONTAL;
		wytyczne.weightx = 100;
		dodajKomponent(godzina, wytyczne, 1, 1, 1,1);
		wytyczne.insets = new Insets(0,30,10,0);
		dodajKomponent(minuta, wytyczne, 2, 1, 1,1);
		
		wytyczne.weightx = 0;
		wytyczne.insets = new Insets(0,0,10,30);
		wytyczne.anchor = GridBagConstraints.EAST;
		dodajKomponent(pm, wytyczne, 3, 1, 1,1);
		dodajKomponent(am, wytyczne, 4, 1, 1,1);
		
		wytyczne.anchor = GridBagConstraints.WEST;
		wytyczne.insets = new Insets(0,0,10,250);
		dodajKomponent(dzien, wytyczne, 1, 2, 4,1);
		
		wytyczne.insets = new Insets(0,0,10,60);
		dodajKomponent(miesiac, wytyczne, 1, 3, 3,1);
		
		wytyczne.fill = GridBagConstraints.NONE;
		wytyczne.anchor = GridBagConstraints.WEST;
		
		/*********** a tu je wstawiam do kontenera ****************/
		wytyczne.insets = new Insets(20,0,0,40);
		wytyczne.weightx = 100;
		wytyczne.weighty = 100;
		wytyczne.fill = GridBagConstraints.BOTH;
		dodajKomponent(tren, wytyczne, 1, 4, 4,1);
		wytyczne.insets = new Insets(20,0,0,40);
		dodajKomponent(diet, wytyczne, 1, 5, 4,1);
		/***********************************************************/
		
		wytyczne.fill = GridBagConstraints.NONE;
		wytyczne.insets = new Insets(0,90,0,90);
		wytyczne.anchor = GridBagConstraints.CENTER;
		dodajKomponent(zapisz, wytyczne, 0, 6, 5,1); 
	}
	
	
	
	
	public void dodajKomponent(Component k, GridBagConstraints wytyczne, int kolumna, int wiersz, int ileKolumn, int ileWierszy)
	{
		wytyczne.gridx = kolumna;
		wytyczne.gridy = wiersz;
		wytyczne.gridwidth = ileKolumn;
		wytyczne.gridheight = ileWierszy;
		getContentPane().add(k, wytyczne);
	}
}
0

Czemu wstawiasz te komponenety a nie JScrollPany ?

0

Powinieneś też zmienić kolejność instrukcji, wpierw utwórz pole tekstowe, potem umieść je na panelu przewijania.

diet = new JTextArea();
diet.setBorder(BorderFactory.createEtchedBorder());
JScrollPane dietSuw = new JScrollPane(diet);
0

no rzeczywiście, gdzieś to zgubiłem. teraz juz wszystko działa, dzięki :P

mam jeszcze pytanie, dlaczego jeśli dla ComboBoxa nadaję stały rozmiar, to po wstawianiu ich do komórki siatki i tak zajmują całą przestrzeń?

0

Pewnie layoutManager. Prawdę mówiąc jak używasz layoutmanagerów to zapomnij o ustalaniu rozmiarów. Jedyne co możesz określić to min max i preffered size. Respektowanie tych ustawień zależy i tak od lm.

0

ok, dzięki rozumiem.

mam jeszcze ostatnie pytanie. Wstawiam sobie do TextArea kilka linijek tekstu. Chciałbym ten tekst wziąć i zapisać w pliku tekstowym, ale tak aby cały tekst z TextArea był w JEDNEJ LINII. czyli trzeba usunąć znaki nowej linii. jak to zrobić?

0
getText().split("\n");

Dostaniesz tekst podzielony na linie, bez znaków nowego wiersza. Zapis jest prosty.

0

Albo:

String str = ta.getText().replaceAll("\n", " "); // powinno chyba zadzialac
0

ok, no to już wiem, musze usunąć "\n". A co zrobić żeby tekst po wczytaniu z powrotem z pliku do textArea był podzielony na linie?

np. jest tekst w textArea:

"Ala ma kota.
Ale ma kota.
Ale ma kota."

w pliku tekstowym będzie "Ala ma kota.Ala ma kota.Ala ma kota."

i po wczytaniu z powrotem do textArea chę żeby tekst wyglądał jak wcześniej

0

Nie ma żadnej możliwości aby to osiągnąć. (W żadnym języku programowania).

0

ok rozumiem. musze się nauczyć korzystać z SQL bo na razie operuje na plikach tekstowych a tu jest b. mało możliwości. :P

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