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ą.
Co to znaczy "wytłumaczyć JButton"? :D
To normalne, że poradniki nie mówią. Co dokładnie trzeba wytłumaczyć?
Jest w każdej ksiażce/kursie online w działach grafika GUI Swing etc. Ewentualnie obsługa zdarzeń.
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 :)
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ę!
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();
}
}
W jaki sposób przesunąć wynik w inne miejsce? Dodałem więcej rzeczy i teraz mi wyświetla JTextField :P
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