how to make a modal maximized in tornadofx? - javafx

I need to open the modal maximized .
i tried
class BookingDetailView : Fragment("Booking Details") {
override val root: BorderPane by fxml()
init {
modalStage?.isMaximized = true
}
}
edit:
tried to override onDock()
class BookingDetailView : Fragment("Booking Details") {
override val root: BorderPane by fxml()
override fun onDock() {
//modalStage is null here. when i tried to debug .
**modalStage?.isMaximized = true**
}
}
Invoked from this view :
class FindRoomView : View("Find Room") {
override val root: BorderPane by fxml()
private val dpArrivalDate: JFXDatePicker by fxid()
private val tparrivalTime: JFXTimePicker by fxid()
private val dpDepartureDate: JFXDatePicker by fxid()
private val dpDepartureTime: JFXTimePicker by fxid()
private val btnFindRoom: JFXButton by fxid()
private val cbAdult: JFXComboBox<*> by fxid()
private val cbChildren: JFXComboBox<*> by fxid()
private val btnClear: JFXButton by fxid()
private val btnAdvanceBooking: JFXButton by fxid()
private val btnBookNow: JFXButton by fxid()
val count = FXCollections.observableArrayList<Int>()
// val selections = FXCollections.observableArrayList<AdvanceBookingRoomModel>()
val availability = listOf(RoomType("AC"), RoomType("Non-AC")).observable()
init {
// model.item = this
// model.count.value +=1..50
// (1..50).forEach { i -> model.count.value.add(i) }
// dpArrivalDate.bind(model.arrivalDateProperty)
cbChildren.items = count
cbAdult.items = count
// btnBookNow.setOnAction { bookNow() }
btnBookNow.action { bookNow() }
}
private fun bookNow() {
// openInternalWindow(BookingDetailView::class,owner = root)
find(BookingDetailView::class).openWindow()
}
}
it does'not work.
I also want to have minimize and maximize button on modal.
How to do that?

The modalStage is not yet created when your Fragment is initialized, so modalStage is always null at this point. Override onDock instead and set isMaximized = true there.
You can pass a stageStyle parameter to openModal and openWindow to control available icons in the created Window. Here is a complete application that shows how to access modalStage in onDock:
class ModalApp : App(FindRoomView::class)
class FindRoomView : View("Find Room") {
override val root = stackpane {
button("Book now").action {
find(BookingDetailView::class).openWindow()
}
}
}
class BookingDetailView : Fragment("Booking Details") {
override val root = borderpane()
override fun onDock() {
modalStage?.isMaximized = true
println(modalStage)
}
}

Related

Cannot save selected checkbox to variable

I am a problem with javafx. I have GridPane with about 40 CheckBoxes. I need make user can select only one CheckBox and selected CheckBox is saved to a variable.
This is method for work with checkboxes:
public static class createBet {
public static CheckBox bet;
public static CheckBox isBet(CheckBox[] group, int finalI, AnchorPane resultBlock) {
for (CheckBox j : group) {
if (j.equals(bet)) {
j.setSelected(false);
}
}
ObservableList resultLabels = resultBlock.getChildren();
Label label_num = (Label)resultLabels.get(0);
Label label_win = (Label)resultLabels.get(1);
if (group[finalI].isSelected()) {
bet = group[finalI];
resultBlock.setStyle("-fx-border-color: black;");
label_num.setStyle("-fx-text-fill: black");
label_win.setStyle("-fx-text-fill: black");
}
else {
bet = null;
resultBlock.setStyle("-fx-border-color: gray");
label_num.setStyle("-fx-text-fill: gray");
label_win.setStyle("-fx-text-fill: gray");
}
return bet;
}
}
This is a class for final variables:
public class bets {
public CheckBox numberBet = null;
public CheckBox colorBet = null;
public CheckBox evenBet = null;
}
There I use this classes:
//(block with variables and links to FXML)
createBet bet = new createBet();
bets bets = new bets();
for (int i = 0; i < numbersGroup.length; i++) {
int finalI = i;
numbersGroup[i].selectedProperty().addListener(new ChangeListener<Boolean>() {
#Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
bets.numberBet = createBet.isBet(numbersGroup, finalI, resultNum);
}
});
}
}
}
Checkboxes are selected correctly, but variables for selected CheckBox (class bets) always equal null.
UPD. I comment class createBet and add code from it to the public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue). It not change the situation - variable bets.numberBet is changing in the listener only, outside it this variable allways equals null.
I want use numberBet in the whole code, it's main problem.
My solution for this problem. I DON'T set varbable numberBet with method isBet. isBetwork for change CheckBoxes and activation for block resultNum only.
Variables i set in inner action, where thei are used.
new version of class:
public class Bet {
private CheckBox bet;
public void forBet(CheckBox[] group, int finalI, AnchorPane resultBlock) {
for (CheckBox j : group) {
if (j.equals(bet)) {
j.setSelected(false);
}
}
ObservableList resultLabels = resultBlock.getChildren();
Label label_num = (Label)resultLabels.get(0);
Label label_win = (Label)resultLabels.get(1);
if (group[finalI].isSelected()) {
bet = group[finalI];
resultBlock.setStyle("-fx-border-color: black;");
label_num.setStyle("-fx-text-fill: black");
label_win.setStyle("-fx-text-fill: black");
}
else {
bet = null;
resultBlock.setStyle("-fx-border-color: gray");
label_num.setStyle("-fx-text-fill: gray");
label_win.setStyle("-fx-text-fill: gray");
}
}
public CheckBox startBet(CheckBox[] group) {
for (CheckBox i : group){
if (i.isSelected()) {
bet = i;
break;
}
}
return bet;
}
}
variables:
public CheckBox numberBet = null;
public CheckBox colorBet = null;
public CheckBox evenBet = null;
Using for methods:
Bet Bet = new Bet();
for (int i = 0; i < numbersGroup.length; i++) {
int finalI = i;
numbersGroup[i].selectedProperty().addListener(new ChangeListener<Boolean>() {
#Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
Bet.forBet(numbersGroup, finalI,resultNum);
}
});
}
btn_start.setOnAction(new EventHandler<ActionEvent>() {
#Override
public void handle(ActionEvent event) {
numberBet = Bet.startBet(numbersGroup);
System.out.println(numberBet);
}
});
I think, it's resolve my issue.

Click on tab itemes response from next tab items

I have a fragment with fragment pager adapter implements tablayout...each tab has a recycler view with some items(same recyler view adapter for all recylerviews)... by implementing OnItemClick listener for click on each item call an activity that implement a viewpager with fragmentStatePagerAdapter,to shows recycler view items...based on swipe of tablayout viewpager shows previous or next tab items...
data of each item stores in a arraylist.
when i'm clcking on one item in current tab it likes i'm clicking on next tab item in a same position
tablayput fragment:
viewPager = (ViewPager) view.findViewById(R.id.viewpager);
//setupViewPager(viewPager);
MyFragmentPagerAdapter adapter = new MyFragmentPagerAdapter(getChildFragmentManager(),getActivity());
adapter.addFrag(new OneFragment(), "title1");
adapter.addFrag(new TwoFragment(), "title2");
adapter.addFrag(new ThreeFragment(), "title3");
viewPager.setAdapter(adapter);
tabLayout = (TabLayout) view.findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
OneFragment and TwoFragment and ... are similar:
rv=(RecyclerView) view.findViewById(R.id.rv);
StaggeredGridLayoutManager sglm = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
rv.setLayoutManager(sglm);
rv.setHasFixedSize(true);
persons = new ArrayList<>();
persons.add(new Person("name", "age","email","phone","resume", R.drawable.photo));
persons.add(new Person("name", "age","email","phone","resume", R.drawable.photo));
.
.
.
for (int j=0; j < persons.size() ;j++){
PersonItem personItem = new PersonItem();
personItem.setName(persons.get(j).name);
personItem.setAge(persons.get(j).age);
personItem.setEmail(persons.get(j).email);
personItem.setPhone(persons.get(j).phone);
personItem.setResume(persons.get(j).resume);
personItem.setImageId(persons.get(j).photoId);
personList1.addItem(personItem);
RVAdapter adapter = new RVAdapter(getContext(),persons);
adapter.setOnItemClickListener(new RVAdapter.OnItemClickListener() {
#Override
public void onItemClick(View view, int position) {
int pos = position;
Bundle bundle = new Bundle();
bundle.putSerializable("person", personList1);
Intent intent = new Intent(getContext(),
MyActivity.class);
intent.putExtras(bundle);
intent.putExtra("pos", pos);
startActivity(intent);
}
});
rv.setAdapter(adapter);
recycler view adapter:
public class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder> {
private Context mContext;
private static OnItemClickListener listener;
//AdapterView.OnItemClickListener listener;
// Define the listener interface
public interface OnItemClickListener {
void onItemClick(View itemView, int position);
}
// Define the method that allows the parent activity or fragment to define the listener
public void setOnItemClickListener(OnItemClickListener listener) {
this.listener = listener;
}
public static class PersonViewHolder extends RecyclerView.ViewHolder {
CardView cv;
TextView personName;
TextView personAge;
ImageView personPhoto;
PersonViewHolder(final View itemView) {
super(itemView);
cv = (CardView)itemView.findViewById(R.id.cv);
personName = (TextView)itemView.findViewById(R.id.person_name);
personAge = (TextView)itemView.findViewById(R.id.person_age);
personPhoto = (ImageView)itemView.findViewById(R.id.person_photo);
// Setup the click listener
itemView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
// Triggers click upwards to the adapter on click
if (listener != null)
listener.onItemClick(itemView, getLayoutPosition());
}
});
}
}
List<Person> persons;
public RVAdapter(Context context , List<Person> persons){
this.persons = persons;
mContext = context;
}
#Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
#Override
public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
PersonViewHolder pvh = new PersonViewHolder(v);
return pvh;
}
#Override
public void onBindViewHolder(PersonViewHolder personViewHolder, int i) {
personViewHolder.personName.setText(persons.get(i).name);
personViewHolder.personAge.setText(persons.get(i).age);
personViewHolder.personPhoto.setImageResource(persons.get(i).photoId);
}
#Override
public int getItemCount() {
return persons.size();
}
}
for solving this problem i've made my RvAdapter class as a inner and private class in each tab fragments :
private static class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder> {
//...and keep remaning

Update Buttons JavaFX when a selected process in TableView ends

I want to disable/enable the buttons under the BorderPane when a process in selected row ends.
I try this
downloadTable.getSelectionModel().getSelectedIndices().addListener(new ListChangeListener<Integer>() {
#Override
public void onChanged(Change<? extends Integer> c) {
int selectedIndex = downloadTable.getSelectionModel().getSelectedIndex();
if (downloadTable.getItems().get(selectedIndex).getStatus() == Download.DOWNLOADING) {
cancelButton.setDisable(false);
} else {
cancelButton.setDisable(true);
}
}
});
but it only works if I switch to an items (download) that is already ended.
What I want to do is to enable/disable buttons while an item is selected.
Thanks all
example of ended download with cancelButton that I want to disable
Maybe something like this can help you:
public class Main {
private Button someButton;
private TableView<?> downloadTable;
private void someMethod() {
//somecode
Callback<TableView<?>, TableRow<?>> baseFactory = downloadTable.getRowFactory();
downloadTable.setRowFactory( new CustomRowFactory<?>( someButton, baseFactory ) );
//somecode
}
}
public class CustomRowFactory<T> implements Callback<TableView<T>, TableRow<T>> {
private final Callback<TableView<T>, TableRow<T>> baseFactory;
private final Button someButton;
public CustromRowFactory( Button someButton, Callback<TableView<T>, TableRow<T>> baseFactory) {
this.someButton = somButton;
this.baseFactory = baseFactory;
}
#Override
public TableRow<T> call(TableView<T> tableView) {
final TableRow<T> row = baseFactory == null ? row = new TableRow<>() : row = baseFactory.call( tableView );
someButton.disableProperty().bind(
row.selectedProperty().and( row.getItem().statusProperty().isNotEquals(Download.DOWNLOADING) )
);
return row;
}
}
or insert binding in some of your TableCell implementation.

How to load Different adapters on same listview on Button Click-[Android]?

My requirement is to load different adapters on same listview using buttons to switch between adapters.
I've tried this
public class MainActivity extends ActionBarActivity implements View.OnClickListener {
ImageButton fo,fl,ci,ani;
ListView l;
String flo[],foo[],cit[],an[];
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String flo[] = {"Rose","Lily","SunFlower","Lotus","Tulips"};
String foo[] = {"Maggie","Manchurian","Pizza","Burger","French Fries"};
String cit[] = {"New York","Los Angeles","Las Vegas","Texas","Manhattan"};
String an[] = {"Lion","Tiger","Penguins","Panda","Elephant"};
fo = (ImageButton)findViewById(R.id.imageButton2);
fl = (ImageButton)findViewById(R.id.imageButton);
ci = (ImageButton)findViewById(R.id.imageButton3);
ani = (ImageButton)findViewById(R.id.imageButton4);
l =(ListView)findViewById(R.id.listView);
fo.setOnClickListener(this);
fl.setOnClickListener(this);
ci.setOnClickListener(this);
ani.setOnClickListener(this);
}
#Override
public void onClick(View v) {
if (v.getId()==R.id.imageButton2)
{
food f = new food(this,foo);
l.setAdapter(f);
}
}
}
And I'm getting the following Error:
FATAL EXCEPTION: main
Process: com.example.nike.assignmentadapter, PID: 2565
java.lang.NullPointerException: Attempt to get length of null array
at com.example.nike.assignmentadapter.food.getCount(food.java:41)
at android.widget.ListView.setAdapter(ListView.java:487)
at com.example.nike.assignmentadapter.MainActivity.onClick(MainActivity.java:74)
at android.view.View.performClick(View.java:4756)
at android.view.View$PerformClick.run(View.java:19749)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Food class
public class food extends BaseAdapter implements View.OnClickListener {
String s[];
Context c;
Button li;
Button sh ;
int a[] = {R.drawable.fl1,R.drawable.fl2,R.drawable.fl3,R.drawable.fl4,R.drawable.fl5};
public food(Context context, String[] xperia) {
s = xperia;
c = context;
}
#Override
public int getCount() {
return s.length;
}
#Override
public Object getItem(int position) {
return position;
}
#Override
public long getItemId(int position) {
return s.length;
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater ln = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = ln.inflate(R.layout.food, null);
TextView t= (TextView)v.findViewById(R.id.textView4);
ImageView i = (ImageView)v.findViewById(R.id.imageView4);
li = (Button)v.findViewById(R.id.like4);
sh = (Button)v.findViewById(R.id.share4);
String s1=s[position];
t.setText(s1);
i.setImageResource(a[position]);
li.setOnClickListener(this);
sh.setOnClickListener(this);
return v;
}
#Override
public void onClick(View v) {
if(v.getId()==R.id.like4)
{
AlertDialog.Builder builder= new AlertDialog.Builder(c);
builder.setTitle("Thanks Note");
builder.setMessage("Thank you for Liking ");
builder.setIcon(R.drawable.foo_t);
builder.setPositiveButton("To Share", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User clicked OK button
Uri webpage = Uri.parse("http://www.sonymobile.com");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
c.startActivity(webIntent);
}
});
builder.show();
}
else
{
AlertDialog.Builder builder= new AlertDialog.Builder(c);
builder.setTitle("Thanks Note");
builder.setMessage("Thank you for Sharing on Your Facebook");
builder.setIcon(R.drawable.foo_t);
builder.setPositiveButton("To Facebook", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User clicked OK button
Uri webpage = Uri.parse("https://www.facebook.com");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
c.startActivity(webIntent);
}
});
builder.show();
}
}
}
public class MainActivity extends ActionBarActivity implements OnClickListener {
ImageButton fo,fl,ci,ani;
ListView l;
String flo[],foo[],cit[],an[];
// these are your global variables available to access
// in any part of the coding. Currently they have no
// data assigned to them in other words they are null
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// here we have assigned data to the global variables declared
// outside of the OnCreate function and available to the onClick
// call.
// Using String flo[] = {John, Doe} means you are creating
// new local versions of the String arrays that are not available
// globally. Instead of assigning the data to the variables
// available globally, and to the onClick call, the data is given
// to the local variables only accessible in the OnCreate function
// function and available until OnCreate finishes.
flo = new String[]{"Rose","Lily","SunFlower","Lotus","Tulips"};
foo = new String[]{"Maggie","Manchurian","Pizza","Burger","French Fries"};
cit = new String[]{"New York","Los Angeles","Las Vegas","Texas","Manhattan"};
an = new String[]{"Lion","Tiger","Penguins","Panda","Elephant"};
fo = (ImageButton)findViewById(R.id.imageButton1);
l =(ListView)findViewById(R.id.listView1);
fo.setOnClickListener(this);
}
#Override
public void onClick(View v) {
if (v.getId()==R.id.imageButton1)
{
System.out.println("foo: " + foo);
food f = new food(this,foo);
l.setAdapter(f);
}
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}

JavaFx - Progress Bar does not show up

When I call my LoadingBar class from another class, the stage pops up but the actual bar does not.. what am I doing wrong? I also added where I call the class as well.
When I call my LoadingBar class from another class, the stage pops up but the actual bar does not.. what am I doing wrong? I also added where I call the class as well.
public class LoadingBar extends Stage {
private ProgressBar progressBar;
public LoadingBar() {
progressBar = new ProgressBar(-1.0);
setScene(new Scene(progressBar));
setResizable(false);
initStyle(StageStyle.TRANSPARENT);
show();
}
}
public class JarParser {
public enum JarTreeLevel {JAR, PACKAGE, CLASS, METHOD};
private BottomUp bottomUp;
private TreeItem<String> rootImport, rootPackage, rootClass, classMethod;
private final Map<TreeItem<String>, JarTreeLevel> levelMap = new HashMap<TreeItem<String>, JarTreeLevel>();
private String currentPackage, lastPackage, currentClass, currentClassFull, currentMethod;
public JarParser(BottomUp bottomUp) {
this.bottomUp = bottomUp;
rootImport = new TreeItem<String>();
levelMap.put(rootImport, JarTreeLevel.JAR);
}
public TreeItem<String> populateJarTree(JarFile jarFile) throws Exception {
LoadingBar loadingBar = new LoadingBar();
Enumeration<JarEntry> entries = jarFile.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
String entryName = entry.getName();
if (entryName.endsWith(".class")) {
ClassNode classNode = new ClassNode();
InputStream classFileInputStream = jarFile.getInputStream(entry);
try {
ClassReader classReader = new ClassReader(classFileInputStream);
classReader.accept(classNode, 0);
} finally {
classFileInputStream.close();
}
describeClass(classNode);
}
}
loadingBar.close();
return rootImport;
}
}
You set the stage invisible?
public class LoadingBar extends Stage {
private ProgressBar progressBar;
public LoadingBar() {
progressBar = new ProgressBar(-1.0);
setScene(new Scene(progressBar));
setResizable(false);
initStyle(StageStyle.TRANSPARENT);//?! delete this!
show();
}
Try adding your progress bar to a group and then adding the group to the scene:
Group group = new Group();
group.getChildren().add(progressBar);
setScene(new Scene(group));
...

Resources