Two buttons

I have two buttons.

-first button on the left of the screen

-second button to the right of the screen

I try to do it like that, but it doesn't work)

HorizontalFieldManager titleHFM = new HorizontalFieldManager (HorizontalFieldManager.FIELD_HCENTER);
HorizontalFieldManager leftHFM = new HorizontalFieldManager (HorizontalFieldManager.FIELD_LEFT);
leftHFM.add (new ButtonField ("Left"));
HorizontalFieldManager rightHFM = new HorizontalFieldManager (HorizontalFieldManager.FIELD_RIGHT);
rightHFM.add (new ButtonField ("Right", ButtonField.RIGHT));
titleHFM.add (leftHFM);
titleHFM.add (rightHFM);
Add (titleHFM);

Hello

You can get this in overridng sublayout the title of Manager and not need to take the separate handler for each button.

Try like this,

HorizontalFieldManager titleHFM = new HorizontalFieldManager (HorizontalFieldManager.FIELD_HCENTER)
{
protected void sublayout (int maxWidth, maxHeight int)
{
setPositionChild (getField (0), 0, 0);
layoutChild (getField (0), getField (0) .getPreferredWidth (), getField (0) .getPreferredHeight ());
                
setPositionChild (getField (1), Display.getWidth () - getField (1) .getPreferredWidth (), 0);
layoutChild (getField (1), getField (1) .getPreferredWidth (), getField (1) .getPreferredHeight ());
                
setExtent (maxWidth, maxHeight);
}
};

titleHFM.add (new ButtonField ("Left"));
titleHFM.addnew ButtonField ("Right");

Kind regards

Lakshman K

Tags: BlackBerry Developers

Similar Questions

  • Synchronization of the configuration shows two buttons

    I have correctly set up Firefox Sync and used Firefox for a while successfully Sync in the PC Windows standard user on 3 computers accounts. However, when I tried to sync the administrative account on a computer, I was unable to. Since then, whenever I'm doing a tools/configuration synchronization, or Tools/Options/synchronization on all my computers, only two buttons to the top: "Create a new account" and "I have an account". There is no button 'Manage account', not related to Unlink this computer from Sync, nothing. I tried all kinds of things and I looked a long time for help on this problem and have not found something to help. If I delete my account just to start and complete synchronization, it will work, or could I be causing other problems by doing this? Any other suggestions? Thank you.

    What do you see in the list of menu drop-down menu button Firefox?

    Is - this set up sync or synchronize now?

    If you have 'Set up sync' then you seem to have lost the configuration of the synchronization and you will have to redo the set up Sync.

    If this is not possible, then try to delete (or rename) the armor in the Firefox profile folder file and reset synchronization preferences on the topic: config page.

    You can use this button to go to the Firefox profile folder:

    • Help > troubleshooting information > profile directory: see file (Linux: open the directory;) Mac: View in the Finder)

    You can open the topic: config page through the address bar and to search for the prefs that begin with services.sync and reset set user prefs ("BOLD") through the context menu on the default value.

    If it still fails, then you can try a new profile.

    Create a new profile as a test to see if your profile is the source of the problems.

    See "create a profile":

    If the new profile works then you can transfer files from a profile in the new profile, but be careful not to copy files corrupted to avoid transporting on the problem.

  • How can I have two buttons for 'new tab' in version 4?

    In version 3.x, there is a removable button on the toolbar for 'new tab' plus a button '+' at the end of the address of the open tab I could click to create a new tab.
    In version 4, I can have the removable button, but I do not see how to add the button at the end of the address of the open tab. I can move the single button at the end of the address window, but I can't have two buttons.
    Is it still possible?

    You must drag the button new tab (+) of the tabs to another toolbar toolbar to make the second button to appear.

    "Firefox > Options > toolbars" or "view > toolbars > customize.

  • I have an iMac (2015).  When I open Garageband, there are only two buttons on the control bar, play and stop.  No record button, rewind or ff.  Where are they and how can I make it appear?

    I have an iMac (2015). When I open Garageband, there are only two buttons on the control bar, play and stop. No record button, rewind or ff. Where are they and how can I make it appear?

    Try to enlarge the GarageBand window by dragging the corners of resizing.

    If she looks like this, your window is small:

    You can also try to click the double arrow at the end of the toolbar to reveal more options.

  • Satellite A350D-201 - pad touch and two buttons doen't work

    After updating the BIOS from version 1.6 to 1.8 the two buttons and the touchpad does not work.
    USB mouse works. Pointing device-enable (bios).

    I decided to reinstall Win7, in a time of installation the sensor does not work!
    Disassembled the laptop, I found nothing.

    Help!

    Have you installed the touchpad driver after the installation of Win 7?

    If so, you should also check if the touchpad has not been disabled using FN + F9 keys
    Also recommend that you check the setting in Control Panel-> mouse-> Advanced tab
    Here, you have to go into the advanced settings.
    For all I know, you could turn on and off several options of touchpad and touchpad functionality.

  • dialog two buttons

    Hello. currently im doing a project to detect road marking using multiple special geometric criteria. My idea was when the user has two choices, the program prompts the user to choose which way to go. in my program, I used a marking 'go left or right' and I plan to use two button dialog box. However, it only appears once at the beginning of the program and no longer appears. is it something wrong with the loop or in my program? or if you guys can share an idea of how is the best prompt the user to make choices.

    I here enclose the program along with the models. any help is very appreciated. Thank you

    your code should be something like this

  • Two button dialogue - fire once

    I have an application where I need to get a lot of responses from the user through two button dialog boxes. I need to feel the change of State of a locked DI and when he goes UP, display a dialog of two buttons for the user to interact. As this happens inside a while loop 100ms, I need to remove the dialog box after the user selection is made. Otherwise the pop up will happen several times as the DI is locked in a HIGH State.

    While I was able to get the feature with a registry change (see attachment to LV2009), I was wondering if there was a better way to do this kind of "once-only-messages?

    Thank you

    It is not a good idea to change the status of the digital input which is "read only".

    The final VI with the required change is as below:

  • Formatting text in "function of two button dialog box."

    With monitors high resolution, the text in the Panel that displays the function of two dialog button is often small and difficult to read (at least for these old eyes).  Is it possible to format this text?

    Roy

    You can make your own.

    Make a simple Subvi with two buttons and a text indicator. Make windows style 'dialogue' appearance and add some logic (for example an event structure) to flip the button which was pressed.

  • How to add the full value of two buttons?

    How to add the full value of two buttons (any key) VI and display it in the output text box? I am attaching a sample program, but I know that his evil... Help, please

    Try this

  • Two buttons in the title bar

    Hello

    Please, I need a help. I want to put two buttons in the title bar, but I can't (sorry, is my first application using Cascades).

    Can you help me with the code for the QML file?

    PS: Sorry, but my English is basic

    It's really easy to make!

    here:

        titleBar: TitleBar {
            title: "Title"
    
            dismissAction: ActionItem {
                title: "Cancel"
                onTriggered: {
                    // cancel code
                }
            }
    
            acceptAction: ActionItem {
                title: "Save"
                onTriggered: {
                  // save action
                }
            }
    
        }
    

    Don't forget to mark as resolved and like my post if it worked!

  • Using two buttons market timer / stop, need help please.

    Hey everybody.

    I am stil working on my project, and now I'm trying to implement a timer using two buttons market / stop. Everything I do now is when you press start the stopwatch starts and when you press stop I want the timer to stop and display the time.

    Whats happening is when I press start, the timer starts, but when stop is pressed the timer displays a value of say 12 seconds, a second more later I press stop again a value of 14secs arise and it stops at 14.  Now, whenever I press on start it will start at 14 and repeat this process.

    So I think that somewhere, I did not put my right timer.

    Could someone say somethings that I should change in my code.

    They are declared at the top:

    static public boolean status=false;
    static public int count=0;
    static public Timer timer;
    

    Here is my code:

    ButtonField start = new ButtonField("Start",ButtonField.USE_ALL_WIDTH|                          ButtonField.FIELD_HCENTER|ButtonField.USE_ALL_HEIGHT);                          start.setChangeListener(new Listener1());add(start);
    
    ButtonField stop = new ButtonField("Stop",ButtonField.USE_ALL_WIDTH|                            ButtonField.FIELD_HCENTER|ButtonField.USE_ALL_HEIGHT);                            stop.setChangeListener(new Listener2());                          add(stop);          
    
                public class Listener2 implements FieldChangeListener            {            public void fieldChanged(Field field, int context)             {            ButtonField btn = (ButtonField) field;            Status.show("Timer is at" + Integer.toString(count));            status = false;            timer.cancel();            }            }
    
                public class Listener1 implements FieldChangeListener            {            public void fieldChanged(Field field, int context)             {            ButtonField btn = (ButtonField) field;            Status.show("Timer started");            status = true;                try                {                                                timer = new Timer();                                        timer.scheduleAtFixedRate(new StartEvent(),1,1000);                }                catch(Exception e)                {                //do nothing                }            }
    
        private class StartEvent extends TimerTask    {    public void run()       {        if(status = true)              {              count++;                        }        else            timer.cancel();//        count=0;    }    }    }
    

    any help is appreciated

    Thank you guys

    Probably best to follow just a matter of a Thread.  So next time, you can start a new Thread with a new question.  However, you should also search the forum before asking questions, that your two supplementary questions have been answered in other posts on this forum.

    Concerning your problem to press the stop and get another moment, I think that you must have application logic that disables the stop button once pressed, until you press the Start button.  For example, you could do by assigning to the time of departure - 1 in the Stop button, and then, when you press the Stop button, he can check the start time and displays a message saying "Timer not started" If the start time is - 1.  There are a number of other ways to do this, I described this method because it is easy to explain.  It is not really how I'd do.

    The best way to set the buttons next, is to add then to a HorizontalFieldManager, then add the HorizontalFieldManager to your screen.

    To stop the button displays the menu, you must set it with the style CONSUME_CLICK, for example:

    ButtonField stopButton = new ButtonField ("Stop", ButtonField.CONSUME_CLICK);

  • Display two buttons

    Hello

    I try to display two buttons. I wrote the following code:

    import java.awt.*. *;

    Javax.swing import. *;

    public class Gui32B {}

    Public Shared Sub main (String [] args) {}

    JFrame frame = new JFrame ();

    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

    frame.setSize (new size (300, 100));

    frame.setTitle ("a frame");

    frame.setLayout (new FlowLayout());

    JButton button1 = new JButton ();

    Button1.SetText ("I'm a button");

    Button1.setbackground (Color.Blue);

    Frame.Add (button1);

    JButton button2 = new JButton ();

    Button1.SetText ("Click Me");

    Button1.setbackground (Color.Red);

    Frame.Add (button2);

    frame.setVisible (true);

    }

    }

    His poster the 2 buttons, but there is no text on the first button. The 2nd button also has a transparent top rectangle. Some body please correct my program. I used the border and the flow of page layouts.

    Zulfi.

    Hello

    I am able to run the code:

    import java.awt.*. *;

    Javax.swing import. *;

    creation of 2 buttons

    no visible Button2

    public class Gui3 {}

    Public Shared Sub main (String [] args) {}

    JFrame frame = new JFrame ();

    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

    frame.setSize (new size (300, 100));

    frame.setTitle ("a frame");

    frame.setLayout (new FlowLayout());

    JButton button1 = new JButton ();

    Button1.SetText ("I m a button");

    Button1.setbackground (Color.Blue);

    frame.getContentPane () .add (button1);

    JButton button2 = new JButton ();

    Button2.SetText ("Click me");

    Button2.setbackground (Color.Red);

    frame.getContentPane () .add (button2);

    Frame.Pack ();

    frame.setVisible (true);

    }

    }

    Thanks for your link.

    Zulfi.

  • This may seem like a strange question, but im trying to encode two buttons Flash Adobe, next and previous, however, when I put the thumb to the next scene and play on the next button and the previous scene and play on the previous button, it keeps switchi

    This may seem like a strange question, but im trying to encode two buttons Flash Adobe, next and previous, however, when I put the thumb to the next scene and play on the next button and the previous scene and play on the previous button, it keeps switching autour.

    If you have symbols of button on the stage to the next and previous, each of these symbols has an instance name with a listener event attached to it. The event listener is linked to a mandate. You can have a single event point to a function. So for example, if you have a next button and a click event that points to a function that says something like nextFrame(); and then you want to use the next button to point to a function that says something like nextScene(); you will need to use another instance of this next button and have this different instance to use a different event handler to point to a different function. Who help me?

  • Ways different ways according to which two buttons that they have selected

    Basically I have a kind of ticks of interaction where I would only the user based on two out of the four buttons to move forward on the next page. However, according to the two buttons, they choose will take you in a different way. Anyway is to animate on Edge?

    Thank you in advance,

    Louise

    Yes, use variables and check them.

    Example of

    initialize your variable here

    var selected1 = 1;

    var selected2 = 1;

    On your click event to check the value of the variable, and then reset the variable for the following clicks.

    That goes on the top 2 choices

    {sym.$("Button1").bind ('click', Function ()}

    selected1 = 0;   your variable goes to 0 when the conditional checks variable from the choice of the key '2 '.

    If (selected1 == 0 & selected2 == 0) {}

    ADD YOUR CODE FOR THE EVENT CLICK HERE

    selected1 = 1;  When you click on your variable will change to 1

    }

    });

    This is true for the other 2 choices

    SYM. $("button3") .bind ('click', function() {}

    selected2 = 0;  your variable goes to 0 when the conditional checks variable from the choice of the key '2 '.

    If (selected1 == 0 & selected2 == 0) {}

    ADD YOUR CODE FOR THE EVENT CLICK HERE

    selected2 = 1;  When you click on your variable will change to 1

    }

    });

  • a form two buttons send to different URLS

    I have a confirmation page to two buttons will be sent to the payment page, the other needs to access anthers URL and I'm totally stuck on how to do it. I've added comments where the button should sit and where to go,

    That's what I

    the script

    <? PHP

    $editFormAction = $_SERVER ['PHP_SELF'];

    If (isset {}

    $editFormAction. = « ? ». htmlentities($_SERVER['QUERY_STRING']);

    }

    If ((isset($_POST["MM_insert"])) & & ($_POST ["MM_insert"] == "form1")) {}

    $insertSQL = sprintf ("INSERT INTO beaubeau_orders (OrderID, CustomerID, OrderDate, shipping, Discount, tax, Total, TransactResult, imx) VALUES (%s, %s %s, %s, %s, %s, %s, %s, %s)", ")

    GetSQLValueString ($_POST ["OrderID"], "text").

    GetSQLValueString ($_POST ["CustomerID"], "int").

    GetSQLValueString ($_POST ["OrderDate"], "date").

    GetSQLValueString ($_POST ['shipping'], "double").

    GetSQLValueString ($_POST ['Discount'], "double").

    GetSQLValueString ($_POST ["tax"], "double").

    GetSQLValueString ($_POST ['XC_Amount'], "double").

    GetSQLValueString ($_POST ['TransactResult'], "text").

    GetSQLValueString ($_POST ["'imx"], "int"));

    @mysql_select_db ($database_beauSS15, $beauSS15);

    $Result1 = mysql_query ($insertSQL, $beauSS15) or die (mysql_error ());

    }

    X Cart

    $useSessions = false;

    $XCName = "beaubeau;

    $XCTimeout = 1;

    $XC_ColNames = array ("StockID", "ProductID", "Size", "Quantity", 'Name', 'Price', 'Stock', 'Total');

    $XC_ComputedCols = array ("","","","","", "", "","Price");

    require_once('XCInc/XCart.inc');

    $colname_rsCustomer = "1";

    If (isset($_SESSION['MM_UserAuthorization'])) {}

    $colname_rsCustomer = $_SESSION ["MM_UserAuthorization"];

    }

    @mysql_select_db ($database_beauSS15, $beauSS15);

    $query_rsCustomer = sprintf ("SELECT * FROM beaubeau_customers WHERE the beaubeau_customers.") (CustomerID = %s", GetSQLValueString ($colname_rsCustomer,"int"));

    $rsCustomer = mysql_query ($query_rsCustomer, $beauSS15) or die (mysql_error ());

    $row_rsCustomer = mysql_fetch_assoc ($rsCustomer);

    $totalRows_rsCustomer = mysql_num_rows ($rsCustomer);

    to pass URL parameters

    If (! session_id()) session_start();

    If (isset($_SESSION["x_urlstr"])) {}

    $x_reqstr = $_SESSION ["x_urlstr"];

    session_unregister ("x_urlstr");

    }

    Repeat XCart region * (do not remove this label)

    Redirect if XCart is empty *.

    $XC_RedirectIfEmpty = "SS15cart.php";

    If (isset($_SERVER["QUERY_STRING"])) {}

    $XC_RedirectIfEmpty. = « ? ». htmlentities($_SERVER["QUERY_STRING"]);

    }

    If (isset(${$XCName}["contents"]) & & (sizeof(${$XCName}["contents"][0]) == 0)) header ("Location:".) $XC_RedirectIfEmpty);

    validate x limit

    $XC_invalidItems = "";

    $XC_lim = "";

    $iCol = array_search("Quantity",${$XCName}["ColNames"]);

    $iSrc = array_search("Stock",${$XCName}["ColNames"]);

    for ($iVal = 0; $iVal < sizeof(${$XCName}["contents"][0]); $iVal ++) {}

    {If (${$XCName} ['material'] [$iCol] [$iVal] > {${$XCName} ["content"] [$iSrc] [$iVal]})}

    If ($XC_invalidItems! = "") $XC_invalidItems. = «- » ;

    $XC_invalidItems. (string) = ($iVal + 1);

    If ($XC_lim! = "") $XC_lim. = «- » ;

    $XC_lim. (string) = ${$XCName} ['material'] [$iSrc] [$iVal];

    }

    }

    If ($XC_invalidItems! = "") {}

    $XC_invalidItems = "(".) " $XC_invalidItems. "by";

    $XC_lim = "(".) " $XC_lim. "by";

    $x_limErr = "the articles $XC_invalidItems exceed the available stock of $XC_lim";

    }

    Add delivery according to area: fixed

    @mysql_select_db ($database_beauSS15, $beauSS15);

    $XC_ShipSource = "SELECT Value FROM beaubeau_shipbyzone WHERE the area = '". $row_rsCustomer ['country']. "'";

    $XC_rsShip = mysql_query ($XC_ShipSource, $beauSS15) or die (mysql_error ());

    $row_XC_rsShip = mysql_fetch_assoc ($XC_rsShip);

    $XC_Shipping is $row_XC_rsShip ['value'];. When free shipping, done using the varialble

    $XC_Shipping = 0;

    $XC_rsShip = null;

    DISCOUNT NEW QUERY.

    @mysql_select_db ($database_beauSS15, $beauSS15);

    $query_rsDiscount = "SELECT * FROM beaubeau_discounts";

    $rsDiscount = mysql_query ($query_rsDiscount, $beauSS15) or die (mysql_error ());

    $row_rsDiscount = mysql_fetch_assoc ($rsDiscount);

    $totalRows_rsDiscount = mysql_num_rows ($rsDiscount);

    $discountName = $row_rsDiscount ["discountName"];

    $discountExpire = $row_rsDiscount ["discountExpire"];

    $discountAmount = $row_rsDiscount ["discountAmount"];

    NEW APPLICATION OF DISCOUNT END.

    new discount code

    If (isset($_POST['discount']) & & $_POST ['discount'] == "BOO")

    {

    $multiplier = 0.8;

    }

    on the other

    {

    $multiplier = 1;

    }

    Calculate the Total general

    $XC_GranTotal = ($XCart_sumTotal * $multiplier) + $XC_SalesTax + $XC_Shipping;

    before this reduction * $XC_GranTotal = $XCart_sumTotal + $XC_SalesTax + $XC_Shipping-$XC_Discount;

    query string

    $x_urlstr is "amount =". number_format ($XC_GranTotal, 2). '& firstname ='. UrlEncode ($row_rsCustomer ['FirstName']). '& lastname ='. UrlEncode ($row_rsCustomer ['LastName']). '& cemail ='. $row_rsCustomer ['email']. '& caddress ='. UrlEncode ($row_rsCustomer ['Address']). '& clocation ='. UrlEncode ($row_rsCustomer ['Town']). '& cprovence ='. UrlEncode ($row_rsCustomer ['County']). '& czip ='. $row_rsCustomer ['postal code']. '& ccountry ='. UrlEncode ($row_rsCustomer ['Country']);

    $_SESSION ["x_urlstr"] = $x_urlstr;

    session_register ("x_urlstr");

    Save XCart contained in table *.

    require_once('XCInc/XCsaveAction.inc');

    If (isset($_GET['XC_SaveCartToTable']) & & ($_GET ['XC_SaveCartToTable'] == '1')) {}

    $XC_destColName = array("SKU","ItemID","UnitSize","Quantity","","UnitPrice","","Total");

    $XC_destColType = array("num","str","str","num","num","num","num","num");

    $XC_orderId = $_SESSION ["OrderID"];

    $XC_tableName = "beaubeau_orderdetails";

    $XC_OrderIDCol = "OrderID";

    $XC_OrderIDType = 'NB ';

    $XC_AddToTableRedirect = "SS15paypal.php?$x_reqstr";///these is the URL where the buttons should send. "

    $XC_AddToTableRedirect = ' paypalpro1.php?$x_reqstr";//// here's the URL where the buttons should send .

    $XC_conName = "beauSS15";

    require_once('XCInc/SaveXCartToTable.inc');

    } ? >

    the form is here

    < do action = "<?" PHP echo $editFormAction;? ">" method = "POST" name = "form1" id = "form1" >

    < input name = "Button" type = "image" src = "images/proceed.jpg" value = "Pass to secure the server" / > "

    "< input name ="Button"type ="image"src =" images/proceed.jpg"value =" PAY BY CREDIT CARD "/ > <!--this is the second button-->

    < input name = "OrderID" type = "hidden" value = "<?" PHP echo $_SESSION ["OrderID"];? ">" / >

    < input type = "hidden" name = "Shipping" value = "<?" PHP echo $XC_Shipping;? ">" / >

    < input name = "Discount" type = "hidden" value = "<?" PHP echo $XC_Discount;? ">" / >

    < input type = "hidden" name = "Tax" value = "<?" PHP echo $XC_SalesTax;? ">" size = "32" / >

    < input type = "hidden" name = "XC_Amount" value = "<?" PHP echo $XC_GranTotal;? ">" / >

    < input type = "hidden" name = "CustomerID" value = "<?" PHP echo $row_rsCustomer ["CustomerID"];? ">" size = "32" / >

    < input type = "hidden" name = "OrderDate" value = "<?" PHP echo date("Y-m-d")? ">" / >

    < input type = "hidden" name = "MM_insert" value = "form1" / >

    < input type = "hidden" name = "XC_Limit" value = "<?" PHP echo @$x_limErr;? ">" / >

    < input name = "TransactResult" type = "hidden" value = "awaiting payment" / >

    < input name = "imx" type = "hidden" value = "2" / >

    < / make >

    There must be a right of liquidation?

    How many times I have to tell you that the syntax is incorrect. Please read the previous answers posted carefully, otherwise it's a complete waste of time

    YOU HAVE BRACKETS LACK IN THE CODE YOU HAVE POSTED (BELOW IN RED)

    If (is_numeric($_POST['buttonClicked']) & ($_POST ['buttonClicked'] == 1))

    ElseIf (is_numeric($_POST['buttonClicked']) & ($_POST ['buttonClicked'] == 2))

    You must get the right code until it had a chance to work - its just not good 'hoping' its going to work.

    You took the code I provide in my example and tested, you will find that it works. It's the starting point at which you should engage and whenever you introduce a new piece of test code.

Maybe you are looking for

  • I have no sound coming out of my macbook pro and see a red light in the hole of the listener.

    I do not have its coming out of my macbook pro os x 10.8.1 but if an earphone is connected I hear the sound and there is a red light through the matter of earphone. What is happening to you can help me?

  • TosSENotify C ++ Runtime error

    Whenever my laptop starts up I get a window "Microsoft Visual C++ Runtime Library. That said... Runtime error!Program: C:\.This application has requested the execution to terminate in an unusual way. For more information, contact the application supp

  • Text (of indication) in EditField of guest

    Hi all The user interface and Guide of Navigation, in the section of practices for text fields, mentions: "use prompt text that when space on a screen is limited and you can't include a label or an explanatory text. Prompt text appears in the field a

  • Live window email crashes

    Why is windows live email hang when mail is received? No error message, just hangs.

  • Cisco 1700 Setup as a hub for Cisco Anyconnect VPN

    The complete configuration for the router is attached. Additional configuration includes forwarding port 443 (the two tcp/udp), udp 4500, udp 500 and udp 50 to 192.168.1.20. Objective: Configure Cisco 1700 router as a VPN server, which a Cisco Anycon