JButton wewnątrz JTable

0

Witam,

Czy jest jakiś sposób na umieszczenie przycisku JButton w komórce tabeli JTable?
Chodzi mniej więcej o coś takiego:

user image

Jak widać, w kolumnie występują komórki zawierające przyciski i komórki zawierające zwykły tekst.

A może ma ktoś pomysł na obejście tego w inny sposób, jeżeli tak się nie da?

0

A co rozumiesz przez obejście ?

0

Powiedzmy, że interesująca cię kolumna nazywa się td.

   MojRenderer mojRenderer=new MojRenderer()
   .....
   td.setCellRenderer(mojRenderer)
   .....
class MojRenderer implements TableCellRendere
{
    	public Component getTableCellRendererComponent(JTable table,Object value,
			boolean isSelected,boolean hasValue,int row,int column)
        {
              if (cośTam) 
              {
                   return new JButton(...);
              }
              else
              {
                   return new JLabel(...);
              }
        } 
}
0

Dzięki panowie.

Bogdans, najpierw na warsztat wziąłem twój kod. Wszystko ładnie dodaje do tabeli (na przemian przycisk i tekst) , tylko przycisk nie reaguje na klikanie.
Fragment kodu (może coś robię źle?):

class MojRenderer implements TableCellRenderer {
	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
	                                               boolean hasValue, int row, int column) {
		int a = row % 2;
		if (a == 1) {
			JButton b = new JButton("Przycisk");
			b.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					System.out.print("reaguje");
				}
			});
			return b;
		} else {
			return new JLabel(" tekst");
		}
	}
}
		
TableColumn td = tabela.getColumnModel().getColumn(5);
MojRenderer mojRenderer = new MojRenderer();
td.setCellRenderer(mojRenderer);
0

No i udało się :) Poniżej kod, może komuś sie przyda:

class MojRenderer implements TableCellRenderer {
	public Component getTableCellRendererComponent(JTable table, Object value,
                                                       boolean isSelected, boolean hasValue, int row, int column) {
		int a = row % 2;
		if (a == 1) {
			JButton b = new JButton("Przycisk");
			return b;
		} else {
			return new JLabel(" tekst");
		}
	}
}
		
class MojEditor implements TableCellEditor {
	public Component getTableCellEditorComponent(JTable table, Object value,
                                                     boolean isSelected, int row, int column) {
		int a = row % 2;
		if (a == 1) {
			JButton b = new JButton("Przycisk");
			b.addActionListener(new ActionListener()
			{
				public void actionPerformed(ActionEvent e) {
					JOptionPane.showConfirmDialog(null, "Reaguje", "", JOptionPane.CLOSED_OPTION);
				}
			});
			return b;
		} else {
			return null;/*new JLabel(" tekst");*/
		}
	}
			
	public void removeCellEditorListener(CellEditorListener cl) {
	}

	public void addCellEditorListener(CellEditorListener cl) {
	}

	public boolean shouldSelectCell(EventObject ev) {
		 return true;
	}

	public boolean isCellEditable(EventObject ev) {
		 return true;
	}

	public Object getCellEditorValue() {
		 return null;
	}

	public boolean stopCellEditing() {
		 return true;
	}

	public void cancelCellEditing() {
	}
}
		
TableColumn td = tabela.getColumnModel().getColumn(5);
		
MojRenderer mojRenderer = new MojRenderer();
td.setCellRenderer(mojRenderer);
MojEditor mojEditor = new MojEditor();
td.setCellEditor(mojEditor);
0

Hey.
Jak zrobię to to wyświetla mi że jest bląd

public boolean shouldSelectCell(EventObject ev) { //EventObject evt jest podkreslony
return true;
}

    public boolean isCellEditable(EventObject ev) { //Event object jest podkreśłony
             return true;
    }

Nie za bardzo wiem jak to ugryźć. Proszę o pomoc
Pozdrawiam

0
majki12 napisał(a)

Hey.
Jak zrobię to to wyświetla mi że jest bląd

public boolean shouldSelectCell(EventObject ev) { //EventObject evt jest podkreslony
return true;
}

    public boolean isCellEditable(EventObject ev) { //Event object jest podkreśłony
             return true;
    }

Nie za bardzo wiem jak to ugryźć. Proszę o pomoc
Pozdrawiam

Może nie masz odpowiedniego importu.
Wpisz na początku pliku:

import java.util.EventObject;
0

Hey
Dzięki, to działa. Tylko nie działa przycisk. Po naciśnięciu nic się nie pojawia :(
Pozdrawiam

0

Hey co mam tutaj źle? Chciałbym żeby w każdej komórce było JButton i każde żeby inaczej reagowało na kliknięcie. Proszę mnie najpierw nakierować gdzie mam błąd.

import java.awt.;
import java.awt.event.
;
import java.util.*;

import javax.swing.;
import javax.swing.event.CellEditorListener;
import javax.swing.table.
;
import java.util.EventObject;

public class mojeRenderer extends JFrame implements WindowListener,ActionListener
{
DefaultTableModel tabModel1;
JTable tabela;
JTable b;

public mojeRenderer()
{
	super();
	addWindowListener(this);
	setSize(300,300);
	setTitle("kalendarz");
	setLayout(null);
	setVisible(true);
	
	
	
	tabModel1 = new DefaultTableModel(){

		public boolean isCellEditable(int x, int y) {
		return false;
		}                       
		};
		System.out.println("uruchamia");
  •   	pierwsza tabela*
      	tabModel1.setColumnCount(7);
      	tabModel1.setNumRows(6);
      	tabela=new JTable(tabModel1);
      	tabela.setRowHeight(32);//bylo 34 
      	tabela.setBorder(BorderFactory.createLineBorder(Color.black));
    
      	tabela.getColumnModel().getColumn(0).setPreferredWidth(200);
      	tabela.getColumnModel().getColumn(1).setPreferredWidth(200);
      	tabela.getColumnModel().getColumn(2).setPreferredWidth(200);
      	tabela.getColumnModel().getColumn(3).setPreferredWidth(200);
      	tabela.getColumnModel().getColumn(4).setPreferredWidth(200);
      	tabela.getColumnModel().getColumn(5).setPreferredWidth(200);
      	tabela.getColumnModel().getColumn(6).setPreferredWidth(200);
      	tabela.setBounds(100,100,300,300);
      	tabela.setValueAt("heyka",1,2);
      	tabela.setVisible(true);
      	this.add(tabela);
    
      	TableColumn td = tabela.getColumnModel().getColumn(1);
    
      	MojRenderer mojRenderer = new MojRenderer();
      	td.setCellRenderer(mojRenderer);
      	MojEditor mojEditor = new MojEditor();
      	td.setCellEditor(mojEditor);            
    
      }
    

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

    }

    class MojRenderer implements TableCellRenderer {
    public Component getTableCellRendererComponent(JTable table, Object value,
    boolean isSelected, boolean hasValue, int row, int column) {

                      JButton b = new JButton("Przycisk");
    
                      return b;
              } 
    

}

class MojEditor implements TableCellEditor {
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {

       // JButton b = new JButton("Przycisk");
       // b.addActionListener(new ActionListener()
    	JButton b = new JButton();
    	 b.addActionListener(new ActionListener()
         {
     public void actionPerformed(ActionEvent evt) {
   System.out.println("dziala");
    	 // JOptionPane.showConfirmDialog(null, "Reaguje", "", JOptionPane.CLOSED_OPTION);
         }
       });
       return b;
   } 
         
  
    
  
                   
    public void removeCellEditorListener(CellEditorListener cl) {
    }

    public void addCellEditorListener(CellEditorListener cl) {
    }

    public boolean shouldSelectCell(EventObject ev) {
             return true;
    }

    public boolean isCellEditable(EventObject ev) {
             return true;
    }

    public Object getCellEditorValue() {
             return null;
    }

    public boolean stopCellEditing() {
             return true;
    }

    public void cancelCellEditing() {
    }

}
public void actionPerformed(ActionEvent evt){

}
public void windowClosing(WindowEvent evt){
System.exit(0);
}

public void windowClosed(WindowEvent evt){
}
public void windowOpened(WindowEvent evt){

}
public void windowIconified(WindowEvent evt){

}
public void windowDeiconified(WindowEvent evt){

}
public void windowActivated(WindowEvent evt){

}
public void windowDeactivated(WindowEvent evt){

}

}

Pozdrawiam

0
  1. Kod się skróci jeśli
    • usuniesz implements WindowListener
    • usuniesz
public void windowClosing(WindowEvent evt){
        System.exit(0);
}        
       
public void windowClosed(WindowEvent evt){
}
public void windowOpened(WindowEvent evt){
       
}
public void windowIconified(WindowEvent evt){
       
}
public void windowDeiconified(WindowEvent evt){
       
}
public void windowActivated(WindowEvent evt){
       
}
public void windowDeactivated(WindowEvent evt){
       
}

}
- dodasz (w konstruktorze klasy myRenderer)
serDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

(twoje rozwiązanie jest konieczne jeśli główne okno jest klasy Frame)
2. Jeśli nie korzystasz z menadżerów rozkładu, to musisz sam poprawnie ustalić rozmiar okna

    setSize(300,300); // obie liczby są zdecydowanie za małe
  1. Narysowałeś przyciski ale do żadnego z nich nie podpiąłeś żadnej akcji, obejrzyj jeszcze raz i starannie kod, który zamieścił @Karol86
0

Hey
Mam to samo. Skopiowałem kod ale nie działa. Co wcześniej powinnem zrobić? Pomóżcie mi to zrozumieć bo już nie wiem jak to zrobić :(

0

Dopasowałem do swoich gustów

import java.awt.*;
import java.awt.event.*;
import java.util.*;

import javax.swing.*;
import javax.swing.event.CellEditorListener;
import javax.swing.table.*;
import java.util.EventObject;

 
public class MojeRenderer extends JFrame
{
    DefaultTableModel tabModel1;
    JTable tabela;
    JTable b;
    //------------------------
    public static void main(String[] args)
    {
        new MojeRenderer();
    }
    //------------------------
    public MojeRenderer()
    {
        super("Kalendarz");
        setLayout(new BorderLayout(3,3));

        tabModel1=new DefaultTableModel()
        {
            public boolean isCellEditable(int x,int y) // tu zrobiłem zmianę istotną
            {
                if(y==1)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        };
        tabModel1.setColumnCount(7);
        tabModel1.setNumRows(6);
        tabela=new JTable(tabModel1);
        tabela.setRowHeight(32);//bylo 34
        tabela.setBorder(BorderFactory.createLineBorder(Color.black));

        for(int i=0;i<7;i++)
        {
            tabela.getColumnModel().getColumn(i).setPreferredWidth(100);
        }
        tabela.setValueAt("heyka",1,2);
        add(tabela,BorderLayout.CENTER);

        TableColumn td = tabela.getColumnModel().getColumn(1);

        MojRenderer mojRenderer = new MojRenderer();
        td.setCellRenderer(mojRenderer);
        MojEditor mojEditor = new MojEditor();
        td.setCellEditor(mojEditor);
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
}
//------------------------------------------------

class MojRenderer implements TableCellRenderer 
{
    public Component getTableCellRendererComponent(JTable table, Object value,
                                                   boolean isSelected, boolean hasValue, int row, int column) 
    {
        JButton b = new JButton("Przycisk");
        return b;
    }
}
//------------------------------------------------
class MojEditor implements TableCellEditor 
{
    public Component getTableCellEditorComponent(JTable table, Object value,
                                                 boolean isSelected, int row, int column) 
    {
         JButton b = new JButton("Przycisk");
         b.setActionCommand(""+(row+1));
         b.addActionListener(new ActionListener()
         {
            public void actionPerformed(ActionEvent evt)
            {
                 System.out.println("dziala - wiersz "+((JButton)evt.getSource()).getActionCommand());
            }
         });
         return b;
    }
    public void removeCellEditorListener(CellEditorListener cl) 
    {
    }
    public void addCellEditorListener(CellEditorListener cl) 
    {
    }
    public boolean shouldSelectCell(EventObject ev) 
    {
        return true;
    }
    public boolean isCellEditable(EventObject ev) 
    {
        return true;
    }
    public Object getCellEditorValue() 
    {
        return null;
    }
    public boolean stopCellEditing() 
    {
        return true;
    }
    public void cancelCellEditing() 
    {
    }
}

pozdrawiam

0

Hey
Wystarczyło zmienić żeby tabela była edytowalna [glowa] . Dziękuję bardzo.
Pozdrawiam i życzę zdrowych wesołych świąt.

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