kilka pytan odnosnie tworzenia GUI w Javie.

Odpowiedz Nowy wątek
2016-06-01 19:47
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());
    }

} 
edytowany 5x, ostatnio: Ultimion, 2016-06-01 19:51

Pozostało 580 znaków

2016-06-03 08:11
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());
    }

}
edytowany 1x, ostatnio: Ultimion, 2016-06-03 10:54
"widzę, ze nikt nic nie wie..." - Tak, masz rację... Nikt na forum nie pisał aplikacji w SWING i nie potrafi Ci pomóc.. :D - bakeraw2 2016-06-03 10:50

Pozostało 580 znaków

2016-06-03 08:45
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.

Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2016-06-03 09:44
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 :-)

Pozostało 580 znaków

2016-06-03 09:47
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.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2016-06-03 09:55
0

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

ta linijka wstawia:

setContentPane(new DaneOsobowe2());

a jak się usuwa?

Pozostało 580 znaków

2016-06-03 10:09
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ć.

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans, 2016-06-03 10:09

Pozostało 580 znaków

2016-06-03 10:45
0

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

Pozostało 580 znaków

2016-06-03 10:47
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 ?

edytowany 1x, ostatnio: Ultimion, 2016-06-03 10:52

Pozostało 580 znaków

2016-06-03 10:51
0

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


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2016-06-03 10:52
0

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

Możesz się wzorować :)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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