Java swing: jak ustawić wymiary JPanela aby były w ramce nieruchome

0

Witam mam problem aby jeden z JPanelow sie nie ruszał mianowicie chce zeby po lewej stronie był obrazek a po prawej przyciski i zeby panel przyciskow też nie pływał w Framie , bardzo proszę o jak najszybszą pomoc z góry dziękuję

http://wklej.org/id/1010523/ klasa ramki
http://wklej.org/id/1010524/ klasa JPanela ktory wstawia obrazek
http://wklej.org/id/1010525/ klasa uruchamiajaca ramke

PS: pokornie zwracam sie o pomoc bo mam projekt zrobić i mam czas do wtorku

1

Jest oczywistym, że obrazek się rusza bo layout menager to FlowLayout a on się w ten sposób zachowuje, że dąży do wyśrodkowania elementów. Trzeba skorzystać z czegoś innego a mianowicie GridBegLayout. FlowLayout pływa jak nazwa wskazuje. GridLayout to siatka. Najbardziej elastyczny jest właśnie GridBegLayout i jego użyłem. Dodałem czerwone ramki abyś widział gdzie są JPanele:]. Buttony pływają bo mają różne wymiary duży button się skórczy. Buttony są teraz takie same mniej więcej:)

Należy się plusik:]

package Menu;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

import ImgPanel.ImagePanel;

/**
 * 
 * @author minix
 */
public final class MyFrame extends JFrame {
	private JButton library;
	private JButton user;
	private JPanel panelWFrame;
	private GridBagConstraints gBC = new GridBagConstraints();
	private GridBagLayout gBL = new GridBagLayout();

	public MyFrame() {
		super("Program obrazkowy");
		GridBagLayout gBL = new GridBagLayout();
		setLayout(gBL);
		gBC.fill = GridBagConstraints.NONE;
		//GridBagConstraints.NONE;
		JPanel obrazPanel = new ImagePanel();
		// add(obrazPanel);
		
		obrazPanel.setBorder(BorderFactory.createLineBorder(Color.red));
		Dimension dimension = new Dimension(810, 320);
		setPreferredSize(dimension);
		dodajButtony();
		panelWFrame.setLocation(0, 0);
		GridBagConstraints gBC = new GridBagConstraints();

		

		gBC.weightx = 0.5;
		gBC.weighty = 0.5;
		gBC.gridx = 0;
		gBC.gridy = 0;
		gBC.anchor = GridBagConstraints.WEST;
		add(obrazPanel, gBC);
		gBC.weightx = 0.5;
		gBC.weighty = 0.5;
		gBC.gridx = 1;
		gBC.gridy = 0;
		gBC.anchor = GridBagConstraints.CENTER;
		add(panelWFrame, gBC);
		

		// setLayout(new FlowLayout());
		setDefaultCloseOperation(3);

		setResizable(false);
		pack();

	}

	public void dodajButtony() {

		panelWFrame = new JPanel();
		library = new JButton("ksiągozbior");
		user = new JButton("klient/pracownik");
		user.setMargin(new Insets(2,3,2,3));
		library.setMargin(new Insets(2,3,2,3));
		MojListener ml = new MojListener();
		library.addActionListener(ml);
		user.addActionListener(ml);
		panelWFrame.setBorder(BorderFactory.createLineBorder(Color.red));
		panelWFrame.add(library);
		panelWFrame.add(user);
		gBC.weightx = 0.5;
		gBC.weighty = 0.5;
		gBC.gridx = 1;
		gBC.gridy = 0;
		add(panelWFrame, gBC);
		//add(panelWFrame);
	}

	class MojListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent event) {
			Object source = event.getSource();
			if (source == library) {
				JButton a = new JButton("cos");
				JButton b = new JButton("pfu");
				a.setMargin(new Insets(2,35,2,35));
				b.setMargin(new Insets(2,35,2,35));
				remove(panelWFrame); // usowasz caly panel glowny
				//panelWFrame.set
				panelWFrame = new JPanel();
				panelWFrame.setAlignmentX(java.awt.Component.CENTER_ALIGNMENT);
				panelWFrame.setBorder(BorderFactory.createLineBorder(Color.red));
				panelWFrame.add(a);
				panelWFrame.add(b);
				gBC.weightx = 0.5;
				gBC.weighty = 0.5;
				gBC.gridx = 1;
				gBC.gridy = 0;
				add(panelWFrame, gBC);
				//add(panelWFrame); // dodajesz cos do tego panelu
				Dimension dimension = new Dimension(300, 280);
				setPreferredSize(dimension);
				repaint();
				setVisible(true);
			} else {
				JButton b = new JButton("pfu");
				remove(panelWFrame); // usowasz caly panel glowny

				panelWFrame = new JPanel();
				panelWFrame.setAlignmentX(java.awt.Component.CENTER_ALIGNMENT);
				panelWFrame.setBorder(BorderFactory.createLineBorder(Color.red));
				panelWFrame.add(b);
				gBC.weightx = 0.5;
				gBC.weightx = 0.5;
				gBC.gridx = 1;
				gBC.gridy = 0;
				add(panelWFrame, gBC);
				//add(panelWFrame); // dodajesz cos do tego panelu
				Dimension dimension = new Dimension(300, 280);
				setPreferredSize(dimension);
				repaint();
				setVisible(true);
			}
		}
	}
}
0

Kocham to za mało aby odzwierciedlić jak bardzo jestem ci wdzęczny <3 mam jeszcze jedno pytanie, chodzi mi o przyciski. Jak mam zaimplementować actionListenera by móc zmieniać przyciski pozostając na tej samej ramce jak w moim przypadku ale kilkukrotnie np (ksiągozbiór) -> (pfu) -> (trzeci_przycisk) i tak dalej , probowalem zaimplementować samego słuchacza w osobnej klasie ale coś mi nie wychodziło bo nie wiedziałem jak przekazać parametry do niego z innej klasy . Dziękuję Ci jeszcze raz za pomoc ^^

1

Jest coś takiego jak setVisible(). JButton też to ma więc możesz coś takiego zrobić

a.setVisible(false);
b.setVisible(false);

a po jakimś evencie możesz dać

a.setVisible(true);
b.setVisible(true);

Dodaj sobie jakieś zmienne boolean i traktuj je jak flagi.

Pamiętam jak pisałem appkę w QT że wszystkie obiekty miałem na monitorze tylko raz dawałem je widoczne a raz nie. Miałem tak trzy ekrany zrobione. Ekran powitalny, ekran gry i ekran wyników. Tylko odpowiednio raz dawałem odpowiednie obiekty widzialne a raz niewidziane.

Poza tym to można inaczej zrobić

JButton b = new JButton("pfu");
                                remove(panelWFrame); // usowasz caly panel glowny
 
                                panelWFrame = new JPanel();
                                panelWFrame.setAlignmentX(java.awt.Component.CENTER_ALIGNMENT);
                                panelWFrame.setBorder(BorderFactory.createLineBorder(Color.red));
                                panelWFrame.add(b);
                                gBC.weightx = 0.5;
                                gBC.weightx = 0.5;
                                gBC.gridx = 1;
                                gBC.gridy = 0;
                                add(panelWFrame, gBC);
                                //add(panelWFrame); // dodajesz cos do tego panelu
                                Dimension dimension = new Dimension(300, 280);
                                setPreferredSize(dimension);
                                repaint();
                                setVisible(true);

Użyć JButton setText(String s);

                                b.setText("pfu");
                                a.setVisible(false);
                               /* remove(panelWFrame); // usowasz caly panel glowny
 
                                panelWFrame = new JPanel();
                                panelWFrame.setAlignmentX(java.awt.Component.CENTER_ALIGNMENT);
                                panelWFrame.setBorder(BorderFactory.createLineBorder(Color.red));
                                panelWFrame.add(b);*/
                                gBC.weightx = 0.5;
                                gBC.weightx = 0.5;
                                gBC.gridx = 1;
                                gBC.gridy = 0;
                                add(panelWFrame, gBC);
                                //add(panelWFrame); // dodajesz cos do tego panelu
                                Dimension dimension = new Dimension(300, 280);
                                setPreferredSize(dimension);
                                repaint();
                                setVisible(true);

Zmienne a i b zmienić na globalne jak user i libirary.
Nie wiem po co tworzysz nowe a i b. Dla mnie to jest trochę bez sensu. Najlepiej JButtony JTextAreny etc dać sobie jako privaty globalne i później na nich operować. Zasięg globalny daje to że możesz w każdej części kodu się do niej dobrać i coś zmienić. Np jakiś event zmieni JText. Gdyby JText miał zasięg lokalny to trzeba byłoby się gimnastykować co nie warte zachodu w przypadku GUI.
Całość:

package Menu;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

import ImgPanel.ImagePanel;

/**
 * 
 * @author minix
 */
public final class MyFrame extends JFrame {
	private JButton library;
	private JButton user;
	private JPanel panelWFrame;
	private GridBagConstraints gBC = new GridBagConstraints();
	private GridBagLayout gBL = new GridBagLayout();
	private JButton a;
	private JButton b;

	public MyFrame() {
		super("Program obrazkowy");
		GridBagLayout gBL = new GridBagLayout();
		setLayout(gBL);
		gBC.fill = GridBagConstraints.NONE;
		//GridBagConstraints.NONE;
		JPanel obrazPanel = new ImagePanel();
		// add(obrazPanel);
		
		obrazPanel.setBorder(BorderFactory.createLineBorder(Color.red));
		Dimension dimension = new Dimension(810, 320);
		setPreferredSize(dimension);
		dodajButtony();
		panelWFrame.setLocation(0, 0);
		GridBagConstraints gBC = new GridBagConstraints();

		

		gBC.weightx = 0.5;
		gBC.weighty = 0.5;
		gBC.gridx = 0;
		gBC.gridy = 0;
		gBC.anchor = GridBagConstraints.WEST;
		add(obrazPanel, gBC);
		gBC.weightx = 0.5;
		gBC.weighty = 0.5;
		gBC.gridx = 1;
		gBC.gridy = 0;
		gBC.anchor = GridBagConstraints.CENTER;
		add(panelWFrame, gBC);
		

		// setLayout(new FlowLayout());
		setDefaultCloseOperation(3);

		setResizable(false);
		pack();

	}

	public void dodajButtony() {

		panelWFrame = new JPanel();
		library = new JButton("ksiągozbior");
		user = new JButton("klient/pracownik");
		user.setMargin(new Insets(2,3,2,3));
		library.setMargin(new Insets(2,3,2,3));
		MojListener ml = new MojListener();
		library.addActionListener(ml);
		user.addActionListener(ml);
		panelWFrame.setBorder(BorderFactory.createLineBorder(Color.red));
		panelWFrame.add(library);
		panelWFrame.add(user);
		gBC.weightx = 0.5;
		gBC.weighty = 0.5;
		gBC.gridx = 1;
		gBC.gridy = 0;
		add(panelWFrame, gBC);
		//add(panelWFrame);
	}

	class MojListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent event) {
			Object source = event.getSource();
			if (source == library) {
				JButton a = new JButton("cos");
				JButton b = new JButton("pfu");
				a.setMargin(new Insets(2,35,2,35));
				b.setMargin(new Insets(2,35,2,35));
				remove(panelWFrame); // usowasz caly panel glowny
				//panelWFrame.set
				panelWFrame = new JPanel();
				panelWFrame.setAlignmentX(java.awt.Component.CENTER_ALIGNMENT);
				panelWFrame.setBorder(BorderFactory.createLineBorder(Color.red));
				panelWFrame.add(a);
				panelWFrame.add(b);
				gBC.weightx = 0.5;
				gBC.weighty = 0.5;
				gBC.gridx = 1;
				gBC.gridy = 0;
				add(panelWFrame, gBC);
				//add(panelWFrame); // dodajesz cos do tego panelu
				Dimension dimension = new Dimension(300, 280);
				setPreferredSize(dimension);
				repaint();
				setVisible(true);
			} else {
				/*JButton b = new JButton("pfu");
				remove(panelWFrame); // usowasz caly panel glowny

				panelWFrame = new JPanel();
				panelWFrame.setAlignmentX(java.awt.Component.CENTER_ALIGNMENT);
				panelWFrame.setBorder(BorderFactory.createLineBorder(Color.red));
				panelWFrame.add(b);
				gBC.weightx = 0.5;
				gBC.weightx = 0.5;
				gBC.gridx = 1;
				gBC.gridy = 0;
				add(panelWFrame, gBC);
				//add(panelWFrame); // dodajesz cos do tego panelu
				Dimension dimension = new Dimension(300, 280);
				setPreferredSize(dimension);
				repaint();
				setVisible(true);*/
				
				
				  b.setText("pfu");
                  a.setVisible(false);
                 /* remove(panelWFrame); // usowasz caly panel glowny

                  panelWFrame = new JPanel();
                  panelWFrame.setAlignmentX(java.awt.Component.CENTER_ALIGNMENT);
                  panelWFrame.setBorder(BorderFactory.createLineBorder(Color.red));
                  panelWFrame.add(b);*/
                  gBC.weightx = 0.5;
                  gBC.weightx = 0.5;
                  gBC.gridx = 1;
                  gBC.gridy = 0;
                  add(panelWFrame, gBC);
                  //add(panelWFrame); // dodajesz cos do tego panelu
                  Dimension dimension = new Dimension(300, 280);
                  setPreferredSize(dimension);
                  repaint();
                  setVisible(true);
			}
		}
	}
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.