Probleme mit selektieren in der JTable

Davtorik

Mitglied
Hi ! Wie ihr wisst bin ja da ja grad an so nem Programm dran das mit JTable arbeitet :) :google:


Jetzt is ein neues Problem aufgetaucht, mit dem ich grade nicht klar komme.

Es geht darum, dass ich in einem JTable etwas suchen und mithilfe einer Methode das komplette Zeile des Suchergebnis im JTable markieren will.

Nur leider passiert mit setSelectionRowIntervall nichts. Habe ein DefaultTableModel verwendet, etwas Code liegt bei

Code:
class JGesamtliste extends JPanel {



/**	
 * Erzeugt ein  Objekt der Klass Einkaufsliste
 */
	
	private Einkaufsliste el;
/**
 * Erzeugt die Überschriften der Haupt-Tabelle
 */
	private final String[] header = {"Datum","Bewohner","Ort", "Betrag"};
	
/**
 * Erzeugt ein neues nicht editierbares JTable
 */	
	private JTable gesamtliste = new JTable() {
        public boolean isCellEditable(int x, int y) {
            return false;
        }
    };

/**
 * Erzeugt einen Button zum Löschen
 */
	private JButton loeschen =new JButton("Eintrag löschen");


/**
 * Erzeugt ein neues DefaultTableModel
 */   
	private DefaultTableModel model =new DefaultTableModel();
	JGesamtliste(Einkaufsliste el) {
	    	setBackground(Color.yellow);
        setBorder(new TitledBorder("Liste aller Einkäufe")); 
		setLayout(null);		

        model.setDataVector(getunsereEinkaufslisteAlsListe(el), header);
		gesamtliste.setModel(model);
		gesamtliste.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		gesamtliste.setDefaultRenderer(Object.class,new ColoredTableCellRenderer());
		gesamtliste.setRowSelectionInterval(1,2);

		JPanel orangeFrame=new JPanel();
		orangeFrame.setBackground(Color.orange);
		orangeFrame.setBounds(40,40,700,320);
		JScrollPane scroll=new JScrollPane(gesamtliste);
		scroll.setPreferredSize(new Dimension(340,310));

		scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS );
        orangeFrame.add(scroll);


        add(orangeFrame);
        add(Suche);
        add(Eingabe);
        setVisible(true);


		}
	/**
	 * Makiert ein Suchergebnis, falls eins gefunden wurde
	 * @param markierZeile die Position, die makiert wird
	 */
		 public void markiereEintrag(int markierZeile){
			 gesamtliste.setRowSelectionInterval(markierZeile,1);
			 el.updatedTabbedPane();
		 }

Wäre nett, wenn mir jmd sagen könnte warum das nicht auf diese Art...mit editable hat es ja nichts zu tun, oder ?


Gruß David
 
Hallo David,

Also bei mir funktioniert es mit setRowSelectionInterval().

Java:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import javax.swing.table.AbstractTableModel;

public class FindandSelectinTable extends JFrame implements ActionListener {

	private JTable table = new JTable(new QuadratTableModelSimple());

	private JButton button = new JButton("Find...");

	public FindandSelectinTable() {
		super("Table Example");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setAlwaysOnTop(true);
		this.setLocationByPlatform(true);

		table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

		this.add(new JScrollPane(table), BorderLayout.CENTER);
		this.add(button, BorderLayout.SOUTH);

		button.addActionListener(this);

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

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

	public void actionPerformed(ActionEvent e) {
		String input = JOptionPane.showInputDialog(this, "Search...");
		int r = table.getRowCount();
		int c = table.getColumnCount();
		if (input != null && input.length() > 0) {
			for (int i = 0; i < r; i++) {
				for (int j = 0; j < c; j++) {
					if (table.getValueAt(i, j).equals(input)) {
						table.setRowSelectionInterval(i, i);
						break;
					}

				}
			}
		}
	}

	class QuadratTableModelSimple extends AbstractTableModel {
		public int getRowCount() {
			return 30;
		}

		public int getColumnCount() {
			return 30;
		}

		public Object getValueAt(int row, int col) {
			return "" + row * col;
		}

		public String getColumnName(int column) {
			return "Spalte" + column;
		}
	}
}


Vg Erdal
 
Klappt jetzt fast alles :)


Nur hab ich noch ein einzelnes Problem...

Ich hab nen ColoredCellRenderer und seitdem wenn ich den aktivier, sehe ich nicht ehr, welche reihe ausgewählt ist. der DefaultCellRenderer wird da wohl was überschrieben /nicht definiert haben.....hab aber keine ahnung was ;(
 
Versuchs mal mit:

setSelectionBackground(Color selectionBackground)
setSelectionForeground(Color selectionForeground)


Vg Erdal
 
leider nicht wie gewollt, nur wieder, wenn ich den ColoredCellRenderer ausschalte :( ich poste hier einfach ma den entsprechenden Teil


Code:
  import java.awt.*;

  import javax.swing.*;
  import javax.swing.border.*;
import javax.swing.table.*;
/**
 /**Klasse, die einen TableCellRenderer darstellt, der bei Zellen mit Geldbeträgen den Hintergrund editiert. <0=grün =0=gelv >0=rot
  * Desweiteren wird der Betrag rechtsbündig ausgegeben.
  *
 *@author David Stein
 *@version 4.final 20.05.06 
 */		  
  public class ColoredTableCellRenderer implements TableCellRenderer {

		  
	   
	    public Component getTableCellRendererComponent(JTable table,Object value,boolean isSelected,boolean hasFocus,int row,int column)
			    {
			      JLabel label = new JLabel((String)value);
			      label.setOpaque(true);
			      table.setSelectionBackground(Color.CYAN);
			      	//sorgt dafür, dass nur Tabellen mit Beträgen editiert werden
			        if ((column==3&&table.getColumnCount()==4) ||(column==1&&table.getColumnCount()==2)) {
			        	
			        	double testDouble =0;
			        	if (value!=null){ 
			        		//wandelt Inhalt der Zelle in Double um 
			        		testDouble=Double.parseDouble(value.toString());
			        		//Rechtbündigkeit
				          	label.setHorizontalAlignment(SwingConstants.RIGHT);
				          	
				          	if (testDouble<0) {
				          		//falls Betrag negativ, wird die Zelle grün hinterlegt
				          		label.setBackground(Color.green);
				          	}
				          	else if (testDouble>0){
				          	    //falls Betrag negativ, wird die Zelle rot hinterlegt
				          		label.setBackground(Color.red);
				          	}
				          	else{
				          		//falls Betrag =0, wird die Zelle gelb hinterlegt
				          		label.setBackground(Color.yellow);
				          	}
			        	}
			        }
			      return label;
			    }
	    }


und die Klasse der JTable (Gesamtliste)
Code:
       gesamtliste.setModel(model);
	    gesamtliste.setDefaultRenderer(Object.class,new ColoredTableCellRenderer());
		gesamtliste.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		//sorgt dafür, dass eine markierte Zeile makiert bleibt
		if (el.getGesamtanzahl()!=0&&el.getGesamtanzahl()>markierung){

			gesamtliste.setRowSelectionInterval(markierung,markierung);
		}		
		gesamtliste.addMouseListener(new MouseListener() {
			/**
			 * Erzeugt einen MouseListener, der die einzelnen Spalten durch Doppelklick editierbar/löschbar macht
			 */
			public void mousePressed(MouseEvent event)
			{
				/**
				 * Stellt den Point des ausgewählten Feldes dar
				 */   	    
			    Point markierpoint=new Point();
			    markierpoint = event.getPoint();
				markierung = gesamtliste.rowAtPoint(markierpoint);
				System.out.println(markierung);
				gesamtliste.setToolTipText("Doppelklick zum bearbeiten/löschen");
				if (event.getClickCount() == 2){
					bearbeitenMoeglich=true;
					update();
				}
			}
			public void mouseClicked(MouseEvent arg0) {}
			public void mouseReleased(MouseEvent arg0) {}
			public void mouseEntered(MouseEvent arg0) {}
			public void mouseExited(MouseEvent arg0) {}
		});


Wäre nett wenn da einer weiter helfen kann
 
Hallo David,

schau mal hier:

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;

public class FindandSelectinTable extends JFrame implements ActionListener {

	private JColoredTable table = new JColoredTable();

	private JButton button = new JButton("Find...");

	public FindandSelectinTable() {
		super("Colored Table Example");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setAlwaysOnTop(true);
		this.setLocationByPlatform(true);

		table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		table.setModel(new QuadratTableModelSimple());

		this.add(new JScrollPane(table), BorderLayout.CENTER);
		this.add(button, BorderLayout.SOUTH);

		button.addActionListener(this);

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

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

	public void actionPerformed(ActionEvent e) {
		String input = JOptionPane.showInputDialog(this, "Search...");
		int r = table.getRowCount();
		int c = table.getColumnCount();
		if (input != null && input.length() > 0) {
			for (int i = 0; i < r; i++) {
				for (int j = 0; j < c; j++) {
					if (table.getValueAt(i, j).equals(input)) {
						table.setRowSelectionInterval(i, i);
						break;
					}

				}
			}
		}
	}

	class JColoredTable extends JTable {
		public JColoredTable() {
			this.setModel(new QuadratTableModelSimple());
		}

		public Component prepareRenderer(TableCellRenderer renderer,
				int rowIndex, int vColIndex) {

			Component c = super.prepareRenderer(renderer, rowIndex, vColIndex);
			if (c instanceof JComponent) {
				JLabel jl = (JLabel) c;

				double testDouble = 0;
				String value = jl.getText();

				if (value != null & !table.isRowSelected(rowIndex)) {
					testDouble = Double.parseDouble(value);
					jl.setHorizontalAlignment(SwingConstants.RIGHT);
					if (testDouble < 0) {
						jl.setBackground(Color.green);
					} else if (testDouble > 0) {
						jl.setBackground(Color.red);
					} else {
						jl.setBackground(Color.yellow);
					}
				} else
					jl.setBackground(Color.CYAN);
			}

			return c;
		}
	}

	class QuadratTableModelSimple extends AbstractTableModel {
		public int getRowCount() {
			return 30;
		}

		public int getColumnCount() {
			return 30;
		}

		public Object getValueAt(int row, int col) {
			return "" + row * col * (int) Math.pow(-1, row);
		}

		public String getColumnName(int column) {
			return "Spalte" + column;
		}
	}
}


Vg Erdal
 
Zurück