Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Java » Probleme mit JTable und Tabulatoren

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
31.05.2006, 18:16 Uhr
Lumina



Hi Leute,
da mir heute nicht mal mein Prof diese Fragen beantworten konnte und ich schon wochenlang in Büchern und in der API gesucht habe, versuch ich hier nochmal mein Glück:

1.Wie kann man in einer JTable eine Spalte vom Editieren durch den Benutzer ausschließen?
2.Gibt es einen Editor / eine Möglichkeit, in einer Tabellenspalte der JTable nur Kommazahlen und Enter / Tab zu erlauben?
3.Wie kann ich herausfinden, ob ein PC mit Punkt oder Komma als Dezimaltrenner bei Zahlen arbeitet?
4.Wie legt man die Tabulatorreihenfolge in JAVA fest?
5.Wie legt man Shortcuts an, um eine Steuerung nur über Tastatur, also ohne Maus, zu erreichen?

Bitte helft mir, ich hab keine Ahnung, wen ich sonst noch fragen könnte! Danke.
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
31.05.2006, 19:33 Uhr
KaraHead



1)
Entweder bei AbstractTableModel oder bei JTable, die Methode isCellEditable(int row,int column) überschreiben und bei Bedarf true oder false zurückliefern.

2)
Einem JTextField einen KeyListener hinzufügen und nur die benötigten Tasten durchlassen.
Dann mittels

C++:
table.setDefaultCellEditor(Object.class, myLockedTextFiel);
oder
table.setCellEditor(myLockedTextField);


der JTable hinzufügen.

3)
Bin mir nicht sicher ob das überhaupt geht. Aber du kannst ja die Ländereinstellung vom System mit Konstanten aus der Klasse Locale vergleichen und entscheiden ob das System . oder , benutzt.

C++:
if(Locale.getDefault().equals(Local.GERMANY))
{
//benutze ,
}else{
//benutze .
}



4)
Hab mal gegooglet und es scheint schwerer zu sein als ich dachte.
Hier der Link

5)
Wo sollen denn die Shortcuts sein? Im Menu oder generell im Programm?

Gruß KaraHead
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
31.05.2006, 20:27 Uhr
Lumina



1) isCellEditable ist doch dafür da, um nachzufragen, ob eine Zelle editierbar ist, oder?! Ich will aber so eine Methode, die mir in meinem Fall die ganze erste Spalte uneditierbar macht. Sowas wie setColumnEnabled(int index, boolean state)

2) Genau das hab ich schon mal probiert, weil ich das aus C# kenne, aber irgendwie hat das nicht funktioniert...

3) muss ich mal schauen,... jetzt hab ich wenigstens einen Anhaltspunkt - danke

4) sieht ganz praktisch aus, hätte ich selbst wohl nicht gefunden- geschweige denn schreiben können

5) Die Shortcuts brauche ich vor allem für das Anspringen von Schaltflächen (JButtons), ein Menu will ich aber später auch noch einbauen.


Gruß Sonnie
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
31.05.2006, 21:07 Uhr
KaraHead



1)
Naja wenn du z.B. die Spalte 3 nicht editierbar machen willst, dann schreib einfach

C++:
boolean isCellEditable(int row, int column){
  return (column==3?false:true);
}


Sperrt dir die ganze 3. Spalte. Geht auch noch kokmplizierter.

2)
Zeig mal wie du es machen würdest, vielleicht sind die Fehler nur trivial.

5)
Soweit ich weiß kannst du bei Buttons nur Mnemonics setzten mittels setMnemonic(char c);
Bei Menues gehen auch Shortcuts wie strg+g oder so ein Zeugs.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.06.2006, 08:09 Uhr
~Lumina
Gast


Zu 1) ich check das immer noch nicht so ganz. Wo sollt ich diese Methode dann aufrufen?
geht das nicht irgendwie mit cancelCellEditing() aus einem Editor heraus??!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.06.2006, 09:28 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Die Methode musst du einfach in deinen Quelltext schreiben. Damit überschreibst du eine Methode, die jedesmal, wenn du versucht in eine Spalte zu schreiben überprüft wird und es nur geht, wenn true zurück gegeben wird. Wenn du das so schreibst, gibt es in Spalte 3 false zurück und du kannst es nicht editieren.
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
01.06.2006, 12:37 Uhr
Lumina




Zitat von J-jayz-Z:
Die Methode musst du einfach in deinen Quelltext schreiben



So einfach ists ja wohl nicht, weil ich da schon eine bestimmte Stelle brauch.
Mein Haupdialog ist abgeleitet von JFrame, FrmPumpenhelferlein.java
Dann hab ich noch eine Klasse, die eine einzelne Pumpe repräsentiert: Pumpe.java
Und die dritte Datei, DlgSystem.java ist von JDialog abgeleitet, damit ich die Verschaltung der Pumpen grafisch definieren kann.

So, hab jetzt getestet, euer isCellEditable wie oben einfach in FrmPumpenhelferlein.java zu kopieren, weil ich da auch den Rest von meiner JTable initialisiere:

C++:
  // **********************************************************
  // Zweck: Einstellungen wie Tabellenmodell und Zeilenanzahl
  //         an der übergebenen Tabelle vornehmen, Überschriften
  //         für die Spalten definieren, Auswahlboxen für die
  //         Einheiten auf die entsprechenden Spalten setzen,...
  // **********************************************************
  private void initMyTableAndModel(JTable tbl, DefaultTableModel tm, int nrOfRows) {
  
    DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
    renderer.setToolTipText("Bitte die gewünschte Einheit auswählen.");
    DefaultTableColumnModel tcm = new DefaultTableColumnModel();
    
    tm = new DefaultTableModel(nrOfRows, 5);
    
    // Textfeld für Kommazahleneingabe anlegen:
    JTextField txtForFloats = new JTextField();
    txtForFloats.addKeyListener(new KeyListener() {
      public void keyPressed(KeyEvent k) {}
      public void keyReleased(KeyEvent k) {}
      public void keyTyped(KeyEvent k) {
        if ((k.getKeyChar() < '1' || k.getKeyChar() > '9') &&
            (k.getKeyChar() != '\b') && (k.getKeyChar() != '\n') &&
            (k.getKeyChar() != '\r') && (k.getKeyChar() != '\t') &&
            (k.getKeyChar() != ',') && (k.getKeyChar() != '.')) {
              k.consume();
            }
      }
    });
    
    // Das Kommazahlen-Textfeld als Editor verwenden:
    TableCellEditor editFloats = new DefaultCellEditor(txtForFloats);
    
    // Spalte A: (Pumpe)  <- will ich uneditierbar machen!!
    TableColumn tcApump = new TableColumn(0,30);
    tcApump.setHeaderValue("Px");
    tcApump.setResizable(false);
    tcm.addColumn(tcApump);
    
    // Spalte B: (Maximaldruck)
    TableColumn tcBpMax = new TableColumn(1,80);
    tcBpMax.setHeaderValue("pMax");
    tcBpMax.setCellEditor(editFloats);
    tcm.addColumn(tcBpMax);
    
    // Spalte C: (Einheit Maximaldruck)
    TableColumn tcCpMaxUnit = new TableColumn(2,60);
    tcCpMaxUnit.setHeaderValue("Einheit");
    JComboBox cboPressureUnits = new JComboBox(this.pressureUnits);
    TableCellEditor editPressureUnits = new DefaultCellEditor(cboPressureUnits);
    editPressureUnits.cancelCellEditing();
    tcCpMaxUnit.setCellEditor(editPressureUnits);
    tcCpMaxUnit.setCellRenderer(renderer);
    tcm.addColumn(tcCpMaxUnit);
    
    // Spalte D: (Max. Fördermenge)
    TableColumn tcDVMax = new TableColumn(3,80);
    tcDVMax.setHeaderValue("VMax");
    tcDVMax.setCellEditor(editFloats);
    tcm.addColumn(tcDVMax);
    
    // Spalte E: (Einheit Fördermenge)
    TableColumn tcEVMaxUnit = new TableColumn(4,60);
    tcEVMaxUnit.setHeaderValue("Einheit");
    JComboBox cboVolumeUnits = new JComboBox(this.volumeUnits);
    TableCellEditor editVolumeUnits = new DefaultCellEditor(cboVolumeUnits);
    editVolumeUnits.cancelCellEditing();
    tcEVMaxUnit.setCellEditor(editVolumeUnits);
    tcEVMaxUnit.setCellRenderer(renderer);
    tcm.addColumn(tcEVMaxUnit);
    
    // Tabellen-Modelle zuweisen:
      tbl.setModel(tm);
      tbl.setColumnModel(tcm);
      
    // Spaltenumsortierung unterbinden:
      tbl.getTableHeader().setReorderingAllowed(false);
    
    // Erste Spalten mit Pumpen-Namen füllen:
    this.fillFirstColumnWithPumpNames(tbl);
  }



so, das geht aber leider nicht und das mit dem Textfeld als Editor, wo ich nur Kommazahlen zulassen will, geht auch nicht...

Zu 4) Die Tabulatorreihenfolge kommt anscheinend echt darauf an, in welcher Reihenfolge man die einzelnen Elemente auf das JPanel / den Container legt. Hab alles so gelegt, dass die Reihenfolgen zusammenstimmen und damit ist auch diese Frage geklärt.
Zu 5) setMnemonic geht, die Frage ist geklärt!
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************

Dieser Post wurde am 01.06.2006 um 13:02 Uhr von Lumina editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
01.06.2006, 15:31 Uhr
KaraHead



Du bist schon auf dem richtigen Weg.

1)

C++:
tm = new DefaultTableModel(nrOfRows, 5){
  public boolean isCellEditable(int row,int col){
    return (col==3?false:true); //Sperrt die Eingabe in Spalte 3
};



Du musst isCellEditable nicht aufrufen, das macht die JTable selber, wenn du versuchst etwas in eine Zeile bzw. Spalte zu schreiben.

2)
So sollte es gehen

C++:
jTextField1.addKeyListener(new KeyAdapter() {
            public void keyTyped(KeyEvent e) {
                Character c = e.getKeyChar();      
                if (!Character.isDigit(c) && c != KeyEvent.VK_ENTER
                        && c != KeyEvent.VK_COMMA && c != KeyEvent.VK_PERIOD
                        && c != KeyEvent.VK_TAB) {
                        Toolkit.getDefaultToolkit().beep();
                        e.consume();
                }
            }
});

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
02.06.2006, 12:21 Uhr
Lumina



so, hab das zu 1 mal getestet und schlagartig etliche Fehler bekommen, bis ich gemerkt hab, dass nur eine geschweifte Klammer ziemlich am Schluss fehlte... jetzt gehts.


C++:
    tm = new DefaultTableModel(nrOfRows, 5) {
      public boolean isCellEditable(int row, int col) {
        return (col == 0 ? false : true); //Sperrt die Eingabe in Spalte 0
    }};



Ok, das wär geschafft.

Was aber immer noch nicht funzt ist das zu 2)

Bei einem ganz normalen Textfeld funzt auch mein Source von oben. Aber sobald ich das auf die JTable als Editor verwenden will, funzt des nimmer...


C++:
     txtForFloats.addKeyListener(new KeyAdapter() {
        public void keyTyped(KeyEvent e) {
          char c = e.getKeyChar();
          if (!Character.isDigit(c) && c != KeyEvent.VK_ENTER
                  && c != KeyEvent.VK_COMMA && c != KeyEvent.VK_PERIOD
                  && c != KeyEvent.VK_TAB) {
                  Toolkit.getDefaultToolkit().beep();
                  e.consume();
          }
        }
     });
    
    // Das Kommazahlen-Textfeld als Editor verwenden:
    TableCellEditor editFloats = new DefaultCellEditor(txtForFloats);
    
    // Spalte A: (Pumpe)
    TableColumn tcApump = new TableColumn(0,30);
    tcApump.setHeaderValue("Px");
    tcApump.setResizable(false);
    tcm.addColumn(tcApump);
    
    // Spalte B: (Maximaldruck)
    TableColumn tcBpMax = new TableColumn(1,80);
    tcBpMax.setHeaderValue("pMax");
    tcBpMax.setCellEditor(editFloats);
    tcm.addColumn(tcBpMax);
    
    // Spalte C: (Einheit Maximaldruck)
    TableColumn tcCpMaxUnit = new TableColumn(2,60);
    tcCpMaxUnit.setHeaderValue("Einheit");
    JComboBox cboPressureUnits = new JComboBox(this.pressureUnits);
    TableCellEditor editPressureUnits = new DefaultCellEditor(cboPressureUnits);
    editPressureUnits.cancelCellEditing();
    tcCpMaxUnit.setCellEditor(editPressureUnits);
    tcCpMaxUnit.setCellRenderer(renderer);
    tcm.addColumn(tcCpMaxUnit);



Und da ist noch was zu den Mnemonics: die sind wohl nur verwendbar, wenn der Focus gerade nicht auf einem unsichtbaren Element liegt?! Warum kann ich außerdem keine "(" oder ")" als Mnemonic verwenden??! Oder muss ich das Escapen? den Unterstrich zeigt es mir aber in der Oberfläche schon an, komischerweise.
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
02.06.2006, 15:38 Uhr
KaraHead



zu 2)
hab herrausgefunden, dass setCellEditor nicht klappt. Du musst setDefaultEditor(class,TableCellEditor) verwenden. Als erstes gibts du die Klasse an, für die der Editor gelten soll und das 2. Argument ist der TableCellEditor.

Du musst bedenken, dass ) über der 9 steht z.B. auf dem deutschen Layout.
Alt+Shift+9 gilt nicht als Mnemonic, somit ist die einzige Möglichkeit, die 9 als Mnemonic zu nehmen um indirekt das ) anzusteuern.

mfg KaraHead

Dieser Post wurde am 02.06.2006 um 15:41 Uhr von KaraHead editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ Java ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: