JButton - początkujący - Java

0

Dobry wieczór!
Jest tutaj jakaś miła dusza, która potrafiłaby mi wytłumaczyć JButton? Poradniki z internetu jakoś mi nic nie mówią, a niektóre nie działają.

2

Co to znaczy "wytłumaczyć JButton"? :D

0

To normalne, że poradniki nie mówią. Co dokładnie trzeba wytłumaczyć?

0

Jest w każdej ksiażce/kursie online w działach grafika GUI Swing etc. Ewentualnie obsługa zdarzeń.

2

Klikasz myszą na jakiś punkt na ekranie. Do systemu operacyjnego przychodzi przerwanie, że trzeba obsłużyć I/O. System operacyjny przekazuje koordynaty do procesu odpowiedzialnego za dany prostokąt na ekranie. Proces Javowy przekazuje sterowanie do wątku Swinga, który wie, że podane koordynaty dotyczą przycisku i w ten sposób odpalany jest callback zarejestrowany na zdarzeniu onclick :)

0

Może napiszę to w ten sposób:
Chodzi mi o to czy ktoś krok po kroku mógłby mi wytłumaczyć jak zrobić żeby przycisk, który już stworzyłem zbierał dane z JTextField i je dodawał, a następnie wyświetlał w jakimś miejscu. Mam z tym problem i nie mogę ruszyć dalej. Przy okazji zapytam czy ktoś z was miał taką sytuację, że JTextField oraz JButton się nie wyświetla w JFrame po włączeniu "programu" w Eclipse. U mnie to działa w ten sposób, że dopiero jak kliknę w tym miejscu gdzie się znajduje pole oraz przycisk to się wyświetla.Od razu zaznaczę, że przeinstalowałem Jave. Tutaj wstawiam kod:

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Okno {

public static void main(String[] args) {
	JFrame okno = new JFrame("Kalkulator Legend");
	okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	okno.setSize(500, 500);
	okno.setLocationRelativeTo(null);
	okno.setLayout(null);
	okno.setVisible(true);
	
	JLabel napis1 = new JLabel("Glob of Ectoplasm");
	napis1.setBounds(20, 20, 200, 20);
	okno.add(napis1);
	
	JLabel napis2 = new JLabel("Mystic Coins");
	napis2.setBounds(20, 50, 200, 20);
	okno.add(napis2);
	
	JLabel napis3 = new JLabel("3");
	napis3.setBounds(20, 80, 200, 20);
	okno.add(napis3);
	
	JLabel napis4 = new JLabel("3");
	napis4.setBounds(20, 110, 200, 20);
	okno.add(napis4);
	
	JLabel napis5 = new JLabel("3");
	napis5.setBounds(20, 140, 200, 20);
	okno.add(napis5);
	
	JLabel napis6 = new JLabel("3");
	napis6.setBounds(20, 170, 200, 20);
	okno.add(napis6);
	
	JLabel napis7 = new JLabel("3");
	napis7.setBounds(20, 200, 200, 20);
	okno.add(napis7);
	
	JTextField pole1 = new JTextField("");
	pole1.setBounds(125, 20,  80, 25);
	okno.add(pole1);
	
	JTextField pole2 = new JTextField("");
	pole2.setBounds(125, 50,  80, 25);
	okno.add(pole2);
	
	JTextField pole3 = new JTextField("");
	pole3.setBounds(125, 80,  80, 25);
	okno.add(pole3);
	
	JTextField pole4 = new JTextField("");
	pole4.setBounds(125, 110,  80, 25);
	okno.add(pole4);
	
	JTextField pole5 = new JTextField("");
	pole5.setBounds(125, 140,  80, 25);
	okno.add(pole5);
	
	JTextField pole6 = new JTextField("");
	pole6.setBounds(125, 170,  80, 25);
	okno.add(pole6);
	
	JTextField pole7 = new JTextField("");
	pole7.setBounds(125, 200,  80, 25);
	okno.add(pole7);
	
	JButton przycisk = new JButton("Oblicz");
	przycisk.setBounds(50, 230, 100, 20);
	przycisk.setLayout(null);
	okno.add(przycisk);	
	
}

}

Z góry dziękuję!

2

Ucina, a właściwie nie wyświetla bo setVisible powino być na końcu kodu, na dole, już po wstawieniu obiektów do frame albo panel. Można użyć KeyListener, MouseListener, ale do klikania wystarczy ActionListener . A te obliczenia wyświetla się też np w JLabel tylko trzeba przekonwertować string na integer (Integer.parseInt), albo integer na string (Integer.toString) w zależności co robisz. I tutaj wywali błąd w obliczeniach jak któreś pole będzie puste (null), więc pasowałoby to zabezpieczyć jeśli ktoś tego ma jeszcze używać oprócz Ciebie. Dlatego od razu wstawiłem wszędzie zera.

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JPanel;

import java.awt.event.*;

public class Okno {

public static void main(String[] args) {
    JFrame f = new JFrame("Kalkulator Legend");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(500, 500);
    f.setLocationRelativeTo(null);
    //f.setLayout(null);
    JPanel  okno = new JPanel();
    okno.setLayout(null);
    
    JLabel label = new JLabel("0");
    label.setBounds(200, 230, 100, 20);
    okno.add(label);

    JLabel napis1 = new JLabel("Glob of Ectoplasm");
    napis1.setBounds(20, 20, 200, 20);
    okno.add(napis1);

    JLabel napis2 = new JLabel("Mystic Coins");
    napis2.setBounds(20, 50, 200, 20);
    okno.add(napis2);

    JLabel napis3 = new JLabel("3");
    napis3.setBounds(20, 80, 200, 20);
    okno.add(napis3);

    JLabel napis4 = new JLabel("3");
    napis4.setBounds(20, 110, 200, 20);
    okno.add(napis4);

    JLabel napis5 = new JLabel("3");
    napis5.setBounds(20, 140, 200, 20);
    okno.add(napis5);

    JLabel napis6 = new JLabel("3");
    napis6.setBounds(20, 170, 200, 20);
    okno.add(napis6);

    JLabel napis7 = new JLabel("3");
    napis7.setBounds(20, 200, 200, 20);
    okno.add(napis7);

    JTextField pole1 = new JTextField("0");
    pole1.setBounds(125, 20,  80, 25);
    okno.add(pole1);

    JTextField pole2 = new JTextField("0");
    pole2.setBounds(125, 50,  80, 25);
    okno.add(pole2);

    JTextField pole3 = new JTextField("0");
    pole3.setBounds(125, 80,  80, 25);
    okno.add(pole3);

    JTextField pole4 = new JTextField("0");
    pole4.setBounds(125, 110,  80, 25);
    okno.add(pole4);

    JTextField pole5 = new JTextField("0");
    pole5.setBounds(125, 140,  80, 25);
    okno.add(pole5);

    JTextField pole6 = new JTextField("0");
    pole6.setBounds(125, 170,  80, 25);
    okno.add(pole6);

    JTextField pole7 = new JTextField("0");
    pole7.setBounds(125, 200,  80, 25);
    okno.add(pole7);

    JButton przycisk = new JButton("Oblicz");
    przycisk.setBounds(50, 230, 100, 20);
    //przycisk.setLayout(null);
    przycisk.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {            
            //System.out.println(1);
            int p1 = Integer.parseInt(pole1.getText());
            int p2 = Integer.parseInt(pole2.getText());
            int p3 = Integer.parseInt(pole3.getText());
            int p4 = Integer.parseInt(pole4.getText());
            int p5 = Integer.parseInt(pole5.getText());
            int p6 = Integer.parseInt(pole6.getText());
            int p7 = Integer.parseInt(pole7.getText());
            // wyswietl w label
            int res = p1 + p2 + p3 + p4 + p5 + p6 + p7;
            System.out.println(res);
            label.setText(Integer.toString(res));
        }
    });
    okno.add(przycisk); 
    
    
    f.add(okno);
    f.setVisible(true);
    //f.pack();
}

}
0

W jaki sposób przesunąć wynik w inne miejsce? Dodałem więcej rzeczy i teraz mi wyświetla JTextField :P

0
DanIV napisał(a):

W jaki sposób przesunąć wynik w inne miejsce? Dodałem więcej rzeczy i teraz mi wyświetla JTextField :P

Używasz setLayout(null), a to oznacza że sam musisz określić pozycje elementów korzystając z .setBounds do określenia pozycji każdego elementu. Trzeba zmienić pozycje label.setBounds(200, 230, 100, 20); w linii 21 w kodzie wyżej który wstawiłem. Zobacz inne warianty jak FlowLayout, BorderLayout, BoxLayout w po lewej w menu http://www.java2s.com/Tutorials/Java/Java_Swing/0500__Java_Swing_Layout.htm

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