[Java] TextArea - wyrównanie

0

Witam!

Tworzę obecnie program do zarządzania listą gier dla wypożyczali gier.

GUI wygląda tak:
title

i mam jeden problem - chciałbym wyrównać w 5 kolumnach te wszystkie 5 pól klasy, które są wyświetlone w TextArea. Są one zawarte w ArrayList.
Kombinuję już drugi dzień i jestem w totalnej kropce.

Tak na marginesie, czy TextArea jest odpowiednim sposobem wyświetlania takiej małej bazy danych zawartej w ArrayList?

Z góry dziękuję za pomoc! Pozdrawiam.

0

nie lepiej te dane wyświetlić Ci w Table View? Table View

0

To jest jak widzę wchodzenie w świat JavaFX, o którym nie mam pojęcia. Jestem osobą początkującą. Na obecny projekt poświeciłem kilka dni, i raczej nie da się już go ot tak płynnie przerobić z TextArea na Table View.

0

Jak strasznie się chcesz upierać przy formatowaniu JTextArea to możesz użyć metody format z klasy String ale efekt jest mizerny....

 package textarea;

import javax.swing.*;

/**
 * Created by Rafał on 09.02.2017.
 */
public class Main extends JFrame {
    private JPanel panel = new JPanel();
    private static JTextArea area = new JTextArea();

    private static String[] date1 = {"Ala", "Ola", "Bartek", "Kuba"};
    private static String[] date2 = {"Wiola", "Krysia", "Zbyszek", "Kuba"};

    public static void main(String[] args) {
        Main okno = new Main();
        okno.setVisible(true);
        okno.setSize(700,700);
        okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        okno.initGUI();

        for (int i = 0; i < date1.length; i++) {
            String format = "%-" + ((i * 10) + 10) + "s";

            area.append(String.format(format, date1[i]));
        }

        area.append("\n");

        for (int i = 0; i < date2.length; i++) {
            String format = "%-" + ((i * 10) + 10) + "s";
            area.append(String.format(format, date2[i]));

        }

    }

    public void initGUI() {
        panel.setLayout(null);

        area.setBounds(0,0,500,200);
        panel.add(area);

        setLayout(null);

        panel.setBounds(0,0,500,300);
        add(panel);
    }
}

teoretycznie odległości są równe (mówię o ilości znaków od początku), tyle że spacje są węższe od innych znaków i efekt jest końcowy taki że wygląda to tak jakby nie było to sformatowane.

0

Jeśli ma zostać Swing, to polecam JTable. Jeśli musi zostać JTextArea, to zastosuj sposób @rafal20-1988 + czcionka o stałej szerokości:

area.setFont(new Font("monospaced",...));
0

Dzięki za porady. Choć od rana kombinuję jak JTable dodać do obecnego GUI. Rozumiem jej działanie, ale nie mam pojęcia jak ją dodać do obecnego GUI.

Stworzyłem osobną klasę (widoczna poniżej), tylko jak ją teraz połączyć z tą klasą gdzie mam całe GUI?

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

import javax.swing.table.AbstractTableModel;

public class Tabela extends AbstractTableModel 
{

	
	
	
    private final static Object[] nazwyKolumn = {"ID", "Tytuł", "Status", "Rok produkcji", "Platforma","Gatunek"};
     
    private final static int HIDDEN_IDX = 0;
    private final static int TYTUL_IDX = 1;
    private final static int STATUS_IDX = 2;
    private final static int ROK_IDX = 3;
    private final static int PLATFORMA_IDX = 4;
    private final static int GATUNEK_IDX = 5;
 
 
    public Tabela() {}
     
    @Override
    public int getRowCount() {
        if(lista==null) return 0;
        return lista.size();
    }
 
    @Override
    public int getColumnCount() {
        return nazwyKolumn.length;
    }
     
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
 
        if(lista== null) return null;
        Gra p = (Gra) lista.get(rowIndex);
        
        switch (columnIndex) {
            //case HIDDEN_IDX:
              //  return p.getId();
            case TYTUL_IDX:
                return p.getNazwa();
            case STATUS_IDX:
                return p.getStatus();
            case ROK_IDX:
                return p.getRok();
            case PLATFORMA_IDX:
                return p.getPlatforma();
            case GATUNEK_IDX:
                return p.getGatunek();
                
            default:
                return p;
        }
    }
0

W skrócie:

Tabela table = new Tabela();
//zamiast
add(poleTekstowe);
//daj
add(new JScrollPane(table));
0

Tylko wygląda to tak, że dla mojej klasy Tabela nie idzie wywołać konstruktora JScrollPane'a, tak jak to wcześniej robiłem dla TextArea.

"The constructor JScrollPane(Tabela) is undefined"

A nie ma to być tak?:

			JTable tabelka = new JTable(new Tabela());
			JScrollPane pane = new JScrollPane(tabelka);
			add(pane);
0

A czym się Twój kod różni od mojego?
Czytałem Twój poprzedni post po łebkach, zrób tak:

...
public class MyModel extends AbstractTableModel 
...
JTable tabelka = new JTable(model);
add(new JScrollPane(tabelka));

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