Nachdem ich hier schon viele Antworten gefunden habe, jetzt meine 1. Frage:
Ich möchte, dass auf Tastendruck von VK.DIVIDE sich ein Menu öffnet. Das Menu reagiert auf ALT+M, das ist kein Problem. Allerdings möchte ich das Menu eben auch auf das Keyevent VK.DIVIDE öffnen.
Hat jemand eine Idee, wie ich das realisieren kann? Ich habe mir gedacht, ich fange das Keyevent VK.DIVIDE ab und führe dann die Aktion ALT+M aus. Nur finde ich leider keinen Weg, diesen Tastendruck ans System zu senden.
Ich vermute, das könnte auch über Keyevents laufen, nur weiß ich leider nicht wie.
Außerdem möchte ich, dass ich im dann aufgerufenen Menu mit den Pfeiltasten VK.UP und VK.DOWN navigieren kann.
Hintergrund: Wie sollen eine Handyanwendung programmieren, die nur auf bestimmte Tasten reagiert. Diese Tasten senden eben nur die Keyevents des Nummerpads. Ich kann also nicht auf dem Bildschirm in der GUI rumklicken, sondern muss alles über die Nummernpadtasten steuern können.
Ich danke euch für eure Antwort und Hilfestellung!
Edit: Ich sehe, dass immer Java Code eingefügt wird, finde aber anscheinend nicht die richtigen Code-Tags. Im Editor stehen nur Tags für HTML, PHP und Code? Egal, nachfolgend nochmal mein Code:
Ich möchte, dass auf Tastendruck von VK.DIVIDE sich ein Menu öffnet. Das Menu reagiert auf ALT+M, das ist kein Problem. Allerdings möchte ich das Menu eben auch auf das Keyevent VK.DIVIDE öffnen.
Hat jemand eine Idee, wie ich das realisieren kann? Ich habe mir gedacht, ich fange das Keyevent VK.DIVIDE ab und führe dann die Aktion ALT+M aus. Nur finde ich leider keinen Weg, diesen Tastendruck ans System zu senden.
Ich vermute, das könnte auch über Keyevents laufen, nur weiß ich leider nicht wie.
Außerdem möchte ich, dass ich im dann aufgerufenen Menu mit den Pfeiltasten VK.UP und VK.DOWN navigieren kann.
Hintergrund: Wie sollen eine Handyanwendung programmieren, die nur auf bestimmte Tasten reagiert. Diese Tasten senden eben nur die Keyevents des Nummerpads. Ich kann also nicht auf dem Bildschirm in der GUI rumklicken, sondern muss alles über die Nummernpadtasten steuern können.
Ich danke euch für eure Antwort und Hilfestellung!
Edit: Ich sehe, dass immer Java Code eingefügt wird, finde aber anscheinend nicht die richtigen Code-Tags. Im Editor stehen nur Tags für HTML, PHP und Code? Egal, nachfolgend nochmal mein Code:
Code:
public class Add_1 extends Add {
private static final long serialVersionUID = 1L;
protected String getTitle() { return "Neuer Eintrag"; }
protected String getLabelLeft() { return "Menu"; }
protected String getLabelRight() { return "Entf"; }
private JTextField _sumtext;
private JFormattedTextField _datetext;
private JTextField _commenttext;
private JMenuBar _menuBar;
private JMenu _menu;
private JMenuItem _beendenM, _ausgabenM;
private int _focus = 0;
public Add_1(MobileApp app) {
super(app);
_expense = new Expense();
// if nothing is specified, create own data set.
useData(_expense);
}
public Add_1(MobileApp app, Expense data) {
super(app);
// ...or gladly use the given one...
useData(data);
}
protected JPanel getDialogContent() {
JPanel content = new JPanel();
content.setLayout(new GridLayout(6,1));
// sum label and input
content.add(new JLabel("Betrag (in Cent)"));
// input
_sumtext = new JTextField();
_sumtext.setDocument(new NumberDocument());
_sumtext.setBorder(BorderFactory.createLineBorder(Color.red));
content.add(_sumtext);
// date label and input
content.add(new JLabel("Datum"));
// current date...
_datetext = new JFormattedTextField();
_datetext.setEditable(false);
_datetext.setBorder(BorderFactory.createLineBorder(Color.gray));
// date
content.add(_datetext);
// comment
content.add(new JLabel("Kommentar"));
_commenttext = new JTextField("");
_commenttext.setBorder(BorderFactory.createLineBorder(Color.gray));
content.add(_commenttext);
return content;
}
/**
* Erstellt das Menu unten Links
*/
public JMenuBar createMenuBar()
{
// Create the menu bar
_menuBar = new JMenuBar();
_menuBar.setBackground(Color.BLACK);
_menuBar.setForeground(Color.WHITE);
_menuBar.setOpaque(true); // otherwise the background is not drawn
//_menuBar.setHorizontalAlignment(SwingConstants.CENTER);
_menuBar.setBorder(BorderFactory.createEmptyBorder(5,10,5,10));
// Menu erstellen
_menu = new JMenu(getLabelLeft());
_menu.setBackground(Color.BLACK);
_menu.setForeground(Color.WHITE);
_menu.setOpaque(true); // otherwise the background is not drawn
_menu.setMnemonic(KeyEvent.VK_M);
_menu.getAccessibleContext().setAccessibleDescription("Das Menu");
// MenuItem zu Beenden
_beendenM = new JMenuItem("Beenden", KeyEvent.VK_B);
// Tastaturkürzel für _beendenM festlegen
_beendenM.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B, ActionEvent.ALT_MASK));
_beendenM.getAccessibleContext().setAccessibleDescription("Programm beenden");
_menu.add(_beendenM);
// Seperator zum Menu hinzufügen
_menu.insertSeparator(1);
// MenuItem zu Ausgaben
_ausgabenM = new JMenuItem("Ausgaben", KeyEvent.VK_A);
// Tastaturkürzel für _ausgabenM festlegen
_ausgabenM.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, ActionEvent.ALT_MASK));
_ausgabenM.getAccessibleContext().setAccessibleDescription("Ausgaben ansehen");
_menu.add(_ausgabenM);
_menu.setMenuLocation(-11,-56);
//Listener für die Menuitems registrieren
addListener();
// das fertige Menu zur Menubar hinzufügen
_menuBar.add(_menu);
return _menuBar;
}
/**
* Die Action Listener für die Menu Items registrieren
*/
protected void addListener() {
// Action auf Menuklick Beenden
_beendenM.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println("Beenden");
}
}
);
// Action auf Menuklick Ausgaben
_ausgabenM.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println("Ausgaben");
}
}
);
}
........ UNWICHTIGES RAUSGESCHNITTEN
public boolean keyPressed(int keyCode) {
if(keyCode == KeyEvent.VK_SUBTRACT) {
JTextField field = null;
if(_focus == 0) { field = _sumtext; }
if(_focus == 1) { return true; } // del disabled for _datetext
if(_focus == 2) { field = _commenttext; }
int pos = field.getCaretPosition();
String t = field.getText();
// we can't delete something here
if(pos == 0) return true;
// get the fucking char and kill it
int KILL = 1;
String first = t.substring(0, pos-KILL);
String end = t.substring(pos);
// nothing happened...
field.setText(first+end);
field.setCaretPosition(pos-1);
return true;
}
if(keyCode == KeyEvent.VK_DIVIDE) {
//save changes
saveFields();
_focus=3;
changeFocus();
// next thing
//Menu_add newOne = new Menu_add(_app);
//_app.newDialog(newOne);
return true;
}
if(_focus==1 && keyCode == KeyEvent.VK_LEFT) {
Datumkram kram = new Datumkram();
_datetext.setText(kram.dayMinus(_datetext.getText()));
_datetext.setCaretPosition(0);
}
if(_focus==1 && keyCode == KeyEvent.VK_RIGHT) {
Datumkram kram = new Datumkram();
_datetext.setText(kram.dayPlus(_datetext.getText()));
_datetext.setCaretPosition(10);
}
// next window
if(keyCode == KeyEvent.VK_ENTER || keyCode == KeyEvent.VK_MULTIPLY) {
//save changes
saveFields();
// next thing
//Add_Category newOne = new Add_Category(_expense);
//newOne.useData(_expense);
//_app.newDialog(newOne);
return true;
}
// down = bottom input field
if(keyCode == KeyEvent.VK_DOWN) {
_focus ++;
if(_focus > 2) _focus = 0;
changeFocus();
return true;
}
// up = top input field
if(keyCode == KeyEvent.VK_UP) {
-- _focus;
if(_focus < 0) _focus = 2;
changeFocus();
return true;
}
return false;
}
// there must be a better way...
private void changeFocus() {
if(_focus == 0)
{
_sumtext.requestFocus();
_sumtext.setBorder(BorderFactory.createLineBorder(Color.red));
_datetext.setBorder(BorderFactory.createLineBorder(Color.gray));
_commenttext.setBorder(BorderFactory.createLineBorder(Color.gray));
}
if(_focus == 1) {
_datetext.requestFocus();
_datetext.setCaretPosition(0);
_sumtext.setBorder(BorderFactory.createLineBorder(Color.gray));
_datetext.setBorder(BorderFactory.createLineBorder(Color.red));
_commenttext.setBorder(BorderFactory.createLineBorder(Color.gray));
}
if(_focus == 2) {
_commenttext.requestFocus();
_sumtext.setBorder(BorderFactory.createLineBorder(Color.gray));
_datetext.setBorder(BorderFactory.createLineBorder(Color.gray));
_commenttext.setBorder(BorderFactory.createLineBorder(Color.red));
}
if(_focus == 3) {
_menu.requestFocus();
_menu.setBackground(Color.red);
}
}