Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Vytvoření více butonnu v javaFx

Aktivity
Avatar
vlastajuracka:24.10.2015 21:25

Čau lidi zase se na vás obracím s problémem v javaFx už asi 3 den se pokoušim to nějak rozjet... Jde o to že mám třídu Controller a třídu Metody a ve třídě metody chci nastavit 10 stejných talčítek a vím že budou na stejném místě to neřešte :p kód vypadá takto nevím jestli je to uplně nejlepší způsob jk to udělat ale klidně mi můžete navrhnout jiny budu moc rad nebo mi s timhle pomoc moc prosim :) Tady je kod
Controller

package zkouseniblbosti;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;

public class FXMLDocumentController implements Initializable {
   public AnchorPane AnchorPane;
   public TextField todleVypis;
   Button[] pasy = new Button[10];
   Metody jojo= new Metody();


   @Override
    public void initialize(URL url, ResourceBundle rb) {

    }

}

A tady třída metody

package zkouseniblbosti;

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;

public class Metody {
            Button[] jmeno = new Button[10];
    public Button[] napis(TextField textfield) {
        for(int i = 0; i<=9; i++) {
            jmeno[i] = new Button();
            jmeno[i].setId("cislo"+i);
            jmeno[i].setLayoutX(50);
            jmeno[i].setLayoutY(50);
            jmeno[i].setMnemonicParsing(false);
            jmeno[i].setOnAction((ActionEvent e) -> {
                textfield.setText("HOla");
            });
            jmeno[i].setPrefHeight(50);
            jmeno[i].setPrefWidth(150);
            jmeno[i].setText("napis"+i);
    }
        return jmeno;
    }

    public Button cislaSup(Button[] kundo) {
        for(int i = 0; i<=9; i++) {
             AnchorPane.getChildren().add(jojo.jmeno[i]);
        }
    }
}
 
Odpovědět
24.10.2015 21:25
Avatar
Tomáš Brůna
Tvůrce
Avatar
Odpovídá na vlastajuracka
Tomáš Brůna:24.10.2015 21:39

A funguje to?

Nahoru Odpovědět
24.10.2015 21:39
Vi veri universum vivus vici
Avatar
vlastajuracka:24.10.2015 21:44

Nefunguje a to todle

public Button cislaSup(Button[] kundo) {
       for(int i = 0; i<=9; i++) {
            AnchorPane.getChildren().add(jojo.jmeno[i]);
       }

Ježiš strašně se omlouvam za ty nazvy ruzny -.-

 
Nahoru Odpovědět
24.10.2015 21:44
Avatar
Tomáš Brůna
Tvůrce
Avatar
Odpovídá na vlastajuracka
Tomáš Brůna:24.10.2015 21:58

něco jsem dal dohromady

Button[] b = new Button[10];

int x = 50;
int y = 50;

for (int i = 0; i < b.length; i++)
{
    b[i] = new Button();
    b[i].setText("tlacitko");
    b[i].setLayoutX(x);
    b[i].setLayoutY(y);
    anchor.getChildren().add(b[i]);
    y+=20;
}

vytvoří to 10 tlačítek s textem tlacitko

Nahoru Odpovědět
24.10.2015 21:58
Vi veri universum vivus vici
Avatar
Tomáš Brůna
Tvůrce
Avatar
Odpovídá na vlastajuracka
Tomáš Brůna:24.10.2015 21:58

něco jsem dal dohromady

Button[] b = new Button[10];

int x = 50;
int y = 50;

for (int i = 0; i < b.length; i++)
{
    b[i] = new Button();
    b[i].setText("tlacitko");
    b[i].setLayoutX(x);
    b[i].setLayoutY(y);
    anchor.getChildren().add(b[i]);
    y+=20;
}

vytvoří to 10 tlačítek s textem tlacitko

Nahoru Odpovědět
24.10.2015 21:58
Vi veri universum vivus vici
Avatar
vlastajuracka:24.10.2015 22:03

Bohuzel ten stejny problem....

 
Nahoru Odpovědět
24.10.2015 22:03
Avatar
Tomáš Brůna
Tvůrce
Avatar
Odpovídá na vlastajuracka
Tomáš Brůna:24.10.2015 22:08
package zkouseniblbosti;

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;

public class Metody {
            Button[] jmeno = new Button[10];
    public Button[] napis(TextField textfield) {
        for(int i = 0; i<=9; i++) {
            jmeno[i] = new Button();
            jmeno[i].setId("cislo"+i);
            jmeno[i].setLayoutX(50);
            jmeno[i].setLayoutY(50);
            jmeno[i].setMnemonicParsing(false);
            jmeno[i].setOnAction((ActionEvent e) -> {
                textfield.setText("HOla");
            });
            jmeno[i].setPrefHeight(50);
            jmeno[i].setPrefWidth(150);
            jmeno[i].setText("napis"+i);
    }
        return jmeno;
    }

    public Button cislaSup(Button[] kundo) {
        for(int i = 0; i<=9; i++) {
             AnchorPane.getChildren().add(jojo.jmeno[i]);
        }
    }
}

Ale nemáš tu nikde vytvořený anchorPane
A pošli prosím taky ten FXML soubor

Nahoru Odpovědět
24.10.2015 22:08
Vi veri universum vivus vici
Avatar
vlastajuracka:24.10.2015 22:19
<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane fx:id="AnchorPane" prefHeight="200" prefWidth="320" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="zkouseniblbosti.FXMLDocumentController">
   <children>
      <TextField fx:id="todleVypis" layoutX="59.0" layoutY="100.0" />
   </children>
</AnchorPane>
 
Nahoru Odpovědět
24.10.2015 22:19
Avatar
vlastajuracka:24.10.2015 22:31

Jinak toto funguje když dám do mainu

jojo.napis(todleVypis);
       for(int i = 0; i<=9; i++) {
           AnchorPane.getChildren().add(jojo.jmeno[i]);
       }

ale jabych chtel tuto metodu udělat ve třídě Metody.... ale tam mi to háže tu chybu jk jsem vyfotil

 
Nahoru Odpovědět
24.10.2015 22:31
Avatar
Tomáš Brůna
Tvůrce
Avatar
Odpovídá na vlastajuracka
Tomáš Brůna:24.10.2015 22:34

já to mám takto a funguje to

public class FXMLDocumentController implements Initializable {

    @FXML
    private Label label;
    @FXML
    private AnchorPane anchor;

    @FXML
    private void handleButtonAction(ActionEvent event) throws XMLStreamException {
      trida Trida = new trida();

        Button[] b = new Button[10];

        int x = 50;
        int y = 50;

        for (int i = 0; i < b.length; i++)
        {
            b[i] = new Button();
            b[i].setText(String.valueOf(i));
            b[i].setLayoutX(x);
            b[i].setLayoutY(y);
            anchor.getChildren().add(b[i]);
            y+=20;
            x+=20;
    }}

    @Override
    public void initialize(URL url, ResourceBundle rb) {

    }}
Nahoru Odpovědět
24.10.2015 22:34
Vi veri universum vivus vici
Avatar
Tomáš Brůna
Tvůrce
Avatar
Odpovídá na Tomáš Brůna
Tomáš Brůna:24.10.2015 22:35

myslím že jsi v té třídě nenastavil AnchorPane

private AnchorPane anchor;
Nahoru Odpovědět
24.10.2015 22:35
Vi veri universum vivus vici
Avatar
vlastajuracka:24.10.2015 22:47

Ježiš sem vul... ale i přes to mi to nefunguje kod vypada takto:

package zkouseniblbosti;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;

public class FXMLDocumentController implements Initializable {
    public AnchorPane AnchorPane;
    public TextField todleVypis;
    Metody jojo= new Metody();


   @Override
    public void initialize(URL url, ResourceBundle rb) {
        jojo.vypisCisla(todleVypis);
    }

}

a tady třida metody

package zkouseniblbosti;

import javafx.event.ActionEvent;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;


public class Metody {

    Button[] jmeno = new Button[10];
    public AnchorPane AnchorPane;

    public void napis(TextField textfield) {
        for (int i = 0; i <= 9; i++) {
            jmeno[i] = new Button();
            jmeno[i].setId("cislo" + i);
            jmeno[i].setLayoutX(50);
            jmeno[i].setLayoutY(50);
            jmeno[i].setMnemonicParsing(false);
            jmeno[i].setOnAction((ActionEvent e) -> {
                textfield.setText("HOla");
            });
            jmeno[i].setPrefHeight(50);
            jmeno[i].setPrefWidth(150);
            jmeno[i].setText("napis" + i);
        }
    }
    public void vypisCisla(TextField java) {
        napis(java);
        for (int i = 0; i <= 9; i++) {
            AnchorPane.getChildren().add(jmeno[i]);
        }
    }

}
 
Nahoru Odpovědět
24.10.2015 22:47
Avatar
vlastajuracka:24.10.2015 22:57

Jinak vypis

 
Nahoru Odpovědět
24.10.2015 22:57
Avatar
Odpovídá na vlastajuracka
Petr Štechmüller:24.10.2015 22:59

Prosím tě, můžeš přepsat proměnnou AnchorPane za anchorPane? Pomohlo by Ti to vyřešit dost problémů.

Předpokládám, ze Ti dělá porad problém tato metoda:

public void vypisCisla(TextField java) {
        napis(java);
        for (int i = 0; i <= 9; i++) {
            AnchorPane.getChildren().add(jmeno[i]);
        }
    }

Ted t zrejmeo píše bud NullPointerEx­ception, nebo call non-static method.
Ten nullPointer by byl kvůli tomu, že nemáš inicializivanou proměnnou AnchorPane. Call non-static method by byl kvůli tomu, ze překladač neví, ze AnchorPane je název proměnný a ne název třídy. Takže si zinicializuj proměnou a přejmenuje ji.

Nahoru Odpovědět
24.10.2015 22:59
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
vlastajuracka:24.10.2015 23:05

Zmenil sem a píše to tento problém... metodu jsem spojil do jedné

public void napis(TextField textfield) {
    for (int i = 0; i <= 9; i++) {
        jmeno[i] = new Button();
        jmeno[i].setId("cislo" + i);
        jmeno[i].setLayoutX(50);
        jmeno[i].setLayoutY(50);
        jmeno[i].setMnemonicParsing(false);
        jmeno[i].setOnAction((ActionEvent e) -> {
            textfield.setText("HOla");
        });
        jmeno[i].setPrefHeight(50);
        jmeno[i].setPrefWidth(150);
        jmeno[i].setText("napis" + i);
    }
    for (int i = 0; i <= 9; i++) {
        anchorPane.getChildren().add(jmeno[i]);
    }
}
 
Nahoru Odpovědět
24.10.2015 23:05
Avatar
vlastajuracka:24.10.2015 23:05

Tady chyba

 
Nahoru Odpovědět
24.10.2015 23:05
Avatar
Tomáš Brůna
Tvůrce
Avatar
Odpovídá na vlastajuracka
Tomáš Brůna:24.10.2015 23:09

můžu tě poprosit ještě jednou o zdroják celé té metody?

Nahoru Odpovědět
24.10.2015 23:09
Vi veri universum vivus vici
Avatar
Odpovídá na vlastajuracka
Petr Štechmüller:24.10.2015 23:12

A jak ziskavas referenci na tu proměnnou anchorPane ve třídě Metody?

Pouzivej tlačítko odpovědět...

Nahoru Odpovědět
24.10.2015 23:12
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Tomáš Brůna
vlastajuracka:24.10.2015 23:31

Takže tady je kod Controlleru

package zkouseniblbosti;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.Initializable;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;

public class FXMLDocumentController implements Initializable {
    public AnchorPane anchorPane;
    public TextField todleVypis;
    Metody jojo= new Metody();

   @Override
    public void initialize(URL url, ResourceBundle rb) {
        jojo.napis(todleVypis);
    }

}

Tady třídy Metody

package zkouseniblbosti;

import javafx.event.ActionEvent;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;


public class Metody  {

    Button[] jmeno = new Button[11];
    public AnchorPane anchorPane;

    public void napis(TextField textfield) {
        for (int i = 0; i <= 9; i++) {
            jmeno[i] = new Button();
            jmeno[i].setId("cislo" + i);
            jmeno[i].setLayoutX(50);
            jmeno[i].setLayoutY(50);
            jmeno[i].setMnemonicParsing(false);
            jmeno[i].setOnAction((ActionEvent e) -> {
                textfield.setText("HOla");
            });
            jmeno[i].setPrefHeight(50);
            jmeno[i].setPrefWidth(150);
            jmeno[i].setText("napis" + i);
            anchorPane.getChildren().add(jmeno[i]);
        }
       /* for (int i = 0; i <= 9; i++) {
            anchorPane.getChildren().add(jmeno[i]);
        }*/
    }
}

Aaa fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane fx:id="anchorPane" prefHeight="200" prefWidth="320" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="zkouseniblbosti.FXMLDocumentController">
   <children>
      <TextField fx:id="todleVypis" layoutX="59.0" layoutY="100.0" />
   </children>
</AnchorPane>
Editováno 24.10.2015 23:32
 
Nahoru Odpovědět
24.10.2015 23:31
Avatar
Tomáš Brůna
Tvůrce
Avatar
Odpovídá na vlastajuracka
Tomáš Brůna:24.10.2015 23:35

Netuším jak to udělat v té třídě a myslím že tady

public AnchorPane anchorPane;
public TextField todleVypis;

by mělo být

@FXML
public AnchorPane anchorPane;
@FXML
public TextField todleVypis;

jinak se na to kouknu zítra dneska už nad tím nejsem schopnej přemejšlet :-D, a nebo poradí někdo jiný

Nahoru Odpovědět
24.10.2015 23:35
Vi veri universum vivus vici
Avatar
Odpovídá na vlastajuracka
Petr Štechmüller:24.10.2015 23:36

A stále to hází nullPointer exception?... Nemáš inicializivanou proměnou anchorPane ve třídě Metody.

Nahoru Odpovědět
24.10.2015 23:36
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Tomáš Brůna
Tvůrce
Avatar
Odpovídá na Petr Štechmüller
Tomáš Brůna:24.10.2015 23:38

tu tam má

public AnchorPane anchorPane;
Nahoru Odpovědět
24.10.2015 23:38
Vi veri universum vivus vici
Avatar
Odpovídá na Tomáš Brůna
Petr Štechmüller:24.10.2015 23:38

Ta anotace @FXML je užitečná hlavně tehdy, pokud chceš mít tu proměnnou privátní, jinak je zbytecne to tam psát...

Nahoru Odpovědět
24.10.2015 23:38
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
vlastajuracka:24.10.2015 23:39

Todle to vypise :)

 
Nahoru Odpovědět
24.10.2015 23:39
Avatar
Odpovídá na Tomáš Brůna
vlastajuracka:24.10.2015 23:39

Jo no tu tam mam :)

 
Nahoru Odpovědět
24.10.2015 23:39
Avatar
Odpovídá na Tomáš Brůna
Petr Štechmüller:24.10.2015 23:39

Tu tam sice ma, ale v třídě Metody ji nemá nikde inicializivanou, proto ten null pointer exception.

Nahoru Odpovědět
24.10.2015 23:39
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Tomáš Brůna
Tvůrce
Avatar
Odpovídá na Tomáš Brůna
Tomáš Brůna:24.10.2015 23:41

tohle ti chybu nehází?

Button[] jmeno = new Button[11];

nemá to bát takto?

public class Metody  {

    public Button[] jmeno;
    public AnchorPane anchorPane;

    public void napis(TextField textfield) {
        this.jmeno = new Button[11];

        for (int i = 0; i <= 9; i++) {
            jmeno[i] = new Button();
            jmeno[i].setId("cislo" + i);
            jmeno[i].setLayoutX(50);
            jmeno[i].setLayoutY(50);
            jmeno[i].setMnemonicParsing(false);
            jmeno[i].setOnAction((ActionEvent e) -> {
                textfield.setText("HOla");
            });
            jmeno[i].setPrefHeight(50);
            jmeno[i].setPrefWidth(150);
            jmeno[i].setText("napis" + i);
            anchorPane.getChildren().add(jmeno[i]);
        }
    }
}
Nahoru Odpovědět
24.10.2015 23:41
Vi veri universum vivus vici
Avatar
Tomáš Brůna
Tvůrce
Avatar
Odpovídá na Petr Štechmüller
Tomáš Brůna:24.10.2015 23:42

aha :-` to je pravda :-D

Nahoru Odpovědět
24.10.2015 23:42
Vi veri universum vivus vici
Avatar
Odpovídá na Petr Štechmüller
Petr Štechmüller:24.10.2015 23:49

Nebudeme tu chodit kolem horké kaše a napisu Ti, co a jak, aby to chodilo.

1. Když tak moc chceš přidávat kontrolky ve třídě Metody, tak si tam dej konstruktor, který přijme v parametru ten anchorPane takto:

public Metody(AnchorPane anchorPane) {
   this.anchorPane = anchorPane;
}

2. Ve třídě FXMLDocumentCon­troller upravis vytváření třídy metody takto:

Metody jojo = new Metody(anchorPane);

Ted by to už ten null pointer házet nemělo.

Akceptované řešení
+20 Zkušeností
Řešení problému
Nahoru Odpovědět
24.10.2015 23:49
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 29 zpráv z 29.