Dobrý den,
Mám velice jednoduchý problém s JButton. JButton volá metodu, ale jde aby ji volal s nějakým parametrem. To znamená, že bych mohl použít, aby několik tlačítek volalo stejnou metodu s různými parametry. Jak toho docílím? Děkuji za odpověď.
TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Dobrý den,
Mám velice jednoduchý problém s JButton. JButton volá metodu, ale jde aby ji volal s nějakým parametrem. To znamená, že bych mohl použít, aby několik tlačítek volalo stejnou metodu s různými parametry. Jak toho docílím? Děkuji za odpověď.
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
System.out.println("#" + evt.getActionCommand() + "#" + evt.paramString());
}
evt.getActionCommand() ti vrati jButton2
evt.paramString() vrati ACTION_PERFORMED,cmd=jButton2,when=1394895986573,modifiers=Button1
Staci mat nejaku mapu v programea priradis jButton2 najeku premennu.. ine ma nenapada...
Pokud s javou začínáš, tak bych ti prvně radil spíš konzolový programy... Ale tohle by mělo být, co potřebuješ.
public class MainFrame extends JFrame
{
private static final long serialVersionUID = 1L;
public MainFrame()
{
final String externVar = "Proměnná s textem";
JButton button = new JButton("Tlačítko");//vytvoří tlačítko s nápisem
button.addActionListener(new ActionListener()//přidá akci tlačítku
{
@Override
public void actionPerformed(ActionEvent arg0)
{
System.out.println("Ahoj, testovací výpis do konzole.");
printText("Funkce - " + externVar);
}
});
JPanel panel = new JPanel();
panel.add(button);//přidá tlačítko do panelu
panel.setPreferredSize(new Dimension(300, 200));//nastaví velikost panelu
this.add(panel);//přidá panel do okna
}
private void printText(String text)
{
System.out.println(text);
}
public static void main(String[] args)
{
MainFrame frame = new MainFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//nastaví implicitní operaci pro akci kdy uživatel "zažádá" o uzavření aplikace
frame.pack();//nastaví velikost panelu na velikost komponenty (tj. toho panelu co má velikost 300x200)
frame.setVisible(true);//zviditelní okno na obrazovku
}
}
Tohle dělá to, co bys chtěl. De to napsat i líp ale pro začátek snad stačí.
#5 Matrix17
Totéž co jsi napsal, ale s objektovým zápisem. Funguje to stejně.
import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class MainFrame extends JFrame { private static final long serialVersionUID = 1L; JPanel panel = new MainPanel(); public static void main(String[] args) { MainFrame frame = new MainFrame(); }public MainFrame() { add(panel); setDefaultCloseOperation(EXIT_ON_CLOSE); pack(); setVisible(true); } class MainPanel extends JPanel { private static final long serialVersionUID = 1L; JButton button = new Tlacitko("Tlačítko");MainPanel() { add(button); setPreferredSize(new Dimension(300, 200)); }class Tlacitko extends JButton { private static final long serialVersionUID = 1L; final String externVar = "Proměnná s textem"; Tlacitko(String title) { super(title); addActionListener(new ActionListener() { private void printText(String text) { System.out.println(text); } @Override public void actionPerformed(ActionEvent arg0) { System.out.println("Ahoj, testovací výpis do konzole."); printText("Funkce - " + externVar); } }); } } } }
#6 Kit
Ano tohle je to, co myslel tím, že se to dá napsat líp. :)))
Btw. Objektově zapsaný je oboje. Sice se to chová stejně ale stejně to nefunguje. Proměnná, která měla bejt lokální a v konstruktoru jiný třídy je teď u tlačítka, kde být neměla (právě proto tam musí být final, u tlačítka tohle už neplatí). Funkce, která je private a patří framu (aby ukázala, že jak zavolat metodu jiné třídy) je action listeneru, kde vůbec být nemá.
#7 Matrix17
Aha, takhle jsi to myslel. Teď už to opravit nemohu a podruhé se mi to dávat nechce (co když budeš mít další výhradu?) Dal jsem to na https://gist.github.com/kitsaels/9573254
Jsem zvyklý metody dávat co nejblíž k místu volání a v daném případě je jedno, kde ta proměnná a metoda jsou. Ještě lepší by bylo předávat přes Dependency Injection, které funguje i napříč celé aplikaci a je testovatelné. To asi nebylo původním účelem.
Děkuju za příspěvky, funguje to. A k radě "dříve konzolové programy" mám jen to, že se držím pořadí podle knihy Instroduction to Java programming (od Y. Daniela Lianga) a konzolový programy samozřejmě zkouším taky.
#8 Kit
Přesně tak by to mělo být ale je to kanon na vrabce. Jen ta funkce měla reprezentovat funkci z doménový vrstvy ale dělat kvůli tomu tomu dalších x věcí jen abych vytvořil tlačítko v panelu je hroznej overkill. Jen sem chtěl co nejjednoduší příklad a netahat do toho pokud možno nic navíc. Tvůj kód je rozhodně lepší pro pozdější použití. :)
Zjistit počet nových příspěvků
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
































© 2003–2025 Programujte.com