Diskuze: Vytvoření více butonnu v javaFx
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 29 zpráv z 29.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
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 -.-
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
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
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
<?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>
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
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) {
}}
myslím že jsi v té třídě nenastavil AnchorPane
private AnchorPane anchor;
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]);
}
}
}
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 NullPointerException, 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.
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]);
}
}
můžu tě poprosit ještě jednou o zdroják celé té metody?
A jak ziskavas referenci na tu proměnnou anchorPane ve třídě Metody?
Pouzivej tlačítko odpovědět...
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>
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 , a nebo poradí někdo jiný
A stále to hází nullPointer exception?... Nemáš inicializivanou proměnou anchorPane ve třídě Metody.
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...
Tu tam sice ma, ale v třídě Metody ji nemá nikde inicializivanou, proto ten null pointer exception.
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]);
}
}
}
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ě FXMLDocumentController upravis vytváření třídy metody takto:
Metody jojo = new Metody(anchorPane);
Ted by to už ten null pointer házet nemělo.
Zobrazeno 29 zpráv z 29.