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:
- Kazdy kolejny współczynnik odzielony musi być spacją.
- Dostępne znaki to: cyfry od 0 do 9, znak -(minus) i znak .(kropka)
- 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 ".
- 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 . "
- 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