Re: Trying to get JComboBox to "repopulate" with increased java.util.Vector
phillip.s.powell@gmail.com wrote:
On Feb 9, 11:25 am, Nigel Wade <n...@ion.le.ac.uk> wrote:
phillip.s.pow...@gmail.com wrote:
I have a JFrame with two JPanels
Top JPanel p1 contains:
1 JLabel that never changes
1 JComboBox that is populated by dynamic values found in
java.util.Vector
1 JButton
If you press that JButton this method fires off:
[code]
/**
* Process new {@link java.net.URL} request
*/
protected void processURL() {
System.out.println("Your new URL is " +
webAddressBox.getSelectedItem().toString()); // webAddress is
JComboBox
SimpleBrowser.hasEnteredAdditionalURL = true;
setURLPath(webAddressBox.getSelectedItem().toString()); //
WORKS
try {
addToHistoryURLVector(new
URL(webAddressBox.getSelectedItem().toString())); // WORKS
} catch (Exception e) {}
generateWebBrowser(); // WORKS - CREATES
org.jdesktop.jdic.browser.WebBrowser each time you enter in a URL in
JComboBox and press JButton
webAddressBox = null;
generateJComboBox(); // THIS SHOULD CREATE A BRAND NEW
REPOPULATED JComboBox
p1.revalidate();
}
/**
* Populate {@link #webAddressBox} optionally using {@link
#historyURLVector}
*/
private void generateJComboBox() {
if (historyURLVector != null && historyURLVector.size() > 0) {
webAddressBox = new JComboBox(historyURLVector);
} else {
webAddressBox = new JComboBox();
}
if (!SimpleBrowser.hasAddedInitialURL && getURL() != null) {
webAddressBox.addItem(getURL());
} else if (!SimpleBrowser.hasAddedInitialURL && getURLPath() !
= null) {
webAddressBox.addItem(getURLPath());
}
if (getScreenWidth() == 0)
setScreenWidth(SimpleBrowser.DEFAULT_SCREEN_WIDTH);
Dimension dim = new Dimension((int)(getScreenWidth() / 1.14),
(int)(SimpleBrowser.DEFAULT_WEB_ADDRESS_BAR_HEIGHT /
2));
webAddressBox.setMaximumSize(dim);
webAddressBox.setPreferredSize(dim);
webAddressBox.setEditable(true);
webAddressBox.setBackground(Color.WHITE);
}
[/code]
When the JFrame fires up the first time, I see my top JPanel just
right with just one value in it, and the bottom JPanel with the URL
displayed. I enter another URL into the JComboBox and click the
JButton; while the bottom JPanel refreshes with a brand new URL
displayed, the top one shows ONLY the new URL; I want to display a
total dropdown of ALL URLS you have ever entered from the first until
now as a "historyURLVector" so to speak. The values in
java.util.Vector accurately reflect that you have now 2 URLS for
example instead of just the initial 1 URL, but the JCombBox only shows
1 URL when you want to see all of them.
Best way to understand this would be very easy: just like your address
bar in your browser should show multiple URLs, so should mine, but I
can't figure out how to do this part of it all the while having a semi-
working simple browser.
Thanx
Phil
Why not just change the model data in the existing JComboBox? You could make
the
JComboBox model the holder of the actual URL history, and use its methods (if
necessary extend JComboBox, or DefaultComboBoxModel, to add additional
methods)
to add and remove entries from the history. That way the JComboBox is always
going to show the correct history, you remove the duplication of the history
and the possibility of the history and the view of the history becoming
inconsistent.
That is exactly what I wound up attempting to do, however, it does not
affect the display of JComboBox. You should see 2, 3, 100 URLs, but
you only see one when you click the down-arrow.
<pre>
[code]
/**
* Populate {@link #webAddressBox} optionally using {@link
#historyURLVector}
*/
private void generateJComboBox() {
if (!SimpleBrowser.hasEnteredAdditionalURL &&
historyURLVector != null && historyURLVector.size() > 0) {
webAddressBox = new JComboBox(historyURLVector);
} else if (!SimpleBrowser.hasEnteredAdditionalURL) {
webAddressBox = new JComboBox();
}
if (getScreenWidth() == 0)
setScreenWidth(SimpleBrowser.DEFAULT_SCREEN_WIDTH);
Dimension dim = new Dimension((int)(getScreenWidth() / 1.14),
(int)(SimpleBrowser.DEFAULT_WEB_ADDRESS_BAR_HEIGHT /
2));
webAddressBox.setMaximumSize(dim);
webAddressBox.setPreferredSize(dim);
webAddressBox.setEditable(true);
webAddressBox.setBackground(Color.WHITE);
if (!SimpleBrowser.hasAddedInitialURL &&
SimpleBrowser.hasEnteredAdditionalURL) {
/** For more info <a href="https://lists.xcf.berkeley.edu/
lists/advanced-java/1999-September/000508.html">click here</a> **/
//DefaultComboBoxModel model =
(DefaultComboBoxModel)webAddressBox.getModel();
webAddressBox.setModel(new
DefaultComboBoxModel(historyURLVector));
}
}
[/code]
That methodology should work. All I can suggest is that you are not using it in
the correct way. You haven't supplied a complete working example so I can't see
how you are actually executing this code. It may be a problem due to the
necessary line of code never actually getting executed, but I can't tell as the
tests are on non-local variables which are not defined in the context of the
code you've posted.
I have the following code which replaces the contents of a JComboBox model, and
it works:
ArrayList<Group> groups = server.getGroups();
groupNameCombo.removeAllItems();
for(Group group:groups) {
groupNameCombo.addItem(group);
}
if I modify it to create a new DefaultComboBoxModel as you do, then it still
works:
ArrayList<Group> groups = server.getGroups();
groupNameCombo.setModel(new DefaultComboBoxModel(new Vector(groups)));
So, in conclusion, I'd say that what you are trying to do should work - the
method is perfectly valid. The fault must lie in your implementation of that
method. Providing small snippets of non-working code is going to get you
nowhere.
--
Nigel Wade, System Administrator, Space Plasma Physics Group,
University of Leicester, Leicester, LE1 7RH, UK
E-mail : nmw@ion.le.ac.uk
Phone : +44 (0)116 2523548, Fax : +44 (0)116 2523555