Problem changng Java application title dynamically


W

wla2000

I want to change the title bar of my Java Swing application
(constructed with Netbeans 6.5) at runtime. I should be able to use
code like this:
JFrame mainFrame = TestTitleChangeApp.getApplication
().getMainFrame();
mainFrame.setTitle("hello world");
However it is not working. My guess is that I am inserting the code
too early, such that the application goes ahead and sets its
"Application.title" property <i>after</i> it executes the above code.

To strip this down to Netbeans essentials, I created a new application
that does <i>nothing</i> but change the title dynamically, using the
above code at the end of the generated constructor, which in this case
is called TestTitleChangeApp(app). I have also tried putting my
customized code within the InitComponents() function, and got the same
result.

Any suggestions? If this is not the correct forum for something like
this, my apologies in advance, and I request guidance as to where to
go. Thanks.

Here is the entire Java class file, but note that the only things I
customized were lines 82 and 83, which are as above (and were not
present in the original generated code).

/*
* TestTitleChangeView.java
*/

package testtitlechange;

import org.jdesktop.application.Action;
import org.jdesktop.application.ResourceMap;
import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.FrameView;
import org.jdesktop.application.TaskMonitor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
import javax.swing.Icon;
import javax.swing.JDialog;
import javax.swing.JFrame;

/**
* The application's main frame.
*/
public class TestTitleChangeView extends FrameView {

public TestTitleChangeView(SingleFrameApplication app) {
super(app);

initComponents();

// status bar initialization - message timeout, idle icon and
busy animation, etc
ResourceMap resourceMap = getResourceMap();
int messageTimeout = resourceMap.getInteger
("StatusBar.messageTimeout");
messageTimer = new Timer(messageTimeout, new ActionListener()
{
public void actionPerformed(ActionEvent e) {
statusMessageLabel.setText("");
}
});
messageTimer.setRepeats(false);
int busyAnimationRate = resourceMap.getInteger
("StatusBar.busyAnimationRate");
for (int i = 0; i < busyIcons.length; i++) {
busyIcons = resourceMap.getIcon("StatusBar.busyIcons["
+ i + "]");
}
busyIconTimer = new Timer(busyAnimationRate, new ActionListener
() {
public void actionPerformed(ActionEvent e) {
busyIconIndex = (busyIconIndex + 1) %
busyIcons.length;
statusAnimationLabel.setIcon(busyIcons
[busyIconIndex]);
}
});
idleIcon = resourceMap.getIcon("StatusBar.idleIcon");
statusAnimationLabel.setIcon(idleIcon);
progressBar.setVisible(false);

// connecting action tasks to status bar via TaskMonitor
TaskMonitor taskMonitor = new TaskMonitor(getApplication
().getContext());
taskMonitor.addPropertyChangeListener(new
java.beans.PropertyChangeListener() {
public void propertyChange(java.beans.PropertyChangeEvent
evt) {
String propertyName = evt.getPropertyName();
if ("started".equals(propertyName)) {
if (!busyIconTimer.isRunning()) {
statusAnimationLabel.setIcon(busyIcons[0]);
busyIconIndex = 0;
busyIconTimer.start();
}
progressBar.setVisible(true);
progressBar.setIndeterminate(true);
} else if ("done".equals(propertyName)) {
busyIconTimer.stop();
statusAnimationLabel.setIcon(idleIcon);
progressBar.setVisible(false);
progressBar.setValue(0);
} else if ("message".equals(propertyName)) {
String text = (String)(evt.getNewValue());
statusMessageLabel.setText((text == null) ? "" :
text);
messageTimer.restart();
} else if ("progress".equals(propertyName)) {
int value = (Integer)(evt.getNewValue());
progressBar.setVisible(true);
progressBar.setIndeterminate(false);
progressBar.setValue(value);
}
}
});
JFrame mainFrame = TestTitleChangeApp.getApplication
().getMainFrame();
mainFrame.setTitle("hello world");
}

@Action
public void showAboutBox() {
if (aboutBox == null) {
JFrame mainFrame = TestTitleChangeApp.getApplication
().getMainFrame();
aboutBox = new TestTitleChangeAboutBox(mainFrame);
aboutBox.setLocationRelativeTo(mainFrame);
}
TestTitleChangeApp.getApplication().show(aboutBox);
}

/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

mainPanel = new javax.swing.JPanel();
menuBar = new javax.swing.JMenuBar();
javax.swing.JMenu fileMenu = new javax.swing.JMenu();
javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem
();
javax.swing.JMenu helpMenu = new javax.swing.JMenu();
javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem
();
statusPanel = new javax.swing.JPanel();
javax.swing.JSeparator statusPanelSeparator = new
javax.swing.JSeparator();
statusMessageLabel = new javax.swing.JLabel();
statusAnimationLabel = new javax.swing.JLabel();
progressBar = new javax.swing.JProgressBar();

mainPanel.setName("mainPanel"); // NOI18N

javax.swing.GroupLayout mainPanelLayout = new
javax.swing.GroupLayout(mainPanel);
mainPanel.setLayout(mainPanelLayout);
mainPanelLayout.setHorizontalGroup(
mainPanelLayout.createParallelGroup
(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE)
);
mainPanelLayout.setVerticalGroup(
mainPanelLayout.createParallelGroup
(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 252, Short.MAX_VALUE)
);

menuBar.setName("menuBar"); // NOI18N

org.jdesktop.application.ResourceMap resourceMap =
org.jdesktop.application.Application.getInstance
(testtitlechange.TestTitleChangeApp.class).getContext().getResourceMap
(TestTitleChangeView.class);
fileMenu.setText(resourceMap.getString("fileMenu.text")); //
NOI18N
fileMenu.setName("fileMenu"); // NOI18N

javax.swing.ActionMap actionMap =
org.jdesktop.application.Application.getInstance
(testtitlechange.TestTitleChangeApp.class).getContext().getActionMap
(TestTitleChangeView.class, this);
exitMenuItem.setAction(actionMap.get("quit")); // NOI18N
exitMenuItem.setName("exitMenuItem"); // NOI18N
fileMenu.add(exitMenuItem);

menuBar.add(fileMenu);

helpMenu.setText(resourceMap.getString("helpMenu.text")); //
NOI18N
helpMenu.setName("helpMenu"); // NOI18N

aboutMenuItem.setAction(actionMap.get("showAboutBox")); //
NOI18N
aboutMenuItem.setName("aboutMenuItem"); // NOI18N
helpMenu.add(aboutMenuItem);

menuBar.add(helpMenu);

statusPanel.setName("statusPanel"); // NOI18N

statusPanelSeparator.setName("statusPanelSeparator"); //
NOI18N

statusMessageLabel.setName("statusMessageLabel"); // NOI18N

statusAnimationLabel.setHorizontalAlignment
(javax.swing.SwingConstants.LEFT);
statusAnimationLabel.setName("statusAnimationLabel"); //
NOI18N

progressBar.setName("progressBar"); // NOI18N

javax.swing.GroupLayout statusPanelLayout = new
javax.swing.GroupLayout(statusPanel);
statusPanel.setLayout(statusPanelLayout);
statusPanelLayout.setHorizontalGroup(
statusPanelLayout.createParallelGroup
(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(statusPanelSeparator,
javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
.addGroup(statusPanelLayout.createSequentialGroup()
.addContainerGap()
.addComponent(statusMessageLabel)
.addPreferredGap
(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 226,
Short.MAX_VALUE)
.addComponent(progressBar,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap
(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(statusAnimationLabel)
.addContainerGap())
);
statusPanelLayout.setVerticalGroup(
statusPanelLayout.createParallelGroup
(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(statusPanelLayout.createSequentialGroup()
.addComponent(statusPanelSeparator,
javax.swing.GroupLayout.PREFERRED_SIZE, 2,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap
(javax.swing.LayoutStyle.ComponentPlacement.RELATED,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(statusPanelLayout.createParallelGroup
(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(statusMessageLabel)
.addComponent(statusAnimationLabel)
.addComponent(progressBar,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(3, 3, 3))
);

setComponent(mainPanel);
setMenuBar(menuBar);
setStatusBar(statusPanel);
}// </editor-fold>

// Variables declaration - do not modify
private javax.swing.JPanel mainPanel;
private javax.swing.JMenuBar menuBar;
private javax.swing.JProgressBar progressBar;
private javax.swing.JLabel statusAnimationLabel;
private javax.swing.JLabel statusMessageLabel;
private javax.swing.JPanel statusPanel;
// End of variables declaration

private final Timer messageTimer;
private final Timer busyIconTimer;
private final Icon idleIcon;
private final Icon[] busyIcons = new Icon[15];
private int busyIconIndex = 0;

private JDialog aboutBox;
}
 
Ad

Advertisements

A

Andrew Thompson

I want to change the title bar of my Java Swing application
(constructed with Netbeans 6.5) at runtime.  I should be able to use
code like this:
        JFrame mainFrame = TestTitleChangeApp.getApplication
().getMainFrame();
        mainFrame.setTitle("hello world");
However it is not working.  My guess is that I am inserting the code
too early, such that the application goes ahead and sets its
"Application.title" property <i>after</i> it executes the above

My guess is that your IDE has grabbed you by
the short and curlies.

After I changed that code posting to fix the
line wrap errors, I got 25 compilation errors
from the IDE specific packages.

So, here* is a short code that should not line
wrap, and shows that changing the title is
simplicity itself.

Why that fails to work in 'Netbeans' I neither
know nor particularly care, since *you* the
developer should grab *it* by the short and curlies.

So roll up your sleeves, put down the (damnable)
Netbeans 'wizards' and start *coding*.

An article that has tips for creating code intended
for vieing by others can be seen at
<http://pscode.org/sscce.html>

It even links to the Text Width Checker that I
wrote specially to help avoid line wrap.

* Simple code to change a JFrame title.

<sscce>
import javax.swing.*;
import java.awt.event.*;

class SetTitle {

public static void main(String[] args) {

Runnable r = new Runnable() {
public void run() {
final JFrame f = new JFrame("Initial Title");
f.setDefaultCloseOperation(
JFrame.DISPOSE_ON_CLOSE);

final JTextField title = new JTextField(20);
title.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae) {
f.setTitle(title.getText());
}
});

f.add(title);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}
</sscce>
 
M

Mark Space

FrameView and jDesktop is JSR 296 stuff. Unfortunately there's not a
lot of expertise on that. It's totally new, and still a little half
baked, imo. Sorry I can't help you with it.

If you want to follow Andrew's advice, do not create "Java Desktop
Application" in your IDE. Just create the regular old "Java
Application". When you want to use Matisse, click on the package and
instead of picking "Add New Class" pick "Add New Form". You'll still
have a the GUI editor available and be able to change to a source view
to edit. But you'll be using straight Swing and you'll have much better
luck finding information.
 
W

wla2000

FrameView and jDesktop is JSR 296 stuff.  Unfortunately there's not a
lot of expertise on that.  It's totally new, and still a little half
baked, imo.  Sorry I can't help you with it.

If you want to follow Andrew's advice, do not create "Java Desktop
Application" in your IDE.  Just create the regular old "Java
Application".  When you want to use Matisse, click on the package and
instead of picking "Add New Class" pick "Add New Form".  You'll still
have a the GUI editor available and be able to change to a source view
to edit.  But you'll be using straight Swing and you'll have much better
luck finding information.


I get the feeling that I may have posted to the wrong group. I'm
pretty much committed to using a higher-level environment, like that
afforded by NetBeans, because I would rather allocate my efforts to
implementing the business logic rather than messing around with
Swing's weird layout methodologies.

*All* programmers take advantage of high-level language capabilities,
unless they write code in Assembler. The higher the language level,
the more dependent you are on the environment (like NetBeans), but the
more you are freed to concentrate on what the product is supposed to
do. Maybe I'm unnecessarily intimidated by Swing, but I just cannot
believe that people spend time coding Swing when code generators like
NetBeans can do the grunt work for them.

I'm aware that I can dynamically set application titles using simple
code like Andrew posted - and have done that while creating a regular
old "Java Application" - but am looking for posters with Netbeans
experience who can point me in the right direction - or let me know
unequivocably that this cannot be done in Netbeans.

Accordingly I have posted this question at http://forums.netbeans.org/netbeans-users.html,
which might be a more appropriate forum.

Thanks Andrew and Mark for your replies.
 
M

Mark Space

wla2000 said:
*All* programmers take advantage of high-level language capabilities,
unless they write code in Assembler. The higher the language level,
the more dependent you are on the environment (like NetBeans), but the
more you are freed to concentrate on what the product is supposed to
do. Maybe I'm unnecessarily intimidated by Swing, but I just cannot
believe that people spend time coding Swing when code generators like
NetBeans can do the grunt work for them.

I use NetBeans. And I use Matisse to do Swing code generation. Matisse
has been fully integrated into NetBeans for a long while now.

Just sayin'.

Thanks for posting that link to the follow-up conversation, though. I'm
interested to see if anyone is actually using the Swing Application
Framework yet.
 
Ad

Advertisements

W

Wesley MacIntosh

Mark said:
FrameView and jDesktop is JSR 296 stuff. Unfortunately there's not a
lot of expertise on that. It's totally new, and still a little half
baked, imo. Sorry I can't help you with it.

If you want to follow Andrew's advice, do not create "Java Desktop
Application" in your IDE. Just create the regular old "Java
Application". When you want to use Matisse, click on the package and
instead of picking "Add New Class" pick "Add New Form". You'll still
have a the GUI editor available and be able to change to a source view
to edit. But you'll be using straight Swing and you'll have much better
luck finding information.

My preference is to eschew GUI builders entirely and spend the time to
code the GUI manually. It's more work, but you have more control over
the code that way, the code can be used by other people that use other
tools much more easily, and you can do anything Swing lets you do.

GUI builders often create constraints, or at least difficulties; wla2000
has run into one such. Another is that it's often difficult to combine
use of a GUI builder with use of custom Swing components, special layout
managers, and similar.

I myself have played with the GUI builder in Netbeans. I created a
subclass of JTextArea for some purpose or another (I forget now, it was
over a year ago) and couldn't for the life of me figure out how to get
the thing to appear in the GUI builder's palette, or otherwise use it in
a JFrame class created using the GUI builder.
 
W

Wesley MacIntosh

ProfDad said:
Glad to hear that I'm not the only one that finds a high degree of
restrictiveness in the NetBeans GUI builder. I have, however, been
able to use some aspects of the GUI builder in NetBeans, then modify
the code in a text editor (mostly removing and modifying the jdesktop
references) to get it to do what I WANT it to do (LOL).

That's the other problem with GUI builders: the code they output looks
pants. Not meant for humans to try to maintain.
 
Joined
Dec 18, 2009
Messages
1
Reaction score
0
Try this code guy!

Code:
public class MyClass extends FrameView {
 public MyClass(SingleFrameApplication app) {
        super(app);

        //This the CODE
         [B]this.getFrame().setTitle[/B]("Meu titulo sem Application.title"+Constants.PROGRAM_NAME);
 }
}

8)
 
Ad

Advertisements

Joined
Sep 26, 2010
Messages
1
Reaction score
0
Thanks Darkliz - you simply answered the question which helped me

Why can't more forum users just answer questions.

Cheers

Paul:trytofly:
 
Ad

Advertisements


Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top