Swing JTable Row Header

VitiumJava

Mitglied
Hallo,

ich habe versucht links neben dem JTable noch ein Row Header zu erstellen, was auch funktioniert hat.
Leider gibt es Probleme mit der Darstellen der Row Header, die nicht so aussehen wie die JTable Header.
Wie könnte man das ändern, so das es für jedes Look and Feel geht?

Grüße

Java:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;

import javax.swing.AbstractListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListCellRenderer;
import javax.swing.ListModel;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;

public class TestRowHeader extends JFrame {

	private static final long serialVersionUID = 1L;
	private JPanel contentPane;
	private JTable table;

	public TestRowHeader() {

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);

		JScrollPane scrollPane = new JScrollPane();
		
		table = new JTable();
		table.setModel(new DefaultTableModel(
				new Object[][] { { "1", "3", "0" }, { "50", "51", "42" },
						{ "42", "4", null }, },
				new String[] { "X1", "X2", "X3" }));

		JList l = new JList(getRowListModel());

		l.setFixedCellWidth(100);
		l.setFixedCellHeight(table.getRowHeight() + table.getRowMargin());
		l.setCellRenderer(new TestRowHeaderRenderer(table));
		scrollPane.setRowHeaderView(l);
		scrollPane.setViewportView(table);
		contentPane.add(scrollPane, BorderLayout.CENTER);
	}
	

	public static void main(String[] args) {
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (Throwable e) {
			e.printStackTrace();
		}
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					TestRowHeader frame = new TestRowHeader();
					frame.setSize(500, 125);
					frame.setVisible(true);
				
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	public ListModel getRowListModel() {
		ListModel lm = new AbstractListModel() {
			private static final long serialVersionUID = 1L;
			String header[] = { "A", "B", "C" };

			@Override
			public int getSize() {
				return header.length;
			}

			@Override
			public Object getElementAt(int index) {
				return header[index];
			}
		};
		return lm;
	}
}

class TestRowHeaderRenderer extends JLabel implements ListCellRenderer {
	
	private static final long serialVersionUID = 1L;
	public TestRowHeaderRenderer(JTable table) {
		super();
		JTableHeader header = table.getTableHeader();
		setOpaque(true);
		setBorder(UIManager.getBorder("TableHeader.cellBorder"));
		setHorizontalAlignment(CENTER);
		setForeground(header.getForeground());
		setBackground(header.getBackground());
		setFont(header.getFont());
	}

	@Override
	public Component getListCellRendererComponent(JList list, Object value,
			int index, boolean isSelected, boolean cellHasFocus) {
		setText((value == null) ? "" : value.toString());
		return this;
	}
}
 

Anhänge

  • 05.11.png
    05.11.png
    20,3 KB · Aufrufe: 49
Soweit ich weiss erben die meisten Komponenten von JLabel für die Optik. Und so wie es aussieht, ist das Border deiner RowHeader BevelBorder.RAISED, während die ColumnHeader eher nach LineBorder aussehen.

Kann dir da leider nichts genaueres sagen, da ich mich dmait noch nie beschäftigt habe, wäre aber mein Ansatz wo ich anfangen würde zu suchen.
 
@André

Danke. Das Beispiel unter Java Tips Weblog habe ich probiert.

Das Look and Feel geht aber auch das nicht. D.h. für die linken Header.
Mir geht es darum das die Header nicht alle das selbe Look and Feel haben.
 
@Ebenius

Das geht auch nicht.

Wird in der main Methode
Java:
UIManager.setLookAndFeel(UIManager
						.getSystemLookAndFeelClassName());

eingegeben, kommt das Bild im Anhang raus.

Das Look and Feel hat sich nur bei den oberen headern geändert.

Grüße
 

Anhänge

  • 07.11.png
    07.11.png
    23,4 KB · Aufrufe: 44

Zurück
Oben