Witam, próbuję napisać TextField'a z kilkoma funkcjami, wcześniej pisałem w C# i zrobienie identycznego kodu zajęło mi kilka chwil...
Początki w javie nie są jednak tak łatwe i przyjemne. Przede wszystkim mój TextField ma posiadać wartości określające min i max długości pola. W przypadku gdy podjęto próbę edycji pola, a nie zostało osiągnięta min wartość obramowanie zmienia się, i to działa, ale nie do końca. W przypadku gdy mamy jeden znak i usuniemy go to zdarzenie zostanie wywołane, ale wartość pola nie została jeszcze zaktualizowana, przez co metoda widzi długość pola 1, i nie zmienia obramowania na początkową... Jakim zdarzeniem mam przechwycić zmianę wartości pola? Przypuszczam, że przepisanie tam tego kodu, da zamierzony efekt.
Dalej co do max długości pola, obramowanie zmienia się, ale nie wiem w jaki sposób zablokować długość tak, żeby nie było możliwości wpisania dalszego tekstu lub wklejenia go. Kolejną rzeczą jakie TextField ma spełniać to walidacja, w przypadku zakończenia pracy na polu lub potwierdzenia enterem. Co do potwierdzenia to wystarczy TextFieldLimitsActionPerformed, ale co z zakończeniem pracy czyli użyciem Tab lub po prostu wybranie kursorem innego pola. Następnie TextField docelowo ma pozwalać na wprowadzanie określonych typów danych, czyli tylko cyfry, kwota, tekst bez spacji itp. Przypuszczam, że do tego wystarczy wykorzystać TextFieldLimitsKeyPressed, ale czy Java udostępnia sprawdzenie znaku np. isDigit? Jak przeciążyć metodę Print o ile tak ona się nazywa, aby była możliwość dodania ikony przed lub za TextField? Ostatnią, rzeczą jest podpięcie menu z opcjami kopiuj, wklej, wytnij. Chciałbym aby odpowiednie opcje dostępne były tylko jeżeli dana operacja jest możliwa, czyli jeżeli TextField jest pusty to nie można kopiować czy wyciąć. Tylko które zdarzenie obsługuję przygotowanie menu przed wyświetleniem? Co do kopiuj to z kąd w Javie pobrać to co jest w pamięci? Bo wiadomo w pamięci może być jednocześnie grafika i tekst, a nam zależy na wklejeniu tekstu.
public class TextFieldLimits extends JTextField
{
private int iMinLenght = - 1;
private int iMaxLenght = - 1;
private Border oBorder = getBorder();
private String szInitialToolTip = null;
protected enum ConfigParamStatus
{
MIN_LENGHT, MAX_LENGHT
};
public TextFieldLimits()
{
super();
this.addKeyListener(new KeyAdapter()
{
@Override
public void keyPressed(java.awt.event.KeyEvent evt)
{
TextFieldLimitsKeyPressed(evt);
}
});
this.addActionListener(new java.awt.event.ActionListener()
{
@Override
public void actionPerformed(java.awt.event.ActionEvent evt)
{
TextFieldLimitsActionPerformed(evt);
}
});
}
public TextFieldLimits(ConfigParamStatus status, int values)
{
this();
if (values > 0)
{
switch (status)
{
case MIN_LENGHT:
this.iMinLenght = values;
break;
case MAX_LENGHT:
this.iMaxLenght = values;
break;
}
}
}
public TextFieldLimits(int iMinLenght, int iMaxLenght)
{
this();
if (iMinLenght > 0)
{
this.iMinLenght = iMinLenght;
}
if (iMaxLenght > 0 && iMaxLenght >= iMinLenght)
{
this.iMaxLenght = iMaxLenght;
}
}
private void TextFieldLimitsKeyPressed(KeyEvent evt)
{
setBorder(oBorder);
setToolTipText(szInitialToolTip);
if (this.iMinLenght > 0)
if (iMinLenght > getText().length())
{
setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.RED));
szInitialToolTip = getToolTipText();
setToolTipText("The maximum field length");
}
if (iMaxLenght <= getText().length())
{
setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.ORANGE));
szInitialToolTip = getToolTipText();
setToolTipText("The minimum field length is not reached");
}
}
private void TextFieldLimitsActionPerformed(ActionEvent evt)
{
boolean validing = validing();
}
public boolean setMaxLenght(int iMaxLenght)
{
boolean set = false;
if (iMaxLenght > 0 && iMaxLenght >= this.iMinLenght)
{
this.iMaxLenght = iMaxLenght;
set = true;
}
return set;
}
public boolean setMinLenght(int iMinLenght)
{
boolean set = false;
if (iMinLenght > 0 && (iMinLenght <= this.iMaxLenght) || !(this.iMaxLenght > 0))
{
this.iMinLenght = iMinLenght;
set = true;
}
return set;
}
public int getMaxLenght()
{
return this.iMaxLenght;
}
public int getMinLenght()
{
return this.iMinLenght;
}
public boolean validing()
{
boolean bVal = false;
//if()
return bVal;
}
}