Benutzereingaben durch Zeilenumbruch trennen und in Array individueller Größe speichern

Hallo!

Ich habe einen Code geschrieben, der Benutzereingaben in einem JTextField per Button abspeichert und übergibt.

Sagen wir mal, ich habe folgendes in das Textfeld eingegeben:

Ich
bin
ein Text

Zwischen jedem Wort ist ein Zeilenumbruch. Ich möchte nun, dass dieser Zeilenumbruch die Funktion hat, die Zeilen voneinander getrennt einzeln abzuspeichern, also in ein Array.

Also so mein ich das:

String [ ] arr= {"Ich", "bin", "ein Text"};


Wie würde der Code dafür aussehen?
Danke!
 
Ein JTextField enthält nur eine Zeile. Du meinst wahrscheinlich JTextArea.

Das funktioniert auf diese Weise:
Java:
String[] arr = meineTextArea.getText().split("\\n");
 
Ah danke! Ja, ich meinte JTextArea, dass hab ich auch so programmiert.

Jetzt habe ich eine JTable, in der ich die einzelnen Wörter untereinander eintragen will. Wie stelle ich das jetzt an? Mit einer Schleife?

Hier ein Codebeispiel:

Java:
package com.tutego.insel.ui.table;

import javax.swing.*;

public class SimpleTable
{
  public static void main( String[] args )
  {
    String[][] rowData = {                                                       //Hier soll nun das Array rein
    { "Japan", "245" }, { "USA", "240" }, { "Italien", "220" },
    { "Spanien", "217" }, {"Türkei", "215"} ,{ "England", "214" },
    { "Frankreich", "190" }, {"Griechenland", "185" },
    { "Deutschland", "180" }, {"Portugal", "170" }
    };

    String[] columnNames =  {
      "Land", "Durchschnittliche Fernsehdauer pro Tag in Minuten"
    };

    JFrame f = new JFrame();
    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

    JTable table = new JTable( rowData, columnNames );
    f.add( new JScrollPane( table ) );

    f.pack();
    f.setVisible( true );
  }
}

Wenn ich das Array arr in die rowData einsetzen will bekomme ich in der Tabelle nur

[Ljava.lang.String;@15db9742245

angezeigt...
 
Wie setzt du das Array denn ein? Und vor allem wie soll das Array eingesetzt werden? rowData ist ja ein 2D Array ... die Eingabe deiner Textarea aber nur ein 1D Array.
 
Hmm, ok verstehe.

{ "" + arr, "245" }
so spuckt der mir die Fehlermeldung oben aus.


Ich erklär mal grob was mein Vorhaben ist.
Stell dir vor, es geht um Fernseherkanäle.
Diese Kanäle werden per Eingabe in das Array gefüllt und sollen dann in der ersten Spalte der Tabelle untereinander aufgelistet werden. Dann möchte ich in der zweiten Spalte boolsche Ja/Nein Werte setzen, ob der folgende Kanal einen Teletext hat oder nicht. Diese Werte müssen auch erst über den Benutzer manuell gesetzt werden.
 
Diese Kanäle werden per Eingabe in das Array gefüllt und sollen dann in der ersten Spalte der Tabelle untereinander aufgelistet werden. Dann möchte ich in der zweiten Spalte boolsche Ja/Nein Werte setzen, ob der folgende Kanal einen Teletext hat oder nicht.
Wenn Du mit Arrays arbeiten willst (musst), dann musst Du schon ein 2D-Array aufbauen, z. B.
Java:
Object[][] channels = new Object[arr.length][];
for (int i = 0; i < arr.length; i++) {
    Object[] channel = new Object[2]; 
    channel[0] = arr[i]; 
    channel[1] = Boolean.FALSE;
    channels[i] = channel;
}
Die channels sind dann Deine Tabellendaten (rowData).
 
Wenn Du mit Arrays arbeiten willst (musst), dann musst Du schon ein 2D-Array aufbauen, z. B.
Java:
Object[][] channels = new Object[arr.length][];
for (int i = 0; i < arr.length; i++) {
    Object[] channel = new Object[2];
    channel[0] = arr[i];
    channel[1] = Boolean.FALSE;
    channels[i] = channel;
}
Die channels sind dann Deine Tabellendaten (rowData).

Danke dir, dass hilft mir schonmal weiter.

Wie würde dein Code aussehen, wenn ich das Array 3D haben will?
 
Wie würde dein Code aussehen, wenn ich das Array 3D haben will?
Mein Code würde für die Tabelle überhaupt kein Array verwenden (ok, ein statisches für die Spaltennamen vielleicht). Ich hätte eine Klasse für z. B. Kanal (oder Sender). Außerem ein TableModel, um Objekte dieser Klasse darzustellen und Änderungen an den Objekten zu übernehmen.
 
Hmmm..
ich weiß immernoch nicht so Recht, wie ich das verwirklichen soll.

Sagen wir mal ich gebe per Tastatur:
RTL
WDR
VOX
ein und diese Werte werden in die Tabelle (wie auch immer..) geschrieben.

Jetzt habe zusätzlich noch eine ganz andere Klasse in die ich gehe, wenn ich einem Sender ein True für Teletext setzen will. In dieser Klasse werden die Sender ebenfalls aufgelistet werden, undzwar in einer JComboBox. Hier will ich einen Sender auswählen und per Button ihm einen Telext geben. Dies soll nun auch in meiner Tabellen Klasse erscheinen.


Ich habe nach 3D gefragt, weil ich im nachhinein noch Spalten mit anderen Werten ergänzen möchte.
 
Hab mal ein Beispiel zusammengeschustert:

Java:
public class Channel {
    private String name = "";
    private boolean teletext;
    private int minutesViewed;

    public void setName(String name) { this.name = name; }
    public void setTeletext(boolean value) { this.teletext = value; }
    public void setMinutesViewed(int minutes) { this.minutesViewed = minutes; }

    public String getName() { return name; }
    public boolean getTeletext() { return teletext; }
    public int getMinutesViewed() { return minutesViewed; }
}

Java:
import javax.swing.table.AbstractTableModel;
import java.util.List;

public class ChannelTableModel extends AbstractTableModel {
    private List<Channel> channels;

    private static final String[] COLUMNS = {
        "Sender", "Teletext", "Fernsehdauer pro Tag in Minuten"
    };
    private static final Class[] COLUMN_CLASSES = {
        String.class, Boolean.class, Integer.class 
    };

    public ChannelTableModel(List<Channel> channels) {
        this.channels = channels;
    }

    public void add(Channel ch) {
        int ix = channels.size();
        channels.add(ch);
        fireTableRowsInserted(ix, ix);
    }

    @Override
    public int getRowCount() {
        return channels.size();
    }

    @Override
    public int getColumnCount() {
        return COLUMNS.length;
    }

    @Override
    public String getColumnName(int col) {
        return COLUMNS[col];
    }

    @Override
    public Class<?> getColumnClass(int col) {
        return COLUMN_CLASSES[col];
    }

    @Override
    public Object getValueAt(int row, int col) {
        Channel ch = channels.get(row);
        switch (col) {
            case 0: return ch.getName();
            case 1: return ch.getTeletext();
            case 2: return ch.getMinutesViewed();
            default: return "";
        }
    }
 
    @Override
    public boolean isCellEditable(int row, int col) {
        return true;
    }

    @Override
    public void setValueAt(Object value, int row, int col) {
        Channel ch = channels.get(row);
        switch (col) {
            case 0: ch.setName((String) value); break;
            case 1: ch.setTeletext((Boolean) value); break;
            case 2: ch.setMinutesViewed(((Number) value).intValue()); break;
            default: return;
        }
        fireTableCellUpdated(row, col);
    }   
}

Java:
import java.awt.BorderLayout;

import java.util.ArrayList;
import java.util.List;

import javax.swing.*;

public class Test {
    private ChannelTableModel model;

    public void run() {
        model = new ChannelTableModel(new ArrayList<>());
        JTable table = new JTable(model);

        JButton newChannel = new JButton("+");
        newChannel.addActionListener(event -> model.add(new Channel()));

        JPanel buttons = new JPanel();
        buttons.add(newChannel);

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(new JScrollPane(table));
        frame.add(buttons, BorderLayout.SOUTH);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
 
Hab vielen vielen Dank !! Du bist eine große Hilfe!

Nur noch eine letzte Sache!! Wie würde es aussehen, wenn die Sender von "außerhalb" herkämen? Also kein Button der eine neue Zeile erstellt, sondern die Tabelle bezieht eine Auflistung mit den Sendern von einer anderen Klasse und erstellt die Zeilen automatisch und ich muss dann nur noch Spalte 2&3 eintragen ?
 
Naja, das ChannelTableModel nimmt ja eine "Senderliste" entgegen. D. h. die Viewklasse (hier Test) kann im Konstruktor ebenfalls eine Senderliste entgegennehmen, um diese im ChannelTableModel zu verwenden. Zum Beispiel so:

Java:
import java.awt.BorderLayout;

import java.util.ArrayList;
import java.util.List;

import javax.swing.*;

public class Test {
    private ChannelTableModel model;

    public Test(List<Channel> channels) {
        model = new ChannelTableModel(channels);
    }

    public void run() {
        JTable table = new JTable(model);

        JButton newChannel = new JButton("+");
        newChannel.addActionListener(event -> model.add(new Channel()));

        JPanel buttons = new JPanel();
        buttons.add(newChannel);

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(new JScrollPane(table));
        frame.add(buttons, BorderLayout.SOUTH);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        List<Channel> channels = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            // ginge in einer Zeile, wenn Channel einen
            // entsprechenden Konstruktor hätte
            Channel channel = new Channel();
            channel.setName(String.format("Sender %d", i+1));
            channels.add(channel);
        }
        SwingUtilities.invokeLater(() -> new Test(channels).run());
    }
}
 
Meinst du mit Konstruktoren die getter/setter ? Die habe ich ergänzt.


Habe deinen Code unten umgeändert:


Java:
import java.awt.BorderLayout;

import java.util.ArrayList;
import java.util.List;

import javax.swing.*;

public class Test {
    private ChannelTableModel model;

    public Test(List<Channel> channels) {
        model = new ChannelTableModel(channels);
    }

    public void run() {
        JTable table = new JTable(model);

        JButton newChannel = new JButton("+");
        newChannel.addActionListener(event -> model.add(new Channel()));

        JPanel buttons = new JPanel();
        buttons.add(newChannel);

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(new JScrollPane(table));
        frame.add(buttons, BorderLayout.SOUTH);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        List<Channel> channels = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            // ginge in einer Zeile, wenn Channel einen
            // entsprechenden Konstruktor hätte
            Channel channel = new Channel();
            channel.setSenderliste(String[].format("Sender %d", i+1));                         // Hier in set.Senderliste
            channels.add(channel);
        }
        SwingUtilities.invokeLater(() -> new Test(channels).run());
    }
}
Jetzt meckert er die [] und "format" an mit
- Syntax error, insert ".classe to complete Expression
- The method format(String, int) is undefined for the type Class<String[]>


Es geht um eine String[] Senderliste. Die Sender werden quasi über eine andere Klasse eingegeben. Diese sollen anschließend automatisch in deiner Tabelle aufgelistet werden und ich kann dann halt noch auswählen ob Teletext vorhanden oder nicht etc.


EDIT: Habe bisschen rumprobiert und erhalte jetzt LJava.lang.String;@e75b68c in der Tabelle als erste Spalte angezeigt. Was bedeutet das?
 
Zuletzt bearbeitet:
Habe deinen Code unten umgeändert:
Warum?

LJava.lang.String;@e75b68c in der Tabelle als erste Spalte angezeigt. Was bedeutet das?
Das ist die Standardausgabe von Object#toString, in dem Fall von einem String-Array.

Meinst du mit Konstruktoren die getter/setter ?
Nein, ein Konstruktor ist eine "Funktion", die dazu dient, ein neu zu erstellendes Objekt zu initialisieren. Die Channel-Klasse hat keinen Konstruktor angegeben, daher existiert nur der Standardkonstruktor. Man könnte z. B. in Channel.java noch schreiben:
Java:
    // Standardkonstruktor (ohne Parameter)
    public Channel() { }

    // Konstruktor, der den Namen entgegennimmt
    public Channel(String name) { this.name = name; }
Dann kann die for-Schleife so umgeschrieben werden:
Java:
        for (int i = 0; i < 100; i++) {
            channels.add(new Channel(String.format("Sender %d", i+1)));
        }
 
Danke, das hat geklappt.

Nur leider gibt er die Sender nebeneinander aus. Wie änder ich das?
In der Klasse werden die Sender in einer JTextArea jeweils mit einem Zeilenumbruch erstellt und abgespeichert.
 
Du musst für jeden Sender ein Channel-Objekt erstellen, so wie in der Schleife oben. Die Tabelle zeigt Channel-Objekte an. Ein Channel-Objekt besteht aus Namen, Videotext j/n und Minutenangabe.
 
Könntest Du dass bitte in Java Code übersetzen ? Deutsch ist manchmal eine schwierige Sprache :oops::D

Muss ich noch eine zweite Schleife schreiben oder wie bekomm ich die Sender einzeln aufgelistet?
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben