Ist das möglich (JTable)

Status
Nicht offen für weitere Antworten.

IceTi

Bekanntes Mitglied
Hallo,

ich habe da mal eine Frage und zwar möchte ich wissen ob folgendes möglich wäre:

Also, ich habe eine Tabelle (JTable) und darunter verschiedenen Symbole, welche man wie ein Checkbox auswählen kann. Wähle ich nun z.B. Symbol 1, möchte ich, wenn ich auf eine bestimmte Zelle in der JTable klicke, dass dort dieses Symbol erscheint. Wähle ich dann kein anderes Symbol und klicke noch auf einen andere Zelle so erscheint das Symbol dort auch. Ich denke das Prinzip ist klar, oder?

Bei klick auf eine beliebige Zelle soll also ein bestimmte Symbol bzw. eine Grafik erscheinen, ohne eine ComboBox oder dergleichen.

Wie kann ich so etwas realisieren ?
 
Code:
ListSelectionListener selectionListener = new ListSelectionListener() {
    public void valueChanged(final ListSelectionEvent e) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                int row = table.getSelectedRow();
                int column = table.getSelectedColumn();
                table.setValueAt(getCurrentValue(), row, column);
            }
        });
    }
};
table.getSelectionModel().addListSelectionListener(selectionListener);
table.getColumnModel().getSelectionModel().addListSelectionListener(selectionListener);
 
In der Zeile:

Code:
table.setValueAt(getCurrentValue(), row, column);

Erhalte ich nun:

Code:
The method getCurrentValue() is undefined for the type new Runnable(){}


Habe dann für gerCurrentValue() mal meinen CellRenderer eingesetzt aber da passiert dann nichts, also so:

Code:
table.setValueAt(new Renderer(), row, column);


Hier der Renderer:

Code:
import java.awt.Component;
import javax.swing.ImageIcon;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;


public class Renderer extends DefaultTableCellRenderer{

	private static final long serialVersionUID = 1L;

	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
		ImageIcon icon = new ImageIcon(Main.class.getResource("/img/grade.jpg"));
		setText((String)value);
		setIcon(icon);
		return this;
	}
}


Was mache ich da nun falsch ?
 
Was muss da denn sonst hin oder wie löse ich das Problem ich denke mal es ist nur noch eine Kleinigkeit oder?
 
Wenn ich das so mache, passiert da auch nichts.

Hier mal ein Teil meines Codes:


Code:
public Class Main{

    TableModel model = new AbstractTableModel(){
		public Object getValueAt(int rowIndex, int columnIndex){
			return null;
		}
		public int getColumnCount(){
			return 20;
		}
		public int getRowCount(){
			return 19;
		}
	};


    public void init() {
    	
		final JTable table = new JTable(model);
		//table.getColumnModel().getColumn(1).setCellRenderer(new Renderer());
		table.setGridColor(Color.black);
		table.setBounds(10, 38, 620, 304);
		table.setColumnSelectionAllowed(false);
		table.setRowSelectionAllowed(false);

		ListSelectionListener selectionListener = new ListSelectionListener() {
		    public void valueChanged(final ListSelectionEvent e) {
		        SwingUtilities.invokeLater(new Runnable() {
		            public void run() {
		                int row = table.getSelectedRow();
		                int column = table.getSelectedColumn();
		                table.setValueAt("mein Text", row, column);
		            }
		        });
		    }
		};
		table.getSelectionModel().addListSelectionListener(selectionListener);
		table.getColumnModel().getSelectionModel().addListSelectionListener(selectionListener);



               panel1.add(table);

[...]

}
 
Danke,

nun erhaltet ich:

Code:
Renderer[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=javax.swing.border.EmptyBorder@109ea96,flags=25165832,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,horizontalAlignment=LEADING,horizontalTextPosition=TRAILING,iconTextGap=4,labelFor=,text=,verticalAlignment=CENTER,verticalTextPosition=CENTER]

Wenn ich auf eine Zelle klicke und es so lasse:
Code:
		ListSelectionListener selectionListener = new ListSelectionListener() {
		    public void valueChanged(final ListSelectionEvent e) {
		        SwingUtilities.invokeLater(new Runnable() {
		            public void run() {
		                int row = table.getSelectedRow();
		                int column = table.getSelectedColumn();
		                table.setValueAt(rd = new Renderer(), row, column);
		            }
		        });
		    }
		};

"Hallo" schreibt er mir nun in eine Zelle aber ich möchte da dann ja ein Bild/eine Graik haben ... hmmm

EDIT:
Bekomme es einfach nicht hin. Kann doch jetzt nicht mehr so schwer sein oder ?
 
In setValueAt gibst du den Wert an, der in der Zelle erscheinen soll, nicht den Renderer.
Der Renderer kümmert sich dann darum, den Wert so darzustellen, wie du es willst.
 
Hmmm ok. Kappiert.
Also könnte ich dem Renderer sagen, wenn dort "12" drin steht dann packe die und die Grafik in die Zelle ??

Doch wie mache ich diese Sachen nun ?

Wäre super NEtt würdest du mir das noch kurz erklären, dann habe ich es ja 🙂


EDIT:
Habs nun mal so probiert:
Code:
    Renderer ren = new Renderer(); 
table.setDefaultRenderer(Object.class, ren);

public class Renderer extends DefaultTableCellRenderer{

	private static final long serialVersionUID = 1L;

	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
		ImageIcon icon = new ImageIcon(Main.class.getResource("/img/kurve2.jpg"));
		
		if(value != null && value.equals("Test")){
			setText((String)value);
			setIcon(icon);
		}
		return this;
	}
}

Da macht er mir aber direkt ganze Zeilen mit dem ICon und beim 2. Klick die Ganze Tabelle. Wie kann ich das also auf eine Zelle begrenzen oder wo liegt der Fehler ?
 
Du musst dem Renderer auch sagen, was er darstellen soll, wenn die angegebene Bedingung
nicht erfüllt ist. Übrigens sollte man Bilder besser ausserhalb der callback Methode laden.
Andernfalls geht unnötig Rechenzeit mit dem Bildladen verloren,
jedesmal wenn Zellen neu dargestellt werden müssen.
 
Jipiii, so funzt das...

Code:
public class Renderer extends DefaultTableCellRenderer{

	private static final long serialVersionUID = 1L;
	ImageIcon icon = new ImageIcon(Main.class.getResource("/img/kurve2.jpg"));
	
	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){

		if(value != null && value.equals("Test")){
			setIcon(icon);
		}else{
			setIcon(null);;		
			}
		return this;
	}
}

Ist das so okay? Oder kann man da noch was besser dran machen?
 
Das mit den Icons klappt nun Wunderbar, dafür erstmal DANKESCHÖN an André Uhres!!

Nun habe ich leider schon wieder ein Problem.

Nun kann ich ja per klick auf eine Zelle ein Icon/Bild einfügen auf bestimmten Bildern soll es nun später möglich sein draufzuklicken.
Ich habe quasi einen Editor wo man die Bilder platziert und später kann man sich dies nur noch angucken + auf bestimmte Bilder draufklicken, dann soll halt eine bestimmte Aktion ausgeführt werden.

Wie kann ich sowas realisieren?
Vor allem stelle ich mir dir Frage, wie bekomme ich die einzelnen ActionListener für die Bilder/Buttons hin?

Wie mache ich das nun?
Bin für jede Hilfe dankbar...
 
IceTi hat gesagt.:
später kann man sich dies nur noch angucken + auf bestimmte Bilder draufklicken,
dann soll halt eine bestimmte Aktion ausgeführt werden. Wie kann ich sowas realisieren?
Wieso machst du das nicht einfach auch im selectionListener? Du könntest es mit einem boolean "angucken" steuern.
Bei !angucken setzt du ein neues Bild, bei angucken führst du die "bestimmte" Aktion aus.
 
Hmm so richtig habe ich das noch nicht verstanden, vielleicht kannst du mir das nochmal genauer erklären.

Ich setze also wieder einen selectionListener auf die Table, doch wie setze ich diesen nun nur auf bestimmte Zellen? Wenn ich auf eine Zelle (welche anklickbar sein soll) klicke, soll sich das Bild ändern und Variable gesetzt werden (Um genauer zu sein soll etwas über eine SocketVerbindung geschickt werden, aber das sollte ja egal sein, was da gemacht wird)... Diese "besonderen" Felder heissen auf jeden Fall anders als die "starren Zellen"...
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben