JScrollBar nie przewija JPanela

0

Witam.

JScrollBar nie przewija mi JPanelu gdy klikam w przycisk "Dodaj" tylko stoi nieruchomo i ma długość taką jak podana w panel.setPreferredSize();
Proszę o jakąkolwiek pomoc, gdyż siedzę już nad tym parę dobrych godzin...

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

import javax.swing.*;

public class JPanels extends JFrame {
	private JTextField miejsce[] = new JTextField[4]; // zakladamy na poczatku
	// 4 pola
	private JLabel lMiejsce[] = new JLabel[4];
	private JTextField tImie, tNazwisko;
	private JButton bDodaj, bZapisz;
	private JLabel lImie, lNazwisko;
	private int i = 1;
	private int wDolLabel = 40;
	private int wDolText = 40;
	private JPanel panel;

	public JPanels() {
		initializeUI();
	}

	private void initializeUI() {

		
		setSize(450, 450);
		setResizable(false);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		panel = new JPanel(null);
		
		panel.setPreferredSize(new Dimension(400, 480));
		JScrollPane scrollBar = new JScrollPane(panel);
		


		lImie = new JLabel("Imię");
		lImie.setBounds(45, 10, 50, 40);

		lNazwisko = new JLabel("Nazwisko");
		lNazwisko.setBounds(185, 10, 80, 40);

		tImie = new JTextField();
		tImie.setBounds(10, 40, 100, 20);

		tNazwisko = new JTextField();
		tNazwisko.setBounds(130, 40, 160, 20);

		bDodaj = new JButton("Dodaj");
		bDodaj.setBounds(320, 35, 80, 30);
		bDodaj.addActionListener(aDodaj);

		bZapisz = new JButton("Zapisz");
		bZapisz.setBounds(320, 85, 80, 30);
		bZapisz.addActionListener(aZapisz);

		lMiejsce[0] = new JLabel("Miejsce pracy nr 1");
		lMiejsce[0].setBounds(100, 80, 200, 20);

		miejsce[0] = new JTextField();
		miejsce[0].setBounds(10, 100, 290, 20);

		panel.add(lImie);
		panel.add(lNazwisko);
		panel.add(tImie);
		panel.add(tNazwisko);
		panel.add(bDodaj);
		panel.add(bZapisz);
		panel.add(lMiejsce[0]);
		panel.add(miejsce[0]);

		setContentPane(scrollBar);

	}

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				new JPanels().setVisible(true);
			}
		});
	}
	private static Object resizeArray(Object oldArray, int newSize) {
		int oldSize = java.lang.reflect.Array.getLength(oldArray);
		Class elementType = oldArray.getClass().getComponentType();
		Object newArray = java.lang.reflect.Array.newInstance(elementType,
				newSize);
		int preserveLength = Math.min(oldSize, newSize);
		if (preserveLength > 0)
			System.arraycopy(oldArray, 0, newArray, 0, preserveLength);
		return newArray;
	}

	private ActionListener aDodaj = new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			if (i % 4 == 0) {
				lMiejsce = (JLabel[]) resizeArray(lMiejsce, i * 2);
				miejsce = (JTextField[]) resizeArray(miejsce, i * 2);
			}

			lMiejsce[i] = new JLabel("Miejsce pracy nr " + (i + 1));
			lMiejsce[i].setBounds(100, lMiejsce[i - 1].getY() + wDolLabel, 200, 20);
			panel.add(lMiejsce[i]);

			miejsce[i] = new JTextField();
			miejsce[i].setBounds(10, miejsce[i - 1].getY() + wDolText, 290, 20);
			panel.add(miejsce[i]);
			panel.repaint();

			i++;
		}
	};

	
	private ActionListener aZapisz = new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			System.out.println(":D");
			PrintWriter zapis;
				try {
					zapis = new PrintWriter(new FileWriter(new File("pracownicy.txt"), true));
					for (int j=0; j< i;j++){
						zapis.println(tImie.getText()+" "+tNazwisko.getText());
						zapis.println(miejsce[j].getText());
						zapis.println("\n");
					}
					
					zapis.close();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
			
		
		};
}
0

Najlepiej po prostu użyć layout managerów. Za te kilka godzin byś się ich nauczył.

0
  1. Użycie bardzo powolnej refleksji do czegoś tak banalnego jak utworzenie tablicy o nowym rozmiarze, to strzelanie z armaty do mrówki.
  2. x % y gdzie y jest potęgą dwa jest równoważne kilka razy szybszej operacji x & (y - 1)
  3. Podobnie x * y i x / y, gdzie y jest potęgą dwa jest równoważne operacjom << i >>>, gdzie za y jest wstawiany wykładnik potęgi 2.
  4. Od Javy 1.5 istnieje konstruktor PrintWriter(File fileName).

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