CustomTabbedPane: stop opening of tabs that are already open - java

I am using CustomTabbedPane in my class to show different panels within one frame. It works fine as far as functionality is concerned. I want my program to be elegant so I don't want a tab to show up, when a user click the button, that is already open. I have searched it for like more than 3 hours but didn't find anything similar to my problem. Below is my code snippet of action-listener for adding product.
addProduct.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
Product obj=new Product();
//if(isTabPresent()){
obj.start();
mainPane.addTab("Add Product",obj);
mainPane.setSelectedComponent(obj);
//}
}
});
I have also made a method isTabPresent() to check whether the tab is available in the mainPane(CustomTabbedPane) or not. I have commented isTabPresent() because it is not working the way I want.
public boolean isTabPresent(Object tab){
for(int i=0;i<mainPane.getTabCount();i++)
if(mainPane.getComponentAt(i).equals(tab))
return true;
return false;
}
This is what I have tried to get my job done but its not working. Any help or any better suggestion would be appreciated. Thanks a lot!

Related

Vaadin unbuffered grids won't close

I am having a weird problem on my Vaadin app. I have a screen with two separate unbuffered grids.
The user is able to edit the data in those two grids and then click a "Save" button to save the changes made.
My problem is that I want to close the editors when the user clicks on "Save".
I tried the following code:
private void closeEditors() {
if (tab1.getEditor().isOpen()) {
tab1.getEditor().closeEditor();
}
if (tab2.getEditor().isOpen()) {
tab2.getEditor().closeEditor();
}
}
I don't understand why this code doesn't work, editors stay opened. I also tried calling the cancel method but in vain.
I am using Vaadin 14.
I am posting this here with not much hope of finding an answer, this problem seems really precise.
But with any luck, maybe someone has experienced a similar issue ?
Maybe there is another glitchier way of forcing my editors to close ?
Any suggestion would be of great help, thanks in advance for anything you could think of !
EDIT: a little more code
This is the grids:
private Grid<Map<String, String>> tab1;
private Grid<Map<String, List<String>>> tab2;
This is the save function
public void saveData() {
saveDataFromTab1();
saveDataFromTab2();
try {
ServicesProxyImpl.getInstance().updateInBD(someObject);
saveButton.setEnabled(false);
cancelButton.setEnabled(false);
closeEditors();
Dialog dialog = VaadinComponentUtils.generateDialog(Constantes.MSG_SAVE_OK);
dialog.open();
} catch (JAXBException e) {
e.printStackTrace();
Dialog dialog = VaadinComponentUtils.generateDialog(Constantes.MSG_SAVE_KO);
dialog.open();
}
}
And this is the save button:
public Button getSaveButton() {
Button saveButton= VaadinComponentUtils.generateButton("Save",
VaadinIcon.CHECK_CIRCLE_O, null, true);
saveButton.setEnabled(false);
saveButton.addClickListener(event -> saveData());
return saveButton;
}
EDIT 2:
I have noticed something, when I click on an element of one of my two grids, I want the editor to open for that specific element and I want to close the editor on the other grid (the one not concerned by the modification). This works ! My grids behave like I want. It seems I am only losing control over my editors after I have actually modified one of the cells and clicked on my save button.
The isOpen function returns false on both grids after I call my closeEditors function, so it seems the grid thinks its editor is closed but it is still opened on my UI.
EDIT 3: I have found a workaround
Well, I have solved my problem by adding a close event listener on both my grids and calling resetGrids when the close event is fired. This function simply removes the grids from the UI, fetches the data to be displayed and then adds the grid one again, both editors being closed. I guess it solves my problem but I would have wanted to understand what was going on...
private void closeEditors() {
tableauHoraires.getEditor().addCloseListener(e -> resetGrids());
tableauRamassagePorteAPorte.getEditor().addCloseListener(e -> resetGrids());
if (tableauRamassagePorteAPorte.getEditor().isOpen()) {
tableauRamassagePorteAPorte.getEditor().closeEditor();
}
if (tableauHoraires.getEditor().isOpen()) {
tableauHoraires.getEditor().closeEditor();
tableauHoraires.getEditor().refresh();
}
}
Make sure that the objects in your grid have proper equals and hashcode methods and that the field(s) being edited do not influence them.
I use the PK from the database.

Multiple functions (actionListeners) on one Button

TW: Bad Code
I have a custom Form ConfirmForm that shows up everytime before a process gets executed, so a User can review their input and give their final okay.
I have designed this Form to be easily adaptable for my needs, which is why I'd like to keep it.
The problem I've encountered though is, that with my current code, the ActionListeners get stacked everytime a process is executed.
menu.getMenuOpenIPs().addActionListener(e -> {
simpleChoosingForm.getPasswordsCheckBox().setEnabled(false);
simpleChoosingForm.getPasswordsCheckBox().setSelected(false);
simpleChoosingForm.getPasswords().setEnabled(false);
simpleChoosingFrame.setVisible(true);
});
simpleChoosingForm.getStartSetupButton().addActionListener(e1 -> {
setup.prepareSimpleSetup(simpleChoosingForm.getIpAddresses().getText(), simpleChoosingForm.getPasswords().getText());
if(setup.polishSimpleInput(false, false, false, SimpleSetupWorker.OPEN_IN_BROWSER)) {
simpleChoosingFrame.setEnabled(false);
confirmFrame.setMinimumSize(new Dimension(450, 250));
confirmFrame.setVisible(true);
} else {
simpleChoosingFrame.setEnabled(false);
errorFrame.pack();
errorFrame.setVisible(true);
errorForm.getOKButton().addActionListener(e2 -> {
simpleChoosingFrame.setEnabled(true);
simpleChoosingFrame.requestFocus();
});
}
confirmForm.getOKButton().addActionListener(e2 -> {
new SimpleSetupWorker(setup, SimpleSetupWorker.OPEN_IN_BROWSER);
//simpleSetupWorker.start(SimpleSetupWorker.OPEN_IN_BROWSER);
simpleChoosingFrame.dispose();
confirmFrame.dispose();
setupFrame.setEnabled(true);
setupFrame.requestFocus();
simpleChoosingFrame.setEnabled(true);
for(ActionListener al : confirmForm.getOKButton().getActionListeners()) {
confirmForm.getOKButton().removeActionListener(al);
}
});
confirmForm.getCancelButton().addActionListener(e2 -> {
confirmFrame.dispose();
simpleChoosingFrame.setEnabled(true);
simpleChoosingFrame.requestFocus();
for(ActionListener al : confirmForm.getOKButton().getActionListeners()) {
confirmForm.getOKButton().removeActionListener(al);
}
});
});
Here is an example of the way I've been doing things so far. The structure is the same for almost all tasks I have so far. I've realised the error in my logic way too late since I was only ever testing one feature at a time, so I never noticed what happened until way to late.
Now I need to find a way to fix this entire class.
EDIT: As seen in the example, I tried removing all the ActionListeners from the Button each time it's executed, but this approach did not work
A sincere apology and my deepest condolences for everyone that had to look at this question.
So, the reason why my first approach was not working is, because of course you need to remove ALL relevant ActionListeners
I forgot to remove one of them so the Task that were executed still stacked.
I've done some major restructuring. If anyone should ever have a similar problem, check which ActionListeners you added need to be removed again. You might've overlooked one.
For anyone interested, here is the class now

Update ListView Selection on button click

https://gyazo.com/dbe9a706e2eaecc34028593636bcf2ea
Here is a picture of an assignment I am working on. I have the add and remove working with no problem. I even had the loan/return button working before I switched to a GUI. Problem is I can not figure out how to update the selected entry on button click. I also can't find any similar problems in google. I don't need the assignment done for me, just a point in the right direction. Thanks for any help.
public void handle(ActionEvent e) {
try {
String tempText = listView.getElementAt(listView.getSelectedIndex()).toString();
mediaCollection.set(listView.getSelectionModel().getSelectedIndex(), tempText + loanedToTextField.getText());
MediaItem.setLoanedTo(loanedToTextField.getText());
Should I not be using ListView?

How to show names in Jtextfield click on JButton using Netbeans

I am fresher in Netbeans. I have a small assignment related Netbeans. I want to show some names in JTextfield(for example "abcd","ijkl","mnop" etc as next by next) and it must show one by one. I had create some code which not working properly. I am looking some helps related to it. Please mention as full code here that I can understand in future.I do not know how to create it. So i am done it some another ways. But showing error message. My code is as follows.
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
String s[]={"abcd","ijkl","mnop" } ;
for(int d=0; d<s.length;d++)
jTextField1.setText(""+s);
}
Both these variables should be inside of your class but outside of any method.
String s[]={"abcd","ijkl","mnop" } ;
int i=0;
In action performed method
if(i>=s.length)
i=0;
jTextField1.setText(s[i]);
i++;
For the first click, display abcd.
Next click, display ijkl.
Next click, display mnop.
But I didn't check it. Just try it. It will works.

Vaadin 7 - update textarea at value changed

I'm new at vaadin and I want to display some infologs in a textarea. Currently I have set the pushmode in my CustomComponent to PushMode.AUTOMATIC ( #Push(PushMode.AUTOMATIC) ). But this works only the first time. To refresh the text I have to resize the window manual or click a button.
I found something called ICEPush but I do not understand this stuff :( and do not found good tutorials...
Has anybody a hint for me?
Thanks for help!
have you made sure you changed the TextArea value using the ui.access method, and called the ui.push() method?
Kind of like this:
ui.access(new Runnable() {
#Override
public void run() {
textArea.setValue(newValue);
ui.push();
}
});

Categories