Avatar
vlastajuracka:

Č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
Redaktor
Avatar
Nahoru Odpovědět 24.10.2015 21:39
Lepší být šprt než blbec :)
Avatar
vlastajuracka:

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
Redaktor
Avatar
Odpovídá na vlastajuracka
Tomáš Brůna:

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
Lepší být šprt než blbec :)
Avatar
Tomáš Brůna
Redaktor
Avatar
Odpovídá na vlastajuracka
Tomáš Brůna:

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
Lepší být šprt než blbec :)
Avatar
vlastajuracka:

Bohuzel ten stejny problem....

 
Nahoru Odpovědět 24.10.2015 22:03
Avatar
Tomáš Brůna
Redaktor
Avatar
Odpovídá na vlastajuracka
Tomáš Brůna:
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
Lepší být šprt než blbec :)
Avatar
vlastajuracka:
<?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:

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
Redaktor
Avatar
Odpovídá na vlastajuracka
Tomáš Brůna:

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
Lepší být šprt než blbec :)
Avatar
Tomáš Brůna
Redaktor
Avatar
Odpovídá na Tomáš Brůna
Tomáš Brůna:

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

private AnchorPane anchor;
Nahoru Odpovědět 24.10.2015 22:35
Lepší být šprt než blbec :)
Avatar
vlastajuracka:

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:

Jinak vypis

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

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  +1 24.10.2015 22:59
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
vlastajuracka:

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:

Tady chyba

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

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

Nahoru Odpovědět 24.10.2015 23:09
Lepší být šprt než blbec :)
Avatar
Odpovídá na vlastajuracka
Petr Štechmüller:

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

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

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

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
Redaktor
Avatar
Odpovídá na vlastajuracka
Tomáš Brůna:

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
Lepší být šprt než blbec :)
Avatar
Odpovídá na vlastajuracka
Petr Štechmüller:

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
Redaktor
Avatar
Odpovídá na Petr Štechmüller
Tomáš Brůna:

tu tam má

public AnchorPane anchorPane;
Nahoru Odpovědět 24.10.2015 23:38
Lepší být šprt než blbec :)
Avatar
Odpovídá na Tomáš Brůna
Petr Štechmüller:

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 Tomáš Brůna
Petr Štechmüller:

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

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

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
Lepší být šprt než blbec :)
Avatar
Tomáš Brůna
Redaktor
Avatar
Nahoru Odpovědět 24.10.2015 23:42
Lepší být šprt než blbec :)
Avatar
Odpovídá na Petr Štechmüller
Petr Štechmüller:

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  +2 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.