Jak pokazać że w nieedytowalnym polu tekstowym jest dalej ciąg znaków

0

Hej, na formatce mam nieedytowalne pole tekstowe, które zawiera pewien ciąg znaków, przekraczający rozmiar tego pola tekstowego. Jednakże użytkownik patrzący na ten ciąg nie wie, czy to jest cały ciąg czy coś może jeszcze potem jest. Jak najprościej mu pokazać, że dalej coś jest i powinien przewinąć pole tekstowe??

0

dodać scrollbar

0

Tak, tyle że taki scrollbar musiałby być na stałe pod polem tekstowym żeby uniknąć "skakania" pola podczas pojawiania się scrollbara. Ja natomiast nie chcę żeby był na stałe bo mam wiele takich pól na formatce i w 90% tekst się w nich zmieści.

0

Załóżmy, że pole jest klasy JTextField. Tworzysz klasę rozszerzającą JPanel w taki sposób, że wartość jest przechowywana w ramach nowej klasy i ma ona w sobie JTF i JTextArea dodatkowo do tych pól przekazujesz wartości jako "Bardzo długi te...", czyli

fullText.substring(0, maxLength-3)+"...";

Oryginał trzymasz w swojej klasie.
Do tego dodajesz domyślny clicklistener, który działa w następujący sposób:
po kliknięciu podmieniasz JTF na JTA zawierające pełen nie skrócony tekst.

0

@koziolek jak juz odpowiadasz to rob porzadnie. W Unicode znak U+2026 to 'Horizontal Ellipsis' i zajmuje 1 znak a nie 3 jak u Ciebie. Jaka roznica? Po pierwsze, uzywasz znakow zgodnie z ich przeznaczeniem, po drugie oryginalny tekst moze zostac pokazany o 2 znaki wiecej (choc to zalezy od czcionki akurat) - w koncu wytniesz 1 znak a nie 3. Poza tym, Twoj kod jest bez sensu poniewaz jesli string ma akurat maxLength, to ty utniesz ostatnie 3 znaki i za to dodasz 3 kropki, co jest kompletnie niepotrzebne. Nie wspomne, za calkowicie 'zapomniales' o tym ze w XXI wieku mamy internet i globalizacje i litery moga byc wielobajtowe bo rozni ludzie moga odwiedzac stronke / aplikacje / whatever...

Juz lepszy taki kod (nie twierdze ze bezbledny, ale to dobry poczatek i nawet sprawdzony za pomoca 3 tekstow):

if (text.codePointCount(0, text.length()) > maxLength) {
int end = text.offsetByCodePoints(0, maxLength);
text = text.substring(0, end - 1) + '\u2026';
}

Przetestuj na takich stringach:

  1. text = '\uD801\uDC0023456789\uD801\uDC00' - 10 znakow, pierwszy i dziesiaty znak to dwubajtowa reprezentacja
0

Coyote tez nie radzi sobie z wielobajtowymi znakami - ucial mi posta... Ponizej kontynuacja (zamiast tego znaku bede wpisywal X)

Przetestuj na takich stringach:

  1. text = '\uD801\uDC0023456789\uD801\uDC00' - 10 znakow, pierwszy i dziesiaty znak to dwubajtowa reprezentacja X - powyzszy kod nie zmieni tekstu w ogole (wypisze 'X23456789X')
  2. text = '\uD801\uDC0023456789\uD801\uDC00ab' - 11 znakow, pierwszy i dziewiaty to znowu 2 bajty - powyzszy kod utnie znak 10 i 11 i wstawi ellipsis, ale te wielobajtowe zostawi w spokoju (wypisze 'X2345678X…')
  3. text = '123456\uD801\uDC00890' - wypisze '123456X890'

A teraz przetestuj Twoj kod...:

  1. X23456...
  2. X23456...
    Zauwaz ze nawet nie umie doliczyc poprawnie do 7... bo nie zna nic poza jednobajtowymi znakami i myli sie na pierwszych 2 bajtach. Nie umie pokazac maxLength znakow (pokazuje w sumie 9 znakow, z czego 3 to kropki). Nie wspomne juz ze robi substringi nawet 'w srodku' wielobajtowego znaku, co ladnie pokazuje ten test:
  3. 123456?... - ten znak zapytania w aplikacji zostanie pokazany jako gustowny prostakacik znany kazdemu kto np. wczytal plik w utf8 za pomoca latin1 czy podobne

Wstyd.

0

Mućko, mućko... ty jak zawsze swoje... może zamiast próbować mnie obrażać podałbyś rozwiązanie problemu. Zaproponował coś konkretnego, a nie tylko "twoje jest złe, bo jak trafi się bramin i będzie chciał pisać w sanskrycie to będzie źle"

2

Może tak sprawdzać czy tekst się się zmieścił:

int width = tf.getSize().width;
Font f = tf.getFont();
int stringWidth = tf.getFontMetrics(f).stringWidth(tekstKtoryMozeBycDlugi);
tf.setText(tekstKtoryMozeBycDlugi);
if(width<stringWidth)
{
    //sygnalizacja, że nie wszystko zostało wyświetlone
}
0

Możesz zmienić kolor tekstu, albo kolor tła kontrolki, jeżeli tekst jest dłuższy niż ileś tam znaków, albo jak ma większą długość (vide @up). Dodatkowo warto użyć metody setToolTip i tam wpisać cały tekst, wtedy użytkownik będzie go widział bez klikania i przewijania.

0

@koziolek - no przeciez podalem lepszy sposob na obliczanie znakow...

0

@bogdans - tak, zrozumialem, masz racje. Co nie zmienia faktu ze kod Koziolka jest calkowicie zepsuty - nawet nie umie odcinac znakow porzadnie. Skupilem sie na liczeniu / odcinaniu znakow a nie jak poprawnie rozwiazac problem, a Twoj pomysl jest lepszy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1