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

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ń

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

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

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!

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