23. februar 2004 - 11:00Der er
19 kommentarer og 2 løsninger
Readonly JTextField
Hej
Jeg skal bruge et readonly JTextField, hvor det er muligt at markere tekst i og lave en ctrl-c (copy), men hvor det ikke er muligt at paste noget ind i med ctrl-v.
Jeg har leget lidt med ideen om at overskrive insertString(int offset, String str, AttributeSet a), til en tom metode. Så kan jeg ganske rigtigt ikke paste ind i document modellen, men jeg kan heller ikke bruge setText(String text)
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Ved setEditable kan der ikke markeres tekst i feltet.
Mit Tekstfelt skal se ud som et almindeligt JTextField, som har setEditable(true), og man skal kunne foretage almindelige text actions i feltet, de skal ikke disables, dvs at man skal kunne trykke ctrl ned og markere tekst med piltasterne, og man skal kunne trykke ctrl-c for at copiere teksten.
Det eneste man ikke må er at skrive i feltet og at paste ind i feltet.
Jeg kan nu altså godt markere tekst og bruge ctrl-c, når setEditable(false) er kørt! Cursoren ændre sig bare ikke, som den normalt vil gøre over et JTextField!
Hvis du gør følgende kan du ikke skrive i textfeltet, men du kan godt kopiere fra det. Jeg har ændret cursoren, så den ligner den der normalt er over et textfelt, og sat baggrunden til hvid.
JTextField textField = new JTextField(); textField.setText("TEST"); textField.setEditable(false); textField.setCursor(new Cursor(Cursor.TEXT_CURSOR)); textField.setBackground(Color.white);
Til Carsten Den løsning havde jeg også tænkt på, men jeg vil helst undgå at løse det med low lvl events.
Til MikkelBM Din ide virker rigtigt nok, det at man sætter cursoren gør åbentbart at man kan markere tekst i feltet, problemet er bare at jeg ikke får nogen cursor.
Til Begge Jeg havde nu mere forestillet mig noget i retning af at implementere et document filter (javax.swing.text.DocumentFilter), som nu understøttes i 1.4. Det sættes med setDocumentFilter() som findes på AbstractDocument. Det ville give en ren indkapsling, hvor de andre løsninger på en eller anden måde virker lidt som et hack :)
Den første der kommer med et forslag der virker får alle point (Det skal lige siges at jeg selv også arbejder på sagen, og at det er noget der haster) :)
Hmmm. Mht DocumentFilter må jeg nok melde pas - det har jeg ikke rigtig arbejdet med. Men hvad mener du med: "problemet er bare at jeg ikke får nogen cursor."
Det virker perfekt ved mig. Lige så snart jeg bevæger musen over JTextField skifter cursoren til text-cursor.
Om det er den pæneste måde at løse det på, ved jeg ikke. Men jeg vil mene, at når det nu ikke er større, at det sagtens kan forsvares.
Jeg kan faktisk ikke rigtig se hvordan det skal kunne lade sig gøre med DocumentFilter, jeg mener ikke at DocumentFilter tager hensyn til om input sker via tastaturet oder was
Jeg hælder stadig mere til min egen løsning (lidt endnu).
Det virker lidt underligt når jeg sætter getCaret().setVisible(true)
For det første hvis jeg har 3 instancer af mit tekst felt kommer der en cursor i alle 3 tekstfelter, når jeg stater applikationen op.
Første gang jeg vælger et readonly felt og derefter flytter focus, kommer der aldrig en cursor igen, og dette er selvom at readonly feltet modtager focus.
> Mikkelbm: Jeg kan ikke se at din måde at gøre det på skulle være mindre pæn eller omstændigt, det vil være langt mere omstændigt at implementere DocumentFilter(). Tværtimod synes jeg det er nem og hurtig måde at komme videre på, min måde kræver lidt modifikation i f.h.t til min tidligere kommentar
Her et eksempel hvor både min og mikkelbm's måde anvendes. For mig at de lige besværlige/nemme
Jeg endte op med at disable de TextActions jeg ikke skulle bruge, så som pasteAction, med
Action a = (Action)getActionMap().get(DefaultEditorKit.pasteAction); a.setEnabled(false);
Jeg ville helst undgå en løsning med low level events, så som KeyEvent og FocusEvent.
Jeg er glad for at i kom med så meget feedback, og jeg vil gerne dele pointene ud mellem jer, selvom jeg selv kom med løsningen. Problemet er bare at jeg ikke ved hvordan jeg deler point (Jeg er ret ny herinde)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.