javafx textfield value to label in other view - user-interface

I got an asignment from school where i have to read in two names in one view, then we have to press a button that goes to another view and then the two names have to come in a label there. i have been trying to do this for some time but for some reason i can't figure it out.
Here is my code on the first view
public class Startview extends GridPane {
private TextField txtplayer1;
private TextField txtplayer2;
private Button play;
this.txtplayer1 = new TextField();
this.txtplayer2 = new TextField();
this.add(txtplayer1,2,1);
this.add(txtplayer2, 2, 2);
this.add(play, 2, 3);
public Button getplay() {
return play;
}
this is the code on my presenter where i write the actions
private void eventHandlers() {
view.getplay().setOnAction(new EventHandler<ActionEvent>() {
#Override
public void handle(ActionEvent event) {
Gameview gameview = new Gameview();
Gamepresenter presenter3 = new Gamepresenter(model, gameview);
view.getScene().setRoot(gameview);
gameview.getScene().getWindow().sizeToScene();
gameview.getScene().getWindow().centerOnScreen();
}
});
and the gameview where the labels are on(which is also on a gridpane)
private Label name1;
private Label name2;
public Label getname1() {
return Name1;
}
public Label getName2() {
return Name2;
}
all help or tips are appreciated

Just like #James_D said, just use the functions in your model. In your startview use the setName from your player-class and in gameview use the getName from your player class.

Related

Why doesn't the sort on my TableView in JavaFX work

guys,
my Program has a lot of TableViews. In all tables except one sorting is working. I can't find my mistake in that single TableViews. When clicking the header it seems like its sorting but not refreshing the view. If I change the tab and go back, the TableView is sorted. If a row is selected and I click on the header the selected color is sorted on the right spot but not the table data.
I have my ObservableList and TableView:
private ObservableList<ProjectViewModel> projectViewModelList = null;
// some more TableColumns
#FXML
TableColumn<ProjectViewModel, String> TableColumnToolchainStepphase;
#FXML
TableView<ProjectViewModel> TableViewToolchain;
my initialize:
#FXML
public void initialize(){
//...
initializeLists();
//...
initTableViewToolchain();
initTableColumns();
//...
}
private void initializeLists(){
projectViewModelList = FXCollections.observableArrayList();
}
private void initTableViewToolchain(){
TableViewToolchain.setItems( projectViewModelList );
}
private void initTableColumns(){
TableColumnToolchainStepphase
.setCellValueFactory( new Callback<CellDataFeatures<ProjectViewModel, String>, ObservableValue<String>>() {
#Override
public ObservableValue<String> call( CellDataFeatures<ProjectViewModel, String> param ){
String string = param.getValue().getStepphaseString();
return new ReadOnlyStringWrapper( string );
}
} );
}
my table population:
private void setProjectViewModelList( Collection<ProjectViewModel> projectViewModelCollection ){
projectViewModelList.clear();
projectViewModelList.setAll( projectViewModelCollection );
}
Where did i go wrong?
I did a workaround i force the sort and refresh on mouseclick:
TableViewToolchain.setOnMouseClicked( ( MouseEvent event ) ->{
TableViewToolchain.sort();
TableViewToolchain.refresh();
} );
So when clicking on those coulmns the sort happens as intended.

Toast is shown every time when device is rotate

In my Android app I use AAC.
Here my activity:
public class AddTraderActivity extends AppCompatActivity {
AddTraderViewModel addTraderViewModel;
private static final String TAG = AddTraderActivity.class.getName();
#Override
protected void onCreate(#Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AddTraderActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.add_trader_activity);
binding.setHandler(this);
init();
}
private void init() {
ViewModelProvider viewViewModelProvider = ViewModelProviders.of(this);
addTraderViewModel = viewViewModelProvider.get(AddTraderViewModel.class);
Observer<String> () {
#Override
public void onChanged (String message){
Debug.d(TAG, "onChanged: message = " + message);
Toast.makeText(AddTraderActivity.this, message, Toast.LENGTH_LONG).show();
}
});
}
public void onClickStart() {
EditText baseEditText = findViewById(R.id.baseEditText);
EditText quoteEditText = findViewById(R.id.quoteEditText);
addTraderViewModel.doClickStart(baseEditText.getText().toString(), quoteEditText.getText().toString());
}
}
Here my ViewModel:
public class AddTraderViewModel extends AndroidViewModel {
private MutableLiveData<String> messageLiveData = new MutableLiveData<>();
private static final String TAG = AddTraderViewModel.class.getName();
public AddTraderViewModel(#NonNull Application application) {
super(application);
}
public void doClickStart(String base, String quote) {
Debug.d(TAG, "doClickStart: ");
if (base.trim().isEmpty() || quote.trim().isEmpty()) {
String message = getApplication().getApplicationContext().getString(R.string.please_input_all_fields);
messageLiveData.setValue(message);
return;
}
}
public LiveData<String> getMessageLiveData() {
return messageLiveData;
}
}
So when I click on button on Activity call method onClickStart()
If any fields is empty the show toast. In the activity call method:
onChanged (String message)
Nice. It's work fine.
But the problem is, when I rotate the device in the activity method onChanged(String message) is called AGAIN and as result show toast. This happened on every rotation.
Why?
This is the expected behaviour. If you want to avoid this you must set message = "" and keep an empty check before showing the toast.
A better way to use it is something like Event Wrapper or SingleLiveEvent
Highly recommend you to read this article. This explains why you are facing this and what are your options in detail.

Using one event handler for multiple actions

I was doing some homework today and I've accomplished all of the goals of the assignment, which I'm sure will get me full points.
In an earlier class, however, we used the same Event Handler for more than one action (in this example, you either type a color in the text field, or click a button to change the background color of the box).
I can't figure out how I would do that in this case... do I have to choose a Type in the constructor? If the first parameter could be a button or a textfield then I think that would help.
I'm just trying to figure out how to apply DRY (Don't Repeat Yourself), where ever I can.
public class ColorChooserApplication extends Application
{
#Override
public void start(Stage stage)
{
// Create all UI components
VBox backgroundBox = new VBox(10);
backgroundBox.setPadding(new Insets(10));
HBox topBox = new HBox(10);
HBox bottomBox = new HBox(10);
TextField colorPrompt = new TextField();
colorPrompt.setOnAction(new ColorHandler(colorPrompt, backgroundBox));
Button redButton = new Button("Red");
redButton.setOnAction(new ButtonHandler(redButton, backgroundBox));
Button whiteButton = new Button("White");
whiteButton.setOnAction(new ButtonHandler(whiteButton, backgroundBox));
Button blueButton = new Button("Blue");
blueButton.setOnAction(new ButtonHandler(blueButton, backgroundBox));
// Assemble
topBox.getChildren().add(colorPrompt);
bottomBox.getChildren().addAll(redButton, whiteButton, blueButton);
backgroundBox.getChildren().addAll(topBox, bottomBox);
backgroundBox.setAlignment(Pos.CENTER);
topBox.setAlignment(Pos.CENTER);
bottomBox.setAlignment(Pos.CENTER);
// Set scene and show
stage.setScene(new Scene(backgroundBox));
stage.show();
}
class ColorHandler implements EventHandler<ActionEvent>
{
TextField colorTf;
VBox bgVbox;
public ColorHandler(TextField colorTf, VBox bgVbox)
{
this.colorTf = colorTf;
this.bgVbox = bgVbox;
}
#Override
public void handle(ActionEvent event)
{
String color = colorTf.getText();
bgVbox.setStyle("-fx-background-color:" + color);
}
}
class ButtonHandler implements EventHandler<ActionEvent>
{
Button colorButton;
VBox bgVbox;
public ButtonHandler(Button colorButton, VBox bgVbox)
{
this.colorButton = colorButton;
this.bgVbox = bgVbox;
}
#Override
public void handle(ActionEvent event)
{
String color = colorButton.getText();
bgVbox.setStyle("-fx-background-color:" + color);
}
}
public static void main(String[] args)
{
launch(args);
}
}
If you're using Java 8, you can do
class ColorHandler implements EventHandler<ActionEvent> {
Supplier<String> colorSupplier ;
VBox bgVbox ;
public ColorHandler(Supplier<String> colorSupplier, VBox bgVbox) {
this.colorSupplier = colorSupplier ;
this.bgVbox = bgVbox ;
}
#Override
public void handle(ActionEvent event) {
String color = colorSupplier.get();
bgVbox.setStyle("-fx-background-color: "+color);
}
}
and then
colorPrompt.setOnAction(new ColorHandler(colorPrompt::getText, backgroundBox));
redButton.setOnAction(new ColorHandler(redButton::getText, backgroundBox));
Note that all you need to provide for the first parameter is some function that returns the correct string for use in the css. So you can do things like
whiteButton.setOnAction(new ColorHandler(() -> "#ffffff", backgroundBox));
blueButton.setOnAction(new ColorHandler(() -> "cornflowerblue", backgroundBox));
etc.

TableView does not always resize the columns

I have a TableView with CONSTRAINED_RESIZE_POLICY column resize policy.
It works great when I resize the window manually, but when I maximize it or restore it from a maximized state, the columns do not adjust.
Is there a way to force a "refresh" on the TableView so columns resize in these cases?
UPDATE: Sample compilable code to reproduce the issue
public class TableViewResizeTest extends Application {
/**
* #param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
#Override
public void start(Stage primaryStage) {
primaryStage.setTitle("TableView resize demo");
ObservableList<Room> roomsList = FXCollections.observableArrayList();
final TableView rooms = new TableView();
TableColumn icons = new TableColumn();
TableColumn name = new TableColumn("Name");
TableColumn topic = new TableColumn("Topic");
TableColumn users = new TableColumn("Users");
rooms.getColumns().addAll(icons, name, topic, users);
name.setCellValueFactory( new PropertyValueFactory<Room,String>("name"));
topic.setCellValueFactory( new PropertyValueFactory<Room,String>("topic"));
users.setCellValueFactory( new PropertyValueFactory<Room,String>("users"));
icons.setCellValueFactory( new PropertyValueFactory<Room,String>("icons"));
name.setMinWidth(50);
name.setMaxWidth(450);
topic.setMinWidth(10);
users.setMinWidth(100);
users.setMaxWidth(150);
icons.setMaxWidth(35);
icons.setMinWidth(35);
// Room resize policy, this is almost perfect
rooms.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
for (int i = 1; i<50; i++) roomsList.add(new Room("Sample Room "+i));
rooms.setItems(roomsList);
BorderPane root = new BorderPane();
root.setCenter(rooms);
primaryStage.setScene(new Scene(root, 500, 460));
primaryStage.show();
}
public class Room {
public Room(String name) {
this.name = new SimpleStringProperty(name);
this.topic= new SimpleStringProperty("This is a sample description text");
this.icon= new SimpleStringProperty("");
nUsers = (int)(Math.random()*1000);
this.users= new SimpleStringProperty(nUsers.toString());
}
Integer nUsers;
private SimpleStringProperty name;
private SimpleStringProperty topic;
private SimpleStringProperty users;
private SimpleStringProperty icon;
public String getName() {
return name.get();
}
public void setName(String name) {
this.name.set(name);
}
public String getTopic() {
return topic.get();
}
public void setTopic(String topic) {
this.topic.set(topic);
}
public String getUsers() {
return nUsers.toString();
}
public void setUsers(String users) {
this.users.set(users);
}
public String getIcon() {
return icon.get();
}
public void setIcon(String icon) {
this.icon.set(icon);
}
}
}
According to the resize policy, the last column "Users" must be visible at all times, and if you resize the form manually it works fine. But if you try maximizing and restoring a couple of times, you will see that it comes off view, until you resize the window a bit manually.
I suppose you want to constraint the name, users and icon columns with max and min width boundaries, while the topic column takes the rest of free space. As a workaround I suggest to put the topic column to the end of columns, i.e. rooms.getColumns().addAll(icons, name, users, topic);.

ViewPagerIndicator not snapping or displaying pager contents all of a sudden

This is a wierd problem.
This will be a terrible question because I have little to no information.
About two days ago I had the ViewPagerAdapter working just fine. I could swipe and it would switch between views as defined by the adapter.
However, all of a sudden (not by itself, I'm sure I did something) the TitlePagerIndicator doesn't snap to the headings and doesn't display any content. By not snapping I mean that if I drag to the left, the title will sit at 3/4 of the screen instead of snapping to the side and displaying the next page (screenshot below).
I have debugged and instantiate item is called and a proper view is returned.
However, when I open the app I'm getting a lot of warnings like these:
VFY: unable to resolve virtual method 3015: Landroid/widget/LinearLayout;.getAlpha ()F
VFY: unable to resolve direct method 3011: Landroid/widget/LinearLayout;. (Landroid/content/Context;Landroid/util/AttributeSet;I)V
VFY: unable to resolve virtual method 2965: Landroid/widget/FrameLayout;.setAlpha (F)V
I'm assuming this is a problem with my imports, but everything compiles just fine, I have the ViewPagerIndicator as a library project, as well as Sherlock.
Here's my adapter code:
public class ViewPagerAdapter extends PagerAdapter implements TitleProvider {
private static String[] titles = new String[] {
"My Klinks",
"Received Klinks"
};
private final Context context;
public ViewPagerAdapter(Context context) {
this.context = context;
}
public String getTitle(int position) {
return titles[position];
}
#Override
public int getCount() {
return titles.length;
}
#Override
public Object instantiateItem(View pager, int position) {
TextView t = new TextView(context);
t.setText("WheeeE");
return t;
}
#Override
public void destroyItem(View pager, int position, Object view) {
((ViewPager) pager).removeView((TextView) view);
}
#Override
public boolean isViewFromObject(View view, Object object) {
return view.equals(object);
}
#Override
public void finishUpdate(View view) {
}
#Override
public void restoreState(Parcelable p, ClassLoader c) {
}
#Override
public Parcelable saveState() {
return null;
}
#Override
public void startUpdate(View view) {
}
}
And here is my activity code:
public void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.main );
// set up the slidey tabs
ViewPagerAdapter adapter = new ViewPagerAdapter( this );
ViewPager pager = (ViewPager)findViewById( R.id.viewpager );
TitlePageIndicator indicator = (TitlePageIndicator)findViewById( R.id.indicator );
pager.setAdapter( adapter );
indicator.setViewPager( pager );
// set up the action bar
final ActionBar ab = getSupportActionBar();
ab.setBackgroundDrawable(getResources().getDrawable(R.drawable.ad_action_bar_gradient_bak));
}
If someone else gets the same problem:
In instantiateView: don't forget to attach your new View to the ViewPager:
#Override
public Object instantiateItem(View pager, int position) {
TextView t = new TextView(context);
t.setText("WheeeE");
((ViewPager)pager).addView(t);
return t;
}
The current version of instantiateItem gets a ViewGroup instead of a View, the solution should be the same.
Well after a couple days of banging my head against a wall I've come to the conclusion that my ViewPagerAdapter was the problem.
I simply created a dynamic fragment and created a subclass of FragmentPagerAdapter instead and now it works just fine...

Resources