kilka pytan odnosnie tworzenia GUI w Javie.

0

Witam, mam do napisania prosty programik w Javie.

Ogólnie jest to ćwiczenie, które ma oswoić mnie ze Swingiem.

Programik stworzyłem w 3 plikach.

  1. tworzy główne okno JFrame z jednym elementem Jmenu.
    W Jmenu zrobione mam menu z 4 opcjami:
  • Dane Osobowe,
  • Formularz,
  • Wyjście.

w drugim pliku mam stworzony JPanel o nazwie "DaneOsobowe"
w trzecim pliku mam stworzony JPanel o nazwie "Formularz"

jaki mam problem:

  1. w pliku pierwszym w obsłudze menu chce przełączać Jpanele, które będą na JFrame. i nie za bardzo mi to nie wychodzi :-(
  2. w JMenuItems mam dodatkowo zdefiniowane skróty klawiszowe np. "Alt+D" i zmiana Jpaneli można zrobić poprzez skróty klawiszowe ale nie wiem jak to dokładnie działa :-(

w załączniku pokazuje screen mojej Tframe (gdzie widać JPanel "DaneOsobowe" i Jpanel "Formularz" - te dwa Jpanele chcę przełączać miedzy sobą w JFrame.

import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JMenuBar;
import javax.swing.SpringLayout;
import javax.swing.event.AncestorListener;
import javax.swing.event.AncestorEvent;
import javax.swing.JMenuItem;
import javax.swing.SwingConstants;
import javax.swing.JMenu;
import java.awt.Font;
import javax.swing.KeyStroke;
import java.awt.event.KeyEvent;
import java.awt.event.InputEvent;
import javax.swing.ImageIcon;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class OknoGlowne extends JFrame {

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					OknoGlowne frame = new OknoGlowne();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
	
	/**
	 * Create the frame.
	 */
	public OknoGlowne() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 500, 320);
		
		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		
		JMenu MenuOpcje = new JMenu("Opcje");
		menuBar.add(MenuOpcje);
		
		JMenuItem MenuItemDaneOsobowe = new JMenuItem("Dane Osobowe");
		MenuItemDaneOsobowe.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, InputEvent.ALT_MASK));
		MenuItemDaneOsobowe.setFont(new Font("Segoe UI", Font.BOLD, 12));
		MenuOpcje.add(MenuItemDaneOsobowe);
		
		JMenuItem MenuItemFormularz = new JMenuItem("Formularz");
		MenuItemFormularz.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, InputEvent.ALT_MASK));
		MenuItemFormularz.setFont(new Font("Segoe UI", Font.BOLD, 12));
		MenuOpcje.add(MenuItemFormularz);
		
		JMenuItem MenuItemWyjscie = new JMenuItem("Wyj\u015Bcie");
		MenuItemWyjscie.setIcon(new ImageIcon("F:\\exit.png"));
		MenuItemWyjscie.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.ALT_MASK));
		MenuItemWyjscie.setFont(new Font("Segoe UI", Font.BOLD, 12));
		MenuOpcje.add(MenuItemWyjscie);
		
		JMenu MenuInfo = new JMenu("O Programie");
		menuBar.add(MenuInfo);
		
		JMenuItem MenuItemInfo = new JMenuItem("Autorzy");
		MenuItemInfo.setIcon(new ImageIcon("F:\\Info.png"));
		MenuItemInfo.setFont(new Font("Segoe UI", Font.BOLD, 12));
		MenuItemInfo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.ALT_MASK));
		MenuInfo.add(MenuItemInfo);
		
		setContentPane(new DaneOsobowe());
		//setContentPane(new DaneOsobowe2());
	}
	
} 
0

widzę, ze nikt nic nie wie... wiec dodam, ze dwie ostatnie linie powodują, że Jpanel wyświetla mi się w Jframe. przy uruchomieniu programu jeden Jpanel jest widoczny na starcie aplikacji, ponieważ nie wiem jak przełączać Jpanele pomiędzy sobą to jak widać w kodzie jedna linia jest zaremowana i na potrzeby pisania programu sobie najzwyczajniej przełączam aktywną linie aby sprawdzić jak działa kod w danym jPanelu (oba jPanele i ich kod jest w osobnych plikach)

Nie wiem jak podpiąć przełączanie Jpaneli do Jmenu, które zrobiłem
poniżej kod:

import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JMenuBar;
import javax.swing.SpringLayout;
import javax.swing.event.AncestorListener;
import javax.swing.event.AncestorEvent;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.SwingConstants;
import javax.swing.JMenu;
import java.awt.Font;
import javax.swing.KeyStroke;
import java.awt.event.KeyEvent;
import java.awt.event.InputEvent;
import javax.swing.ImageIcon;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class OknoGlowne extends JFrame {
	//private JPanel DaneOsobowe;
	//private JPanel DaneOsobowe2;
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					OknoGlowne frame = new OknoGlowne();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
		
		
	}
	
	/**
	 * Create the frame.
	 */
	public OknoGlowne() {
		setTitle("Programowanie Sieciowe - Lab4 - Swing");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setResizable(false); 
		setBounds(100, 100, 500, 320);
		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		
		JMenu MenuOpcje = new JMenu("Opcje");
		menuBar.add(MenuOpcje);
		
		JMenuItem MenuItemDaneOsobowe = new JMenuItem("Dane Osobowe");
		MenuItemDaneOsobowe.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, ActionEvent.ALT_MASK));
		MenuItemDaneOsobowe.setFont(new Font("Segoe UI", Font.BOLD, 12));
		MenuOpcje.add(MenuItemDaneOsobowe);
		
		MenuItemDaneOsobowe.addActionListener(new ActionListener() {
	        public void actionPerformed(ActionEvent e) 
	        {
	          	//tutaj musze cos napisac aby zmienic aktywny Jpanel
	        	setContentPane(new DaneOsobowe());
	        }
	    });
		
		JMenuItem MenuItemFormularz = new JMenuItem("Formularz");
		MenuItemFormularz.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, ActionEvent.ALT_MASK));
		MenuItemFormularz.setFont(new Font("Segoe UI", Font.BOLD, 12));
		MenuOpcje.add(MenuItemFormularz);
		
		MenuItemFormularz.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e)
			{
				//tutaj musze cos napisac aby zmienic aktywny Jpanel
				setContentPane(new DaneOsobowe2());
			}
		});
		
		JMenuItem MenuItemWyjscie = new JMenuItem("Wyj\u015Bcie");
		MenuItemWyjscie.setIcon(new ImageIcon("F:\\exit.png"));
		MenuItemWyjscie.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, ActionEvent.ALT_MASK));
		MenuItemWyjscie.setFont(new Font("Segoe UI", Font.BOLD, 12));
		MenuOpcje.add(MenuItemWyjscie);
		
		MenuItemWyjscie.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e)
			{
					int retVal = JOptionPane.showConfirmDialog(null, "Czy naprawdę chcesz opuścić Program?", "Wyjście z Programu",JOptionPane.YES_NO_OPTION);
					if(retVal == JOptionPane.YES_OPTION) {
						System.exit(0);
				}
			}
		});
		
		
		JMenu MenuInfo = new JMenu("O Programie");
		menuBar.add(MenuInfo);
		
		JMenuItem MenuItemInfo = new JMenuItem("Autorzy");
		MenuItemInfo.setIcon(new ImageIcon("F:\\Info.png"));
		MenuItemInfo.setFont(new Font("Segoe UI", Font.BOLD, 12));
		MenuItemInfo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.ALT_MASK));
		MenuInfo.add(MenuItemInfo);
		
		MenuItemInfo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e)
			{
				JOptionPane.showMessageDialog(null, "xxxxxxxxxxxxx", "Autor Programu", JOptionPane.INFORMATION_MESSAGE);
			}
		});
		
		//setContentPane(new DaneOsobowe());
		setContentPane(new DaneOsobowe2());
	}
	
}
 
0

Użyj tabbed pane i zmieniaj sobie zakładki? W innym wypadku musiałbyś:

  • wywalić stary panel
  • dodać nowy panel
  • odrysować okno
    za każdą zmianą panelu. Zakładki będą lepsze.
0

witaj, nie mogę użyć zakładek, to jest programik na ćwiczenia i nie mogę nic zmieniać, muszę właśnie zrobić jak jest to napisane w zadaniu ćwiczenia :-)

0

A gdzie masz napisane że nie wolno ci użyć tabbed pane do przełączania paneli? o_O Anyway, jeśli bardzo nie chcesz to napisałem ci wyżej co możesz zrobić alternatywnie.

0

hmmm a dobrze... jak się usuwa wstawiony wcześniej Jpanel ?

ta linijka wstawia:

setContentPane(new DaneOsobowe2());

a jak się usuwa?

0

Linijka

setContentPane(new DaneOsobowe2());

ustawia panel. Zatem wystarczy po tej instrukcji wywołać
validate();
repaint();

Usuwa się poleceniem `remove`, ale ono stanowi parę z poleceniem `add`.
Program jest niekonsekwentny: jeśli użytkownik kliknie w krzyżyk, to program kończy pracę, jeśli użytkownik wybierze w menu pozycję `Wyjście`,to musi ten wybór potwierdzać.
0

Dzięki, właśnie to musiałem dopisać i wszystko działa :-)

0

Program jest niekonsekwentny: jeśli użytkownik kliknie w krzyżyk, to program kończy pracę, jeśli użytkownik wybierze w menu pozycję Wyjście,to musi ten wybór potwierdzać.

zgadza się, nie wiem jak podczepić się pod krzyżyk Jframe :-(

private class ThisWindowListener extends WindowAdapter {
		@Override
		public void windowClosing(WindowEvent e)
		{
			int retVal = JOptionPane.showConfirmDialog(null, "Czy naprawdę chcesz opuścić Program?", "Wyjście z Programu",JOptionPane.YES_NO_OPTION);
			if(retVal == JOptionPane.YES_OPTION) {
				System.exit(0);}
 

bo to działa, ale jak nawet dam , ze nie chce opuścić programu to i tak wychodzę... musiałbym dac else... alc co dalej ?

0

Ech, a do dokumentacji to nie warto patrzeć? Albo sprawdzić co podpowiada IDE jak dasz .addListener?
addWindowListener, metoda windowClosing

0

Tu masz kalkulator w SWING:
https://www.dropbox.com/s/5cz5bo361iozrzo/calculator.zip?dl=0

Możesz się wzorować :)

0

napisałem wyżej i umieściłem kod .... tylko nie wiem jak anulować zdarzenie kliknięcia w ten krzyżyk :-)

0

Ech

jframe.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent windowEvent) {
        if (JOptionPane.showConfirmDialog(frame, 
            "Pewnyś że zamykasz?", "Serio?", 
            JOptionPane.YES_NO_OPTION,
            JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION){
            System.exit(0);
        }
    }
});
0

no ale to co napisałeś, nadal nie działa , okno się zamyka niezależnie co klikniesz ;-(

0
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
0

no i zrobiłem to tak i teraz działa :-)

private class ThisWindowListener extends WindowAdapter {
		@Override
		public void windowClosing(WindowEvent e)
		{
				if (JOptionPane.showConfirmDialog(null, "Czy naprawdę chcesz opuścić Program?", "Wyjście z Programu",JOptionPane.YES_NO_OPTION,
		        JOptionPane.QUESTION_MESSAGE) == JOptionPane.NO_OPTION)
				{
				setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
				}
				else System.exit(0);
		}
	}
 
0

Nie no nie o to chodziło :D. To setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); daj gdzieś w konstruktorze tego jframe, a potem po prostu nic nie rób jak user wybierze NO.

0

tez racja, nie pomyślałem o tym. poprawiłem i działa no i jest OK :-)

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