Eigener "Datentyp" für bestimmten Wertebereich?

con-f-use

Erfahrenes Mitglied
Hallo zusammen,

und wieder eine Anfänger-Frage von mir. Wie erstelle ich denn eine eigene "Datentyp"-Klasse die so ähnlich ist wie der allseits bekannte Integer, aber nur Werte zwischen 1 und 10 annehmen kann?

Hintergrund ist, dass ich ein Table-Model für eine JTable habe und in einer Spalte soll man eben nur solche Werte eingeben können.
Java:
NormTable = new JTable();
NormTable.setModel(
    new javax.swing.table.DefaultTableModel(
        new Object[][] {
            {null, null, null, null},{null, null, null, null},{null, null, null, null}
        },
            new String [] {
                "Number", "Difficulty", "Description", "Result"
            }
        ) {
            Class[] types = new Class[] {
                java.lang.Integer.class,
                java.lang.Integer.class, // <-- Hier sollte eben statt Integer besagte Klasse stehen
                java.lang.String.class,
                java.lang.String.class
            };
            boolean[] canEdit = new boolean[] {
                true, true, true, false 
            };
            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        }
    );
 
Zuletzt bearbeitet:
Hallo!

Wenn du mit Java 5 arbeitest koenntest du mit enums arbeiten:
Code:
    enum ConstrainedType {
        ONE(1), TWO(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7), EIGTH(8), NINE(
                9), TEN(10);

        final int number;

        private ConstrainedType(int number) {
            this.number = number;
        }
    }

Gruss Tom
 
con-f-use hat gesagt.:
Hallo zusammen,

und wieder eine Anfänger-Frage von mir. Wie erstelle ich denn eine eigene "Datentyp"-Klasse die so ähnlich ist wie der allseits bekannte Integer, aber nur Werte zwischen 1 und 10 annehmen kann?

Hintergrund ist, dass ich ein Table-Model für eine JTable habe und in einer Spalte soll man eben nur solche Werte eingeben können.

Mehrere Möglichkeiten:
1. Eigenen TableCellEditor (...extends DefultTableCellEditor) zuweisen und benutzen, diesem ein Document hinterlegen, welches nur Zahlen von 1-10 erlaubt.
2. Eigenen TableCellEditor zuweisen und benutzen, diesem einen InputVerifier hinterlegen, welcher nur Zahlen von 1-10 erlaubt.
3. Als CellEditor kein TextField benutzen, sondern eine JComboBox, die nur Werte von 1-10 enthält.
4. Als CellEditor kein TextField benutzen, sondern einen JSpinner, der nur Werte von 1-10 erlaubt.
 
Danke, mittlerweile bin ich auch auf die Idee mit dem eigenen TableCellEditor gekommen und beiß mir in den Hintern, dass mir das nicht früher eingefallen ist.
 
Doch noch nicht erledigt.

Habe noch eine dumme Frage zum jFormatetTextField:
Wie lasse ich denn da nur werte von 1 (einschließlich) bis 10 (einschließlich) zu? Mit folgenden, gehen ja nur die Werte von 1-9:
Java:
JFormattedTextField FormTF = new JFormattedTextField( createFormatter("#") );
 
Hallo!

Das ging beispielsweise mit nem InputVerifier oder mit dem überschreiben von setText(...). Aber wie Snape schon sagte nimm dafür besser eine JCombobox oder einen JSpinner.

Gruß Tom
 
Hallo Confuse,

schau mal hier:

Java:
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JTextField;

public class NumberFieldExample extends JFrame {

	private JLimitedNumberField nf = new JLimitedNumberField();

	public NumberFieldExample() {
		super("NumberFieldExample");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLocationByPlatform(true);
		this.add(nf);
		this.pack();
		this.setVisible(true);
	}

	public static void main(String[] args) {
		new NumberFieldExample();
	}

	class JLimitedNumberField extends JTextField {
		private String content = "";

		public JLimitedNumberField() {
			this.addKeyListener(new KeyAdapter() {
				public void keyTyped(KeyEvent e) {
					content = JLimitedNumberField.this.getText();
					// Nur Ziffern
					if (!Character.isDigit(e.getKeyChar()))
						e.consume();
					// Anzahl Ziffern höchstens 2
					if (content.length() > 1)
						e.consume();
					// Wenn erste Ziffer nicht 1 erlaube keine weitere Ziffer
					if ((content.length() > 0) && (!content.startsWith("1")))
						e.consume();
					// Wenn erste Ziffer 1 erlaube nur 0
					if (content.equals("1") && e.getKeyChar() != '0')
						e.consume();
				}
			});
		}
	}
}


Vg Erdal
 
Hallo,

Beispiel 2, mit JFormattedTextField:

Java:
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.text.ParseException;

import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.MaskFormatter;

public class NumberFieldExample2 extends JFrame {

	private JLimitedNumberField2 nf2 = new JLimitedNumberField2();

	public NumberFieldExample2() {
		super("NumberFieldExample2");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLocationByPlatform(true);
		this.add(nf2);
		this.pack();
		this.setVisible(true);
	}

	public static void main(String[] args) {
		new NumberFieldExample2();
	}

	class JLimitedNumberField2 extends JFormattedTextField {
		private String content = "";

		public JLimitedNumberField2() {
			MaskFormatter mf = null;
			try {
				mf = new MaskFormatter("##");
			} catch (ParseException e) {
				e.printStackTrace();
			}
			DefaultFormatterFactory dff = new DefaultFormatterFactory(mf);
			this.setFormatterFactory(dff);
			this.addKeyListener(new KeyAdapter() {
				public void keyTyped(KeyEvent e) {
					content = JLimitedNumberField2.this.getText();
					// Wenn erste Ziffer nicht 1 erlaube keine weitere Ziffer
					if ((content.length() > 0) && (!content.startsWith("1")))
						e.consume();
					// Wenn erste Ziffer 1 erlaube nur 0
					if (content.equals("1") && e.getKeyChar() != '0')
						e.consume();
				}
			});
		}
	}
}


Vg Erdal
 
Wunderbar, ihr seid supter Leute!

Irgentwie ist Swing nicht so wirklich Anfängerfreundlich und Java nicht so wirklich intuitiv. Ich hab bisher eher Web-Programmierung (php, javascript) gemacht und kann VB. Ich fand sogar C++ Anfängerfreundlicher als Java, aber das ist Wahrscheinlich einfach persönlicher Geschmack.
 
Hallo Confuse,

wenn du beispielsweise eine neue Swingkomponente kennenlernen möchtest, würde ich erst mal die vielen Beispiele in den deutschen und englischen Onlinebüchern und Tutorials anschauen. Du solltest immer folgenden Gedanken im Hinterkopf haben, ich bin nicht der erste der dieses oder jenes Programmieren möchte. Wenn du geignete englische und deutsche Stichwörter findest, liefert dir google meistens schon die Lösung. Anhand der API zu erraten, wie die Einsatz einer Komponente gedacht ist, ist nicht immer einfach. Aber das Internet ist bezüglich Java ein reinstes Schlaraffenland, mit tausenden Beispielen, Tutorials, Dokus.

Fazit: Wenn der Anfänger (der ein wenig Überblick über das Java-Webangebot hat), weiß wie er vorzugehen hat, wie und wo er zu suchen hat, ist Java sehr Anfängerfreundlich!


Vg Erdal
 
Zurück