41 476 besökare online
1 082 482 medlemmar • 56 602 938 inlägg
Användarnamn 
Lösenord
Flashback Forum Dator och IT Systemutveckling Java
Svara på ämne
Ämnesverktyg
e7andy
Medlem
Citat:
 Ursprungligen postat av Lecapitaine
Ok, så du tror det räcker med att skriva en if-sats i klassen Spel som kollar om bollen kolliderar med en spelbricka med en viss position och i sådanafall tas den bort. Du tror inte det är nödvändigt att skriva om klassen Spelplan så brickorna lagras i en array, utan det räcker med att skriva ut brickor med olika positioner genom en for-loop?
Jag har inte kollat på datastrukturerna, men jag tycker att man bör göra det så enkelt som möjligt initialt för att sedan vid behov ändra till något annat. Jag försöker tänka i objekt för att hitta klasser och ansvarsområden. Hur data är lagrat är egentligen underordnat.

Spelplanen känner till alla brickor och ska finnas metoder för att fråga efter var brickorna är.

Mina tankar:
Spel frågar spelplanen om hur många brickor som finns kvar och avgör om spelet ska fortsätta eller inte.
Spel säger till spelplanen att flytta bollen så att den får en ny position. Det gör att bollens position ändras till en ny position utifrån gällande regler vilket kan innebära att den träffar en bricka och ändrar riktning. Då blir det spelplanen som ser till att kolla om en bricka träffas och tar bort den.

Min tanke kan vara fel, men det är nog den approachen jag hade testat.
 
deluxNobb
Medlem
Jag har ett problem som jag inte riktigt vet hur jag ska komma runt.

Jag har en klass, låt oss kalla den Singleton, som ser ut så här:

Kod:
public class Singleton { private static volatile Singleton instance = null; private static int counter = 1; private Singleton(){} public static Singleton getInstance(){ if(instance == null) { synchronized (Singleton.class) { if(instance == null) { instance = new Singleton(); } } } return instance; } public static synchronized int getCounter(){ return counter; } public static synchronized void incrementCounter(){ counter++; }

När jag sedan skall printa ut värdena på counter, så får jag endast counter = 0 hela tiden.
Jag initierar Singleton så här:
Kod:
Singleton singleton = Singleton.getInstance();
Det jag vill är att jag skall kunna öka värdet på counter genom exekveringen av programmet, samt att counter skall börja från 1, inte 0.

Alla tips mottages tacksamt.
 
Rytve
Medlem
Jag sitter med JavaFX FXML igen och jag har fastnat lite. Jag skall skapa två olika scener som jag ska kunna skifta mellan genom att trycka på en knapp i varsin scen. Det har jag lyckats med men problemet jag har nu är att jag skapat två stycken TextFields där jag ska kunna fylla i information. TextFielden skall ta två olika värden och för att skapa dessa i en text file skall jag använda en knapp jag döpt till Continue. Så fort jag trycker på knappen skall den båda byta scen och spara mina två värden från TextFielden i en .txt
Så fort den nya scenen öppnas skall min .txt med informationen jag fyllde i tidigare öppnas upp och visas i en TextArea. Jag hoppas ni förstod vad jag skulle göra men jag greppar inte alls hur jag skall skriva syntaxen för att skapa denna textfilen. Så här långt har jag kommit än så länge. Jag har skapat varsin Controller till mina olika scener. Jag har inte skrivit någon kod i Controller 2 som ska läsa min textfil. Om någon har input på hur jag ska tänka och skriva min kod för att kunna skapa denna textfilen genom vad jag gjort i FXML så är jag mycket tacksam

Controller till första scenen:
Spoiler:
package sample;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;

import javafx.scene.control.TextField;

import javafx.stage.Stage;


import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.util.*;

public class Controller implements Initializable {

@FXML
private TextField messageField_ID;
@FXML
private TextField messageField_TIME;

@FXML
private Button nextButton;
@FXML
private Button continueButton;

private static Formatter output;


@Override
public void initialize(URL location, ResourceBundle resources) {
nextButton.setStyle("--fx-background.color: BLACK");


}

@FXML

private void handleButton(ActionEvent ae) {
Node node = (Node) ae.getSource();
Stage stage = (Stage) node.getScene().getWindow();
FXMLLoader loader = new FXMLLoader(getClass().getResource("sampleAgain.fxm l"));
Parent root = null;
try {
root = loader.load();
} catch (IOException e) {
e.printStackTrace();
}
Scene scene = new Scene(root);

stage.setScene(scene);

}

public static void newFile() {

try {
output = new Formatter("laptimes.txt");
} catch (SecurityException securityException) {
System.err.println("Denied: " + securityException);
System.exit(1);

} catch (FileNotFoundException fileNotFoundException) {
System.err.println("Could not open file: " + fileNotFoundException);
System.exit(1);

}
}

@FXML
private void addInformation(ActionEvent ae) {

try {
output.format("%d %s", messageField_ID, messageField_TIME);
} catch (FormatterClosedException formatterClosedException) {
System.err.println("Error writing to file" + formatterClosedException);

} catch (NoSuchElementException noSuchElementException) {
System.err.println("Not a valid input:" + noSuchElementException);

}
}

Controller till scen 2:

Spoiler:
package sample;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;


public class Controller2 implements Initializable {


@Override
public void initialize(URL location, ResourceBundle resources) {

}
@FXML
private void handleButton2(ActionEvent ae) {
Node node = (Node)ae.getSource();
Stage stage = (Stage)node.getScene().getWindow();
FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
Parent root = null;
try {
root = loader.load();
} catch (IOException e) {
e.printStackTrace();
}
Scene scene = new Scene(root);

stage.setScene(scene);




}
}

Main:

Spoiler:
package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class Main extends Application {

@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("sample.fxm l"));
primaryStage.setTitle("CarApp");
primaryStage.setScene(new Scene(root));
primaryStage.show();
root.setStyle("--fx-background.color: BLACK");
}


public static void main(String[] args) {
launch(args);
}
}


FXML Scene 1:

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
<children>
<Button fx:id="nextButton" layoutX="442.0" layoutY="308.0" mnemonicParsing="false" onAction="#handleButton" text="Next" />
<TextField fx:id="messageField_ID" layoutX="133.0" layoutY="83.0" promptText="Enter car ID" />
<TextField fx:id="messageField_Time" layoutX="133.0" layoutY="141.0" promptText="Enter laptime" />
<Button fx:id="continueButton" layoutX="353.0" layoutY="114.0" mnemonicParsing="false" onAction="#addInformation" text="Continue" />
</children>
</AnchorPane>

FXML Scene 2:

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller2">
<children>
<Button fx:id="back" layoutX="31.0" layoutY="338.0" mnemonicParsing="false" onAction="#handleButton2" text="Back" />
<TextArea fx:id="textarea" layoutX="106.0" layoutY="16.0" prefHeight="348.0" prefWidth="426.0" />
</children>
</AnchorPane>
 
e7andy
Medlem
Citat:
 Ursprungligen postat av deluxNobb
Jag har ett problem som jag inte riktigt vet hur jag ska komma runt.

Jag har en klass, låt oss kalla den Singleton, som ser ut så här:

Kod:
public class Singleton { private static volatile Singleton instance = null; private static int counter = 1; private Singleton(){} public static Singleton getInstance(){ if(instance == null) { synchronized (Singleton.class) { if(instance == null) { instance = new Singleton(); } } } return instance; } public static synchronized int getCounter(){ return counter; } public static synchronized void incrementCounter(){ counter++; }

När jag sedan skall printa ut värdena på counter, så får jag endast counter = 0 hela tiden.
Jag initierar Singleton så här:
Kod:
Singleton singleton = Singleton.getInstance();
Det jag vill är att jag skall kunna öka värdet på counter genom exekveringen av programmet, samt att counter skall börja från 1, inte 0.

Alla tips mottages tacksamt.
Jag körde ett test av koden och den fungerar alldeles utmärkt:
Kod:
Singleton singleton Singleton.getInstance();
System.out.println(singleton.getCounter());
singleton.incrementCounter();
System.out.println(singleton.getCounter());
singleton.incrementCounter();
System.out.println(singleton.getCounter()); 
Det skriver ut:
1
2
3

Så hur ser din kod ut?

Edit:
Eftersom metoderna och counter är statiska så behöver du inte ens plocka ut en instans av Singleton. Det här fungerar alldeles ypperligt också:
Kod:
System.out.println(Singleton.getCounter());
Singleton.incrementCounter();
System.out.println(Singleton.getCounter());
Singleton.incrementCounter();
System.out.println(Singleton.getCounter()); 
__________________
Senast redigerad av e7andy 2017-02-22 kl. 19:15.
 
kjellbrel
Medlem
Citat:
 Ursprungligen postat av deluxNobb
Det jag vill är att jag skall kunna öka värdet på counter genom exekveringen av programmet, samt att counter skall börja från 1, inte 0.
Hoppas jag tolkar dig rätt nu. Om du vill att din räknare skall kunna behålla sitt värde över flera exekveringar måste du lagra/ladda det från någon form av persistent lagring (ex en fil) mellan exekveringar. Det du har nu är en klass som kommer initiera din räknare till samma startvärde varje gång klassen laddas, dvs varje gång du kör programmet (och drar igång en ny JVM).

Vet ingenting om ditt program i övrigt, men om en enkel lösning duger kan du t ex titta på java.util.Properties för en simpel lösning att kunna spara nyckel/värde-par till fil.

I övrigt så finns det en hel del att påtala om din Singleton-implementation, förutom de kommentarer du redan fått. Att exempelvis använda double checked locking kräver att du läst på ordentligt om riskerna med det först och förstått när och hur det fungerar och när det inte gör det. Vill du veta mer om det kan jag skicka lästips senare. Skippar det för stunden då Singleton inte är vad du behöver för att lösa problemet du frågade om.
 
ozyrecon
Medlem
ozyrecons avatar
Jag är väldigt ny på Java. Är nyfiken på att göra en Byte manipulator i JavaFX men hittar ingen färdig kod man kan titta och lära efter.

Jag tänker att man ska ha 8 bitar som man ska kunna sätta 1 eller 0 och sedan spara detta till en fil som man sedan kan öppna upp i Java igen.
Någon som vet någon bra sida som visar denna koden eller kanske har den själv?
 
e7andy
Medlem
Citat:
 Ursprungligen postat av ozyrecon
Jag är väldigt ny på Java. Är nyfiken på att göra en Byte manipulator i JavaFX men hittar ingen färdig kod man kan titta och lära efter.

Jag tänker att man ska ha 8 bitar som man ska kunna sätta 1 eller 0 och sedan spara detta till en fil som man sedan kan öppna upp i Java igen.
Någon som vet någon bra sida som visar denna koden eller kanske har den själv?
Jag ser inte vilken nytta någon skulle ha av en sån applikation och därför finns det nog ingen som har skrivit just en sån innan. Däremot har många gjort delar av det du vill göra.
Dela upp problemet i delar.
En del är JavaFX-applikationen (kanske är flera delar här), en del är att skriva till en fil och en del är att läsa från en fil.

Sen tar du varje del för sig och söker efter exempel.

Sök på Google efter: java write byte to file
och: java read byte from file

För JavaFX söker du efter: javafx example
eller: javafx tutorial

Börja med typiskt Hello world-exempel. Sen utvecklar du det till den applikation du vill ha.

Sen pusslar du ihop delarna och så är du klar.
 
Svara på ämne
Svara Topp Dela