Tworzenie okienek w Swingu.

0

Witam. Chcę bardzo szybko stworzyć aplikację okienkową za pomocą Swinga, dlatego korzystam z gotowych komponentów w Netbeans. Mam jednak problem, bo nie wiem jak zrobić, żeby po kliknięciu w button w jednym oknie, wyświetliło mi się nowe okno, w którym np. będzie coś napisane. Jak takie coś zrealizować za pomocą tych gotowych komponentów? Zależy mi na czasie i nie mam czasu tego ręcznie pisać. Czy zna ktoś jakiś dobry tutorial, gdzie wszystko w miarę dobrze opisane jeśli chodzi o używanie Swinga w Netbeans z gotowców? Najlepiej żeby były przykłady.

Mam np. metodę, który wygląda w taki sposób

	/**
	 * Metoda wyswietlajaca wszystkie grupy
	 */
	void pokazWszystkie() {
		
		for(Grupa g : grupy) {
			
			System.out.println(g);
		}
	} 

I chcę, aby po kliknięciu przycisku, została wywołana ta metoda i otworzyło się nowe okno, które wyświetli te wszystkie grupy.

0

o_O No musisz zrobić nowy obiekt JFrame, ustawić mu visibility i już.

0
Shalom napisał(a):

o_O No musisz zrobić nowy obiekt JFrame, ustawić mu visibility i już.

Ale jak to powiązać, że po wciśnięciu przycisku otworzy się nowe okno? Nie mam bardzo też pojęcia jak w otwartym oknie wyświetlić te grupy z powyższej tej metody.

1

Ty w ogóle umiesz programować w javie? Bo mam wątpliwości. Najprosciej to nowe okienko zbudować wcześniej (to będzie oczywiście własna klasa rozszerzająca JFrame) i przekazać tam ten obiekt Grupy. Potem w actionListenerze tego buttona dajesz chociażby:

mojeOkienko.setVisible(true);
mojeOkienko.pokazGrupy();

i voila.

0
Shalom napisał(a):

Ty w ogóle umiesz programować w javie? Bo mam wątpliwości. Najprosciej to nowe okienko zbudować wcześniej (to będzie oczywiście własna klasa rozszerzająca JFrame) i przekazać tam ten obiekt Grupy. Potem w actionListenerze tego buttona dajesz chociażby:

mojeOkienko.setVisible(true);
mojeOkienko.pokazGrupy();

i voila.

Dotąd pisałem tylko w konsoli. Dobra to działa potrzebna jest mi tylko jedna rzecz. Jak w tym nowo otwartym oknie wypisać np. w rzędzie nazwy grup z tej metody:

        /**
         * Metoda wyswietlajaca wszystkie grupy
         */
        void pokazWszystkie() {
 
                for(Grupa g : grupy) {
 
                        System.out.println(g);
                }
        }  
0

A no to zależy od ciebie. Ja nie wiem w jakiej to chcesz mieć postaci. Wstaw jakiegoś text boxa, albo liste albo coś.

0
Shalom napisał(a):

A no to zależy od ciebie. Ja nie wiem w jakiej to chcesz mieć postaci. Wstaw jakiegoś text boxa, albo liste albo coś.

Załóżmy, że niech będzie to w liście, tylko jak to zrobić dodaję listę to wtedy tworzy mi się metoda:

    private void list2ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    } 

Co tam wpisać, żeby z tej metody został wyświetlone grupy.

        /**
         * Metoda wyswietlajaca wszystkie grupy
         */
        void pokazWszystkie() {
 
                for(Grupa g : grupy) {
 
                        System.out.println(g);
                }
        }  

Ciężko znaleźć coś w necie o tym, a potrzebne jest mi tylko to.

1

http://www.exampledepot.com/egs/javax.swing/list_ListAddRem.html

Tu masz ładnie opisane jak wygląda tworzenie, dodawanie i usuwanie komponentów z listy.

A co do tego jak ma to wyglądać, to ja bym dodał elementy zbioru "g" w konstruktorze JFrame rozszerzającego główny JFrame. Czyli jeśli np.


public class JakaśKlasaRozszerzająca extends KlasaGłówna
{
      public JakaśKlasaRozszerzająca()
      {
            initComponents();
            // Tutaj sobie dodajesz co tam chcesz, np. ustawiasz jPanele na visible, ale też dodajesz komponenty do swojej listy, żeby przy odpaleniu JFrame'a zawierała już                        swoje elementy
     
       }
      
      // Dalsza część kodu    

}
0

@olek1 omg, zrób obiekt JList, dodaj go do JFrame, ustaw mu visibility i do tego obiektu dodawaj te swoje grupy.

0

Jeszcze nie udało mi się nic specjalnie wykombinować, może opiszę to dokładniej. Mam klasę świat:

public class Swiat {

	/** kontener przechowujacy grupy */
	ArrayList<Grupa> grupy = new ArrayList<Grupa>(); 

i w tej klasie mam kontener z obiektami klasy Grupa. Klasa Grupa wygląda tak:

public class Grupa { 
	
	/** nazwa grupy */
	String nazwaGrupy;

i tutaj jest między innymi w Stringu przechowywana nazwa grupy.

W tym całym swoim pierwszym oknie dodałem dwa buttony, jeden dodaje grupy drugi je usuwa, Wygląda to tak:

public class Program extends javax.swing.JFrame {

    
    Swiat s = new Swiat();
    int licznik = 0;
    PokazGrupy pg;
    /**
     * Creates new form NewJFrame
     */
    public InteligentnyBudynek() {
        super("Inteligentny Budyenk");
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")                      

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        String text = JOptionPane.showInputDialog(null, "Wprowadz nazwe grupy: ");
        s.grupy.add(new Grupa(text));
        if(text != null) {
            JOptionPane.showMessageDialog(null, "Grupa: " + text + " została dodana");
            licznik++;
        }
    }                                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        pg = new PokazGrupy(s, licznik);
        pg.setVisible(true);
    }                                        

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         

        String text = JOptionPane.showInputDialog(null, "Wprowadz nazwe grupy do usuniecia: ");
        if(text != null) {
            for(Grupa g : s.grupy) {
                if(g.nazwaGrupy.equals(text)) {
                    s.grupy.remove(g);
                    licznik--;
                    JOptionPane.showMessageDialog(null, "Grupa: " + text + " została usunieta");
                } 
                else {
                  JOptionPane.showMessageDialog(null, "Grupa: " + text + " nie istnieje");  
                }
            }
        }
    }                                        

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new InteligentnyBudynek().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    // End of variables declaration                   
}
 

I tam jest ten button1, który wyświetla kolejne okno. Kod wygląda tak:

public class PokazGrupy extends javax.swing.JFrame {
    
    static Swiat sw;
    static int l;

    /**
     * Creates new form PokazGrupy
     */
    public PokazGrupy(Swiat s, int licznik) {
        sw = s;
        l = licznik;
        initComponents();
        DefaultListModel model = new DefaultListModel();
        JList list = new JList(model);
        String[] items = new String[licznik];
        
        for (int i = 0; i < items.length; i++) {
            items[i] = sw.grupy.get(i).nazwaGrupy;    
        }
        
        for (int i=0; i < items.length; i++) {
            model.add(i, items[i]);
        }    
        list.setVisible(true);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")

    private void list1ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        
        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new PokazGrupy(sw, l).setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private java.awt.List list1;
    // End of variables declaration
}

Jak widać próbowałem dodać ta listę, ale jednak nie działa:

    public PokazGrupy(Swiat s, int licznik) {
        sw = s;
        l = licznik;
        initComponents();
        DefaultListModel model = new DefaultListModel();
        JList list = new JList(model);
        String[] items = new String[licznik];
        
        for (int i = 0; i < items.length; i++) {
            items[i] = sw.grupy.get(i).nazwaGrupy;    
        }
        
        for (int i=0; i < items.length; i++) {
            model.add(i, items[i]);
        }    
        list.setVisible(true);
    } 

Przekazuje do konstruktora Swiat, w którym są te Grupy, oraz licznik, w którym przechowywana jest ilość Grup. Tworzę tę listę. Do tablicy stringów dodaję nazwy Grupy, które zostały utworzone. A następnie tak jak było w przykładzie inicializuję listę tymi nazwami. Jednak, żadna lista nie jest wyświetlana. Co zrobiłem źle?

Nie ma jakiegoś innego sposobu? Ja po prostu chcę wyświetlić te nazwy jak System.out.println();d Tylko żeby to było w okienku.

0

W którym miejscu próbujesz dodać tę listę? Ja nigdzie nie widzę

add(list);
0
bogdans napisał(a):

W którym miejscu próbujesz dodać tę listę? Ja nigdzie nie widzę

add(list);

Gdzie to mam wrzucić? W konstruktorze nie działa.

0

Co znaczy "nie działa"?
W konstruktorze, zamiast list.setVisible(true);

0
bogdans napisał(a):

Co znaczy "nie działa"?
W konstruktorze, zamiast list.setVisible(true);

Nie działa w sensie, że nie wyświetla tej listy. Jak był pusty kwadracik tak nadal jest.

1
add(list);
pack();
1

Co robi metoda initComponents()? Spróbuj ją usunąć.
Testowo wyświetl (w konstruktorze)

System.out.println(items.length);
0
bogdans napisał(a):

Co robi metoda initComponents()? Spróbuj ją usunąć.
Testowo wyświetl (w konstruktorze)

System.out.println(items.length);

Dzięki działa. Tylko jak ustawić, żeby nie wyświetlało tego w rogu ekranu. I żeby po zamknięciu jednego okna nie zamykały się wszystkie.

1

Po pack();

setLocationRelativeTo(null);
0

Okna (JFrame) mają metodę

setDefaultCloseOperation(opera`code>decydującą co ma się dziać, gdy użytkownik kliknie w krzyżyk. Możliwe wartości dla **operacja**, to`
JFrame.DO_NOTHING_ON_CLOSE
JFrame.DISPOSE_ON_CLOSE
JFrame.HIDE_ON_CLOSE
JFrame.EXIT_ON_CLOSE

Główne okno programu powinno mieć chyba EXIT_ON_CLOSE, pozostałe HIDE_ON_CLOSE.

0

Pozwolę sobie odkopać temat bo mam jeden problem. Mianowicie mam metodę, która przyjmuje dwa argumenty. Wygląda to tak:

    private void jButton24ActionPerformed(java.awt.event.ActionEvent evt) {                                          

        if(sw.grupy.get(num).czujTemp != null) {
            JOptionPane.showMessageDialog(null, "Czujnik temperatury już istnieje");           
        } else {
            String tmp = JOptionPane.showInputDialog(null, "Wprowadź wartość minimalną");
            try {
                double min;
                double max;
                min = Double.parseDouble(tmp);
                tmp = JOptionPane.showInputDialog(null, "Wprowadź wartość maksymalną");
                max = Double.parseDouble(tmp);
                sw.grupy.get(num).dodajCzujnikTemp(min, max);
            }
            catch ( NumberFormatException e ) {
                JOptionPane.showMessageDialog(null, "Musisz podać liczbę liczbę");
            }            
        }
    }  

Jest ona wywoływana po kliknięciu w button. Jednak mam problem. Bo np. gdy kliknę w button i pojawi mi się tekst "Wprowadź wartość minimalną" a ja nie wprowadzę wartości tylko kliknę cancel to wywala mi błąd: "Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException" Co zrobić aby po kliknięciu cancel ta metoda się nie wywoływała?

I jeszcze jedno pytanie. Chciałbym do programu dodać obrazek na głównym JFrame. Tylko, że chciałbym aby po lewej były buttony a po prawej tylko na połowę programu ten obrazek, nie na cały. Czy da się coś takiego zrobić? Jak?

0
  1. Sprawdź czy tmp nie jest nullem? o_O
  2. Napisz klasę rozszerzającą JFrame która w swoim paint() będzie malować obrazek na połowie...
0

Albo dodaj do JFrame po lewej stronie panel z przyciskami, a po prawej JLabel z obrazkiem.

0

Jak przesunąć obrazek do prawej strony okna?

0

Na pewno nie, jeżeli po lewej stronie jest panel z przyciskami, to pack() nie rozciągnie obrazka na całość. Z jakiego layoutu korzystasz?

0

Wylicz współrzędną x-ową górnego lewego wierzchołka (połowa szerokości okna). Musisz jeszcze zakazać użytkownikowi zmiany rozmiaru okna (setResizable(false);) .

0

Ale jaką metodą przesunąć obrazek? g2d.drawImage(image, 350, 0, 444, 600, this);? Tą metodą? Drugi argument to współrzędna x trzecii y, czwarty to szerokość obrazka piąty to długość? Ale coś mi zawsze obcina ten obrazek jak go przesuwam o x.

1

Dla całego okna:

setPreferredSize(new Dimension(2*szerokosc_obrazka,wysokosc_obrazka));

Metoda paint:

public void paint(Graphics g)
{
    super.paint(g);
    g.drawImage(img,szerokosc_obrazka,0,null);
}

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