Formatowanie tekstu w JTextField

Formatowanie tekstu w JTextField
0

Zadanie nie jest proste myślę. Piszęprogram, który rozwiązuje układy równań liniowych. Do wczytywania danych od uzytkownika uzywam JTextField. Pierwsze okno zawiera pytanie o liczbę równań (tzw. n) - moze to być jedynie liczba naturalna. Zablokowałem mozliwość wpisywania innych znaków - z tym sobie jakoś poradziłem, ale.... juz drugie okienko kaze nam wpisać kolejno współczynniki równania. I tu moje pytanie:
czy da się ustawić JTextField tak, aby np. mozna było wpisać dane jedynie w postaci "-1.4 4 6.7 3... "itd. To znaczy chodzi mi głwnie o to aby:

  1. Kazdy kolejny współczynnik odzielony musi być spacją.
  2. Dostępne znaki to: cyfry od 0 do 9, znak -(minus) i znak .(kropka)
  3. Spacja nie moze znalezc się na początku, bezpośrednio po kropce, bezpośrednio po minusie i bezpośrednio po spacji(czyli chce uniknąć wpisów typu " - 4. 56 .7 ".
  4. Kropka nie moze znalezc się na początku, bezpośrednio po minusie, dwa razy w jednym współczynniku, bezpośrednio przed spacją(czyli chce uniknąć sytuacji typu ".. 4.5.6 -.4 . "
  5. Minus jezeli ma się pojawić to moze jedynie bezpośrednio po spacji.

Program dopiero zaczynam pisać więc jezeli chodzi o algorytmy rozwiązywania i wiele innych rzeczy to jeszcze ich nie napisałem. Stanąłem w tym miejscu i nie wiem jak validować poprawność JTextField w czasie rzeczywistym w przypadku który opisałem. Podsyłam to co mam do tej pory. Będę bardzo wdzięczny za wszelką pomoc!

Pasek Opcji

Kopiuj
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class Pasek_Opcji  extends JPanel{

    JLabel opcje1=new JLabel("OPCJE DANYCH");
    JLabel opcje2=new JLabel("METODY OBLICZANIA");
    JLabel opcje3=new JLabel("INNE OPCJE");
	JButton recznie=new JButton("Wpisz współczynniki ręcznie");
	JButton wczytaj=new JButton("Wczytaj współczynniki z pliku");
	JButton zapisz=new JButton("Zapisz rozwiązanie do pliku");
	JButton gauss=new JButton("Metoda eliminacji Gauss'a");
	JButton crout=new JButton("Metoda Crout'a");
	JButton cholesky=new JButton("Metoda Cholesky'ego");
	JButton wyczysc=new JButton("Wyczyść dane");
	JButton wyjscie=new JButton("Wyjście");
	JButton empty=new JButton("");
	
	/*	potrzebne elementy interfejsu	*/
	
	public Pasek_Opcji() {
						
		this.setLayout(new GridLayout(4,3));  //dodanie zarządcy rozkładu do tego pola gdzie rysuje przyciski
					
		/*utworzenie przyciku i dodanie go do okienka	*/
		this.add(opcje1);
		this.add(opcje2);
		this.add(opcje3);
		this.add(recznie);
		this.add(gauss);
		this.add(wyczysc);
		this.add(wczytaj);
		this.add(crout);
		this.add(empty);
		this.add(zapisz);
		this.add(cholesky);
		this.add(wyjscie);
	}
}

Okno działań

Kopiuj
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import java.awt.Dimension;

import java.awt.*;
import javax.swing.*;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.DocumentFilter.FilterBypass;

public class Okno_Dzialan extends JPanel {
    
    public JTextField czytnik;
    private final JEditorPane komunikaty = new JEditorPane();
    private MyDocumentFilter documentFilter;
    
    public Okno_Dzialan() {
        super();
        setLayout(new BorderLayout());
        tekst("\nWITAJ W PROGRAMIE!\n");
        createPanels();
    }
    
        public void createPanels() {
        czytnik = new JTextField();
        ((AbstractDocument)czytnik.getDocument()).setDocumentFilter(
                new MyDocumentFilter2()); 
        komunikaty.setEditable(false);
        czytnik.setEditable(false);
        komunikaty.setBackground(Color.lightGray);
        czytnik.setBackground(Color.lightGray);
        this.add(komunikaty, BorderLayout.NORTH);
        this.add(czytnik, BorderLayout.CENTER);
    }
    
    public void tekst(String a) {
        komunikaty.setText(a);
    }
    
    public void odblokowanie(){
        czytnik.setEditable(true);
        czytnik.setBackground(Color.white);
    }
    
    public int wczytaj_n(){
        int b = Integer.parseInt(czytnik.getText());
        return b;
    }
    
    public void zamiana_pola(){
               ((AbstractDocument)czytnik.getDocument()).setDocumentFilter(
                new MyDocumentFilter()); 
    }
   
}

class MyDocumentFilter extends DocumentFilter
{   
    @Override
            public void replace(FilterBypass fb, int offset, int length,
                    String text, AttributeSet attrs)
                    throws BadLocationException {
                try {
                    if (text.equals(".")
                            && !fb.getDocument()
                                    .getText(0, fb.getDocument().getLength())
                                    .contains(".")) {
                        super.insertString(fb, offset, text, attrs);
                        return;
                    }

                    Double.parseDouble(text);
                    super.replace(fb, offset, length, text, attrs);
                } catch (Exception e) {
                    Toolkit.getDefaultToolkit().beep();
                }
                
            }
}

class MyDocumentFilter2 extends DocumentFilter
{   
    @Override
    public void insertString(DocumentFilter.FilterBypass fp
            , int offset, String string, AttributeSet aset)
                                throws BadLocationException
    {
        int len = string.length();
        boolean isValidInteger = true;

        for (int i = 0; i < len; i++)
        {
            if (!Character.isDigit(string.charAt(i)))
            {
                isValidInteger = false;
                break;
            }
        }
        if (isValidInteger)
            super.insertString(fp, offset, string, aset);
        else
            Toolkit.getDefaultToolkit().beep();
    }

    @Override
    public void replace(DocumentFilter.FilterBypass fp, int offset
                    , int length, String string, AttributeSet aset)
                                        throws BadLocationException
    {
        int len = string.length();
        boolean isValidInteger = true;

        for (int i = 0; i < len; i++)
        {
            if (!Character.isDigit(string.charAt(i)))
            {
                isValidInteger = false;
                break;
            }
        }
        if (isValidInteger)
            super.replace(fp, offset, length, string, aset);
        else
            Toolkit.getDefaultToolkit().beep();
    }
}

Program

Kopiuj
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Program extends JFrame implements ActionListener {
    BorderLayout rozklad = new BorderLayout(1,1); 
    JFileChooser wybor_pliku = new JFileChooser("C:\\"); 
    Pasek_Opcji pasek=new Pasek_Opcji();
    Okno_Dzialan okno = new Okno_Dzialan();
    boolean czy = false;
    int n;
    public Program(){
        this.setLayout(rozklad);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setSize(800, 480);
        this.setTitle("Rozwiązywanie Układów Równań Liniowych"); 
        this.add(okno, BorderLayout.CENTER);
        this.add(pasek, BorderLayout.SOUTH); 
        pasek.recznie.addActionListener(this);
        pasek.gauss.addActionListener(this);
        pasek.wyczysc.addActionListener(this);
        pasek.wczytaj.addActionListener(this);
        pasek.crout.addActionListener(this);
        pasek.zapisz.addActionListener(this);
        pasek.cholesky.addActionListener(this);
        pasek.wyjscie.addActionListener(this);
        this.setVisible(true); 
    }
    
    public void actionPerformed(ActionEvent e) {
        
        if (e.getSource() == pasek.recznie) {
            okno.odblokowanie();
            okno.tekst("\nPODAJ ILOŚĆ RÓWNAŃ (n):\n");
            okno.czytnik.addKeyListener
            (new KeyAdapter() {
                public void keyPressed(KeyEvent e) {
                    int key = e.getKeyCode();
                        try{
                            if (key == KeyEvent.VK_ENTER) {
                                Toolkit.getDefaultToolkit().beep();
                                n = okno.wczytaj_n();
                                okno.tekst("\nPODAJ WSPÓŁCZYNNIKI DLA "+n+" RÓWNAŃ\n(współczynniki oddziel kolejno spacją):\n");
                                okno.zamiana_pola();
                            }
                        }catch (NumberFormatException nfe) {}
                }
            });
        }
        
        else if (e.getSource() == pasek.wczytaj) {
        }
        else if (e.getSource() == pasek.zapisz) {
            }
        else if (e.getSource() == pasek.gauss) {
            if(czy==false) {
                okno.tekst("\nBRAK DANYCH! PODAJ WSPÓŁCZYNNIKI!\n");
              }
            }
        else if (e.getSource() == pasek.crout) {
            if(czy==false) {
                okno.tekst("\nBRAK DANYCH! PODAJ WSPÓŁCZYNNIKI!\n");
              }
        }
        else if (e.getSource() == pasek.cholesky) {
            if(czy==false) {
                okno.tekst("\nBRAK DANYCH! PODAJ WSPÓŁCZYNNIKI!\n");
              }
        }
        else if (e.getSource() == pasek.wyczysc) {
            okno.tekst("\nWITAJ W PROGRAMIE!\n");
            okno.createPanels();
            n=0;
        }
        else if (e.getSource() == pasek.wyjscie) {
        }   
    }
    
    public static void main(String[] args) {
         EventQueue.invokeLater(new Runnable() {
             public void run() {
                 new Program();
             }
         });
    }

}

P.S. Póki co dostępna jest tylko funkcja "Wpisz współczynniki ręcznie" bo właśnie do niej potrzebne mi to wszystko.

dodanie znaczników <code class="java"> - furious programming

edytowany 1x, ostatnio: flowCRANE
flowCRANE
Wstawiaj kod w odpowiednie dla danego języka znaczniki kolorujące składnię i usuwaj z kodu zbędne puste linie, bo one niepotrzebnie wydłużają cały post, przez co robi się bałagan;
ME
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 9 lat
1

Jesli chodzi o samo wpisywnie to wydaje mi sie, ze nie ma mozliwosci, ale mozesz na to spojrzec z innej strony. Wartości, ktore wpisze użytkownik (opcja z minusem i kropka to normalne oznaczenia w liczbach) to liczby. Po wczyaniu wartosci rozdzielasz String np za pomoca split(" ") i probujesz uzyc np. parseDouble(String s). Jesli wartosc nie bedzie liczba to zostanie zgloszony wyjatek NumberFormatException. Jesli wystapi taki wyjatek to dajesz uzytkownikowi stosowny komunikat i niech jeszcze raz wpisze wartosci.

0

Masz rację :) za bardzo chciałem kombinować. Dzięki za pomoc!

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)