Tabellen Header & Abstand der Zeilen

Dagobert

Bekanntes Mitglied
Guten Morgen,
Ich stehe seit gestern abend mal weider vor ein Problem mit Tabellen. Ich habe den Hintergrund meiner Tabelle durchsichtig gemacht, damit man das Hintergrundbild davon sieht. Jetzt habe ich das Problem das meine Header nicht mehr angezeigt werden.
Warum das?
Und dann suche ich noch nach einem einfachen Weg, Platz zwischen den einzelnen Zeilen zu schaffen, so das sie passend auf dem Papier liege (Mein Hintergrund XD).
Hier ist mal mein Code für die Tabelle. Das Model braucht ihr nicht umbedingt oder?!
Java:
tableHighscore = new JTable(manager){
			public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
				Component c = super.prepareRenderer( renderer, row, column);            // We want renderer component to be transparent          
				if( c instanceof JComponent )             								// so background image is visible
					((JComponent)c).setOpaque(false);              
				return c;           
			}
		};
		tableHighscore.setBounds(50, 100, 350, 500);
		tableHighscore.setOpaque(false);
		tableHighscore.setBorder(null);
		tableHighscore.setShowGrid(false);
		// TODO Keine Selectierung zulassen
		// TODO Abstand zwischen den Tabellen Zeilen
		tableHighscore.setShowVerticalLines(true);
		tableHighscore.setFont(lcdfont);

mfg. Dagobert
 

eRaaaa

Top Contributor
Also zu deinem ersten Problem, denke ich müsstest du etwas mehr Code zeigen, z.B. wie du die Tabelle einem Container hinzufügst?! Legst du diese in einen Scrollpane? Wenn nicht, musst du den Tableheader seperat hinzufügen
[c]?.add(tableHighscore.getTableHeader())[/c]
So ganz uninteressant ist das Model vllt. auch nicht.

Zu deinem zweiten Problem könnte [c]setIntercellSpacing[/c] und [c]setRowHeight[/c] helfen.
Beispiel
Java:
		tableHighscore.setIntercellSpacing(new Dimension(1, 10));
		tableHighscore.setRowHeight(tableHighscore.getRowHeight() + 10);
 

Dagobert

Bekanntes Mitglied
Okay dann ist hier mal mein Model. Das mit dem Abstand Probier ich gleich mal aus:
Java:
package controller;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Collections;
import java.util.LinkedList;

import javax.swing.table.AbstractTableModel;

import model.Score;
import model.ScoreComparator;
import model.Siegbedingungen;

public class HighscoreManager extends AbstractTableModel{
    
    private LinkedList<Score> scores;

    private String[] columnNames = {"Platz", "Name", "Punkte", "Runden", "Punkte/Runde", "Modi"};
    
    private static final String HIGHSCORE_FILE = "scores.dat";

    private ObjectOutputStream outputStream = null;
    private ObjectInputStream inputStream = null;
    
    int maxSize;

    public HighscoreManager() {
        scores = new LinkedList<Score>();
        maxSize = 5;
        loadScoreFile();
    }

    private void sort() {
        ScoreComparator comparator = new ScoreComparator();
        Collections.sort(scores, comparator);
    }

    public void addScore(String name, int score, int round, Siegbedingungen gamemode) {
        Score s = new Score(name, score, round, gamemode);
        if(scores.size() > maxSize){
            if(s.getPointsPerRound() > scores.getLast().getPointsPerRound()){
                scores.removeLast();
                scores.add(s);
                sort();
                updateScoreFile();
                fireTableDataChanged();
            }
        } else {
            scores.add(s);
            sort();
            updateScoreFile();
            fireTableDataChanged();
        }
    }

    public void loadScoreFile() {

        try {
            inputStream = new ObjectInputStream(new FileInputStream(HIGHSCORE_FILE));
            scores = (LinkedList<Score>) inputStream.readObject();
            inputStream.close();
        } catch (FileNotFoundException e) {
            System.out.println("[Load] FNF Error: " + e.getMessage());
            scores = new LinkedList<Score>();
            updateScoreFile();
        } catch (IOException e) {
            System.out.println("[Load] IO Error: " + e.getMessage());
            scores = new LinkedList<Score>();
        } catch (ClassNotFoundException e) {
            System.out.println("[Load] CNF Error: " + e.getMessage());
            scores = new LinkedList<Score>();
        }
    }

    public void updateScoreFile() {
        try {
            outputStream = new ObjectOutputStream(new FileOutputStream(HIGHSCORE_FILE));
            outputStream.writeObject(scores);
            outputStream.flush();
            outputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public boolean isCellEditable(int row, int column){
        return false;
    }

    public String getColumnName(int column){
        return columnNames[column];
    }

    public int getColumnCount(){
        return this.columnNames.length;
    }
    
    public int getRowCount(){
        return this.scores.size();
    }
    
    public Object getValueAt(int row, int column){
        switch(column){
        case 0: return (row+1);
        case 1: return scores.get(row).getName();
        case 2: return scores.get(row).getScore();
        case 3: return scores.get(row).getRound();
        case 4: return scores.get(row).getPointsPerRound();
        case 5: return scores.get(row).getMod();
        default: return "";
        }
    }
    
    public void reset(){
        scores = new LinkedList<Score>();
        updateScoreFile();
        fireTableDataChanged();
    }
    
    public Score getScore(int index){
        return scores.get(index);
    }
}

mfg. Dagobert
 

eRaaaa

Top Contributor
Also ich habs jetzt mal bei mir laufen lassen - funktioniert.

Vllt. wäre jetzt mal ein KSKB deinerseits angebracht!
Und du hast auch nicht geantwortet auf die Frage, wie du nun letztendlich die Tabelle hinzufügst zu dem Container/Frame etc.
 

Dagobert

Bekanntes Mitglied
Vllt. wäre jetzt mal ein KSKB deinerseits angebracht!
Bitte was? :D

So das mit dem Abstand ist schonmal wunderbar. Jetzt sieht es fast schon schön aus:D Was mich zu einer neuen Frage bringt. Kann ich den selectionmode so einstellen das ich nichts selektieren kann?

Das ich auf deine Frage nicht eingegangen bin tut mir leider, aber ich habs beim schreiben schlichtweg vergessen ^^ Wird sofort nachgeholt:
Meine Tabelle wird ein JPanel zugeordnet, das als Hintergrund ein Bild hat.
Java:
package view;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;

import controller.HighscoreManager;

public class ranglisteGUI extends JDialog implements ActionListener {
    
    private int width = 450;
    private int heigh = 700;
    
    private JLabel ueberschrift;
    
    private JTable tableHighscore;
    
    private JButton buttonOK;

    private Image background;

    private JPanel content;
    
    private HighscoreManager manager;

    public ranglisteGUI(HighscoreManager manager) {
        super();
        this.manager = manager;
        initGUI();
    }

    private void initGUI() {
        
        Font lcdfont = null;
        try {
            File lcdfontfile = new File("./res/BRADHITC.TTF");
            Font lcd = Font.createFont(Font.TRUETYPE_FONT, lcdfontfile);
            lcdfont = lcd.deriveFont(Font.TRUETYPE_FONT, 16);
        } catch (FontFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        setTitle("Rangliste");
        setSize(new Dimension(width, heigh));
        setPreferredSize(new Dimension(width, heigh));
        setResizable(false);
        setUndecorated(true);
        
        background = new ImageIcon("./res/highscore_notice.png").getImage();
        
        content = new JPanel(){
            
            @Override
            public void paintComponent(Graphics g){
                super.paintComponent(g);
                g.drawImage(background, 0, 0, this.getWidth(), this.getHeight(), null);
            }
        };
        
        content.setSize(new Dimension(width, heigh));
        content.setMinimumSize(new Dimension(width, heigh));
        content.setPreferredSize(new Dimension(width, heigh));
        content.setLayout(null);
        
        ueberschrift = new JLabel("Die besten der Besten");
        ueberschrift.setBounds(50, 50, 400, 20);
        ueberschrift.setFont(lcdfont.deriveFont(Font.TRUETYPE_FONT, 32));
        content.add(ueberschrift);
        
        tableHighscore = new JTable(manager){
            public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                Component c = super.prepareRenderer( renderer, row, column);            // We want renderer component to be transparent          
                if( c instanceof JComponent )                                             // so background image is visible
                    ((JComponent)c).setOpaque(false);              
                return c;           
            }
        };
        tableHighscore.setBounds(50, 100, 350, 500);
        tableHighscore.setOpaque(false);
        tableHighscore.setBorder(null);
        tableHighscore.setShowGrid(false);
        // TODO Keine Selectierung zulassen
        tableHighscore.setIntercellSpacing(new Dimension(1, 15));
        tableHighscore.setRowHeight(tableHighscore.getRowHeight() + 10);
        tableHighscore.setShowVerticalLines(true);
        tableHighscore.setFont(lcdfont);
        content.add(tableHighscore.getTableHeader());
        content.add(tableHighscore);
        
        getContentPane().add(content);

        int buttonwidth = 100;
        buttonOK = new JButton("OK");
        buttonOK.setBounds( width/2 - buttonwidth/2, 625, buttonwidth, 30);
        buttonOK.addActionListener(this);
        content.add(buttonOK);
        
        setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource().equals(buttonOK)) {
            dispose();
        }
    }
}
 

eRaaaa

Top Contributor
Okay. Also dein Problem ist das null Layout von deinem Panel "content" :)
null-Layout ist pfui :D

Aber um dir eine Lösung dennoch vorzuschlagen:
du musst dem TableHeader dann natürlich auch selbst mit setBounds die Position angeben,
z.B.:
Java:
 tableHighscore.getTableHeader().setBounds(50, 80, 350, 20);
Allerdings ist das alles etwas "eklig", benutze besser LayoutManager, dann muss man da nicht mit setBounds rummachen.

Du kannst dir auch mal Null Layout is Evil durchlesen
 

Dagobert

Bekanntes Mitglied
Ich finde das Nulllayout okay wenn ich ein Fenster von Fester größe habe. Mich mögen die Layoutmanager nicht so die machen mir iwie immer alles kaputt XD

So jetzt hab ich aber das nächste neues Problem. Wie bekomme ich mein TableHeader auch durchsichtig :D
OMG wann ist das matyrium endlich zu ende? :D

mfg. Dagobert
 

eRaaaa

Top Contributor
Uff, du kannst Fragen stellen :)
Wahrscheinlich musst du der Komponente des Renderers setOpaque(false) aufrufen.
Da ich gerade selbst nicht weiß ob man, und wenn ja, wie man an die Komponente elegant(siehe unten) rankommt, würde ich jetzt spontan dem TableHeader einen eigenen Renderer geben :)
Java:
		class TransparentHeader extends JLabel implements TableCellRenderer {
			public TransparentHeader() {
				this.setOpaque(false);
			}

			public Component getTableCellRendererComponent(JTable table,
					Object value, boolean isSelected, boolean hasFocus,
					int rowIndex, int vColIndex) {
				setText(value.toString());
				return this;
			}
		}
anschließend den Renderer setzen (das war nur ein Beispiel, Rahmen usw. müsstest du noch selbst machen)
Java:
tableHighscore.getTableHeader().setDefaultRenderer(new TransparentHeader());
und
Java:
tableHighscore.getTableHeader().setOpaque(false);

ansonsten ginge auch
Java:
((JLabel)tableHighscore.getTableHeader().getDefaultRenderer().getTableCellRendererComponent(tableHighscore, null, true, true, 0, 0)).setOpaque(false);
tableHighscore.getTableHeader().setOpaque(false);

:autsch:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Tabellen-Header anklickbar / auswählbar? AWT, Swing, JavaFX & SWT 5
S Mehrere Tabellen Zellen gleichzeitig färben AWT, Swing, JavaFX & SWT 5
D MySQL-Tabellen in GUI anzeigen AWT, Swing, JavaFX & SWT 8
D Swing JScrollPane Tabelle ändern (2 Tabellen) AWT, Swing, JavaFX & SWT 7
S Swing Tabellen - Listener & richtige Row AWT, Swing, JavaFX & SWT 3
K JavaFX Spalten der Tabellen verschieben AWT, Swing, JavaFX & SWT 2
R Swing Tabellen updaten AWT, Swing, JavaFX & SWT 10
C SWT Tabellen-Layout in StyledText? AWT, Swing, JavaFX & SWT 6
T Swing 2 Tabellen parallel sortieren? (synchronisieren) AWT, Swing, JavaFX & SWT 3
F Tablemodel zu mehreren Tabellen AWT, Swing, JavaFX & SWT 6
K Tabellen Inhalt ( Zelle ) Modifizieren AWT, Swing, JavaFX & SWT 2
M Markieren von ganzen Zeilen in transparenten Tabellen AWT, Swing, JavaFX & SWT 6
D JTabel: Überschrift, Abstand zwischen Tabellen, Spalten-Farbe ändern AWT, Swing, JavaFX & SWT 2
M gleicher TableCellRenderer für mehrere unterschiedliche Tabellen AWT, Swing, JavaFX & SWT 5
D Swing keine Tabellen Zeilen ohne Focus AWT, Swing, JavaFX & SWT 7
S SWT Zwei Tabellen gleichzeitig Scrollen AWT, Swing, JavaFX & SWT 3
D Swing Tabellen-Namen im ListSelectionListener abfragen AWT, Swing, JavaFX & SWT 2
A Tabellen Spalte löschen AWT, Swing, JavaFX & SWT 6
A Tabellen Überschriften ändern -setColumnIdentifiers()- Fehler AWT, Swing, JavaFX & SWT 7
M SWT SWT - Zwei Tabellen gleicher Größe AWT, Swing, JavaFX & SWT 5
T JTable - mehrere Tabellen verknüpfen AWT, Swing, JavaFX & SWT 14
T SWT Tabellen Kopf Schrift bearbeiten AWT, Swing, JavaFX & SWT 2
J Swing Spaltenbeschriftung bei Tabellen AWT, Swing, JavaFX & SWT 2
S Tabellen und Text Ausgabe in Swing GUI AWT, Swing, JavaFX & SWT 3
T Swing Sql Tabellen in jList ausgeben und speichern AWT, Swing, JavaFX & SWT 4
T Wie Zeilen in Tabellen farblich differenzieren? AWT, Swing, JavaFX & SWT 3
P Tabellen in Java - Zeile anhängen AWT, Swing, JavaFX & SWT 19
T Tabellen Inhalt in einem "anderem Frame" aktuallie AWT, Swing, JavaFX & SWT 7
0 JTable - Hintergrund Tabellen statt Grau AWT, Swing, JavaFX & SWT 5
D Voneinander abhängige Tabellen AWT, Swing, JavaFX & SWT 2
L Tabellen formatieren ? AWT, Swing, JavaFX & SWT 4
T 4 db tabellen in einem karteireiter eigene klasse für die me AWT, Swing, JavaFX & SWT 7
G ein ContentProvider für 2 fast gleiche tabellen AWT, Swing, JavaFX & SWT 7
G Tabellen Items Einträge Aktualisieren AWT, Swing, JavaFX & SWT 2
K Spaltenbreite von mehreren Tabellen gleichzeitig verändern AWT, Swing, JavaFX & SWT 3
T listener für tabellen bei selektierung AWT, Swing, JavaFX & SWT 7
D mit swt.virtual mehrspaltige tabellen füllen AWT, Swing, JavaFX & SWT 3
I Probleme mit Tabellen (SWT) AWT, Swing, JavaFX & SWT 8
E SWT: Tabellen-Inhalt kopieren AWT, Swing, JavaFX & SWT 2
J Resultsets in Tabellen abbilden AWT, Swing, JavaFX & SWT 4
M Tabellen verschachteln AWT, Swing, JavaFX & SWT 7
G Tabellen Einträge löschen - JTable AWT, Swing, JavaFX & SWT 6
K Layout-Frage: 3 Feste Tabellen, 6-10dynamische AWT, Swing, JavaFX & SWT 2
R Mehrzeilige Darstellung von Spalten in SWING-Tabellen AWT, Swing, JavaFX & SWT 5
I TIFF im CMYK-Farbmodell + mit dpi-Auflösung im Header erzeugen - wie? AWT, Swing, JavaFX & SWT 0
J CheckComboBox : Ausgewählte Items NICHT im Header anzeigen AWT, Swing, JavaFX & SWT 4
M Swing jFileChooser Header viewTypeDetails setFont AWT, Swing, JavaFX & SWT 0
R Swing JTable : Header der Spalten ergänzen mit caption (wie bei html-table) AWT, Swing, JavaFX & SWT 2
L JTable Permanent Header AWT, Swing, JavaFX & SWT 0
N Swing JTable mit Sorter: Keine Sortierung bei Klick in Header AWT, Swing, JavaFX & SWT 3
V Swing JTable Row Header AWT, Swing, JavaFX & SWT 6
M JScrollPane Header AWT, Swing, JavaFX & SWT 3
P Swing In JTable Header auch an der linken Seite AWT, Swing, JavaFX & SWT 2
S TableModel Header wird nicht angezeigt AWT, Swing, JavaFX & SWT 5
V JTable Header L&F AWT, Swing, JavaFX & SWT 10
O Swing JTable Header AWT, Swing, JavaFX & SWT 2
T Swing JScrollPane- und Tabelle-Header Problem AWT, Swing, JavaFX & SWT 25
Spin JTable Header wird nicht angezeigt ohne ScrollPane AWT, Swing, JavaFX & SWT 3
A JTable Header AWT, Swing, JavaFX & SWT 3
G Swing JTable Header neu initialisieren? AWT, Swing, JavaFX & SWT 2
M Jframe wie bekommt man bei den zeile einen header erzeugen AWT, Swing, JavaFX & SWT 2
S JXTable Header Tooltipps AWT, Swing, JavaFX & SWT 4
G JTable Multiple Row Header Example - Probleme mit der Höhe der Zellen AWT, Swing, JavaFX & SWT 4
C Swing 1spaltige JTable ohne Header AWT, Swing, JavaFX & SWT 18
R JTabel - Header AWT, Swing, JavaFX & SWT 2
R Swing TableRowSorter und Header Renderer AWT, Swing, JavaFX & SWT 2
hdi Swing JTable: SortKeys und Header Column Width AWT, Swing, JavaFX & SWT 5
C jtable checkbox in header / spaltenüberschrift AWT, Swing, JavaFX & SWT 4
hdi SWT JComboBox : Drop-Down Header ohne Eintrag AWT, Swing, JavaFX & SWT 6
F Swing JTable Header modifizieren AWT, Swing, JavaFX & SWT 13
M Problem mit funktionellem JTable Header AWT, Swing, JavaFX & SWT 5
D Swing JTable, Header und Leerzeilen AWT, Swing, JavaFX & SWT 3
A Swing Zeilenanzeige: JPanel als Header für JScrollPane AWT, Swing, JavaFX & SWT 7
R JTable Header - will links kleines icon hinzufuegen..? AWT, Swing, JavaFX & SWT 6
R Swing JScrollPane - Header AWT, Swing, JavaFX & SWT 6
R Swing JTable: Eigene Zeichnung im Header AWT, Swing, JavaFX & SWT 11
C Swing JTable Header angelickt? AWT, Swing, JavaFX & SWT 4
eskimo328 JTable Zeilenumbruch im Header AWT, Swing, JavaFX & SWT 2
T 2JLabels in einen JTable Header AWT, Swing, JavaFX & SWT 2
S Browser ohne Header öffnen AWT, Swing, JavaFX & SWT 3
A Header abfragen, überprüfen AWT, Swing, JavaFX & SWT 23
D Sortierung beim Klicken auf Header einer JdbTable verhindern AWT, Swing, JavaFX & SWT 3
A JTable Header + ScrollBar AWT, Swing, JavaFX & SWT 4
H JTable drucken mit Header AWT, Swing, JavaFX & SWT 4
G JTable und Header AWT, Swing, JavaFX & SWT 4
J JTable Zellen und Header AWT, Swing, JavaFX & SWT 2
P Tablle mit Zeilen Header (nicht spaltenheader) AWT, Swing, JavaFX & SWT 3
D jTable Header zweizeilig? AWT, Swing, JavaFX & SWT 2
W JTabel Header - Einfügen eines Textfeldes AWT, Swing, JavaFX & SWT 3
R JTable Mehrzeiliger Header zerstört JGoodies-Layout AWT, Swing, JavaFX & SWT 2
D JTable Header während Laufzeit ändern. AWT, Swing, JavaFX & SWT 3
D Jtable Header Höhe setzen ? AWT, Swing, JavaFX & SWT 2
D Header für den Row Header (JTable) AWT, Swing, JavaFX & SWT 2
O Probleme mit header von JTable AWT, Swing, JavaFX & SWT 6
L Checkbox in JTable (again), bei true Daten in Header AWT, Swing, JavaFX & SWT 7
D Mehrzeilige JTable Header AWT, Swing, JavaFX & SWT 2
N Jtable header fixieren AWT, Swing, JavaFX & SWT 2
L Header von ausgewählte Spalten ausgeben AWT, Swing, JavaFX & SWT 6
K Kein Header in JTable ! AWT, Swing, JavaFX & SWT 8
F Die JTable und ihr Header AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben