Jbutton in Jtabel

Status
Niet open voor verdere reacties.

evelien0123

Nieuwe gebruiker
Lid geworden
2 nov 2009
Berichten
3
hallo, ik ben een studente in de elektronica-ict
en voor het vak informatica moeten we een netwerk programma maken,
nu wil ik mijn netwerk programma laten uitlezen in een Jtabel, en in die Jtabel wil
ik 2 knophandlers nl de knop " info op halen" en " verbinding maken met server"
maar ik weet totaal niet hoe je een knophandler in een Jtabel krijgt zou iemand me willen helpen
hieronder vind je al mijn voorlopige code ...
dank je wel !!
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.table.*; 
// eventueel extra imports hier

public class Oefening3 extends JFrame {  
    
    public static void main(String[] argumentenRij) {
       JFrame frame = new Oefening3();
       frame.setSize(600,600);
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.setTitle("Oefening3");
         // naam aanpassen als je Paneel van naam wijzigt !!!
       Paneel paneel = new Paneel();
       frame.setContentPane( paneel );
       frame.setVisible(true);    	
    }
}

class Paneel extends JPanel {
    // declaraties van de variabelen, schrap wat je niet gebruikt 
//----- hulp bij opstellen tabel -----------

	private JScrollPane scrollPane;
	private JTable tabel;

	
/////////////////////////////////////////////////////////////////////////////
    // Constructor
  public Paneel() {


	int rows = 6;
    int cols = 2;
    tabel = new JTable(rows, cols);
 
       DefaultTableModel model = new DefaultTableModel();
    JTable tabel = new JTable(model);
    
    // Create 2 columns
    model.addColumn("beschrijving");
    model.addColumn("informatie");
    model.addRow(new Object[]{"temperatuur", "v2"});
    model.addRow(new Object[]{"windsnelheid", "v2"});
    model.addRow(new Object[]{"luchtdruk", "v2"});
    model.addRow(new Object[]{"regenval", "v2"});
    model.addRow(new Object[]{"tekstvak", "info op halen"});
	model.addRow(new Object[]{"verbinding maken met server", "led of server aan of uit is"});
	
	int rowIndex = 4;
    int vColIndex = 1;
    
    Object o = tabel.getValueAt(rowIndex, vColIndex);
    System.out.println(o);
    
  

        setBackground(Color.blue);
        
    
        tabel.setRowHeight(75);
       
        tabel.setBackground(Color.yellow);
        tabel.setPreferredScrollableViewportSize(new Dimension(500, 450));
        tabel.setFillsViewportHeight(true);
        add( tabel );   
        scrollPane = new JScrollPane(tabel);
        add(scrollPane);
 	
}     
}
 
Laatst bewerkt door een moderator:
Als je een knop in je JTable wilt hebben, kan dat wel. maar dit is niet echt voor een beginner. ;)

Dus als het even kan zal ik voor kiezen om je knoppen onder de tabel te zetten.. Een knop handler kan je eenvoudigste zo doen...

Code:
JButton knop = new JButton("Knop");
knop.addActionListener(new ActionListener() {

	public void actionPerformed(ActionEvent e) {
		// hier je code...	
	}

});

Als je je knop echt in een JTable wilt hebben, dan zal ik wel voorbeeld programma in elkaar sleutelen...
 
Als je een knop in je JTable wilt hebben, kan dat wel. maar dit is niet echt voor een beginner. ;)

Dus als het even kan zal ik voor kiezen om je knoppen onder de tabel te zetten.. Een knop handler kan je eenvoudigste zo doen...

Code:
JButton knop = new JButton("Knop");
knop.addActionListener(new ActionListener() {

	public void actionPerformed(ActionEvent e) {
		// hier je code...	
	}

});

Als je je knop echt in een JTable wilt hebben, dan zal ik wel voorbeeld programma in elkaar sleutelen...

hey hey
als je even tijd zou hebben, zou je toch eens een voorbeeldprogramma in elkaar kunnen knutselen, ik heb al een paar voorbeelden op internet gevonden maar die geven telken compileer fouten, mocht je de tijd niet vinden, niet erg hoor, ben al blij dat je wou helpen
liefs
evelien
 
Heb even voor je gekeken, maar kreeg het niet zo snel voor elkaar.
Toen ik de JButton in de JTabel zette kreeg ik een String terug, dus dat was niet de oplossing. Toen ben ik maar even gaan Google'en en zag dat een JTableCell alleen Strings laat zien. Het is overigens wel mogelijk, maar dan verwijs ik je door naar deze site.
Dit gaat mij te veel tijd kosten om het uit te zoeken, maar hij legt het wel duidelijk uit naar mijn mening.
Mocht je straks toch in de problemen komen laat dat dan even weten met code wat je tot dusver bereikt hebt.

Mvg,

T-J
 
Het duurde even, maar ik heb een werkende versie...

Eerst wat code om een table aan te maken.

Code:
package javaapplication35;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class Main {

    public static void main(String[] args) {
        final JFrame f = new JFrame();
        f.getContentPane().add(new TabelPanel());
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocationByPlatform(true);
        f.pack();
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                f.setVisible(true);
            }
        });
    }

    public static class TabelPanel extends JPanel {

        private TabelPanel() {

            Action action1 = new AbstractAction("Knop 1") {
                public void actionPerformed(ActionEvent e) {
                    JOptionPane.showMessageDialog(TabelPanel.this, "knop 1 ingedrukt");
                }
            };
            Action action2 = new AbstractAction("Knop 2") {
                public void actionPerformed(ActionEvent e) {
                    JOptionPane.showMessageDialog(TabelPanel.this, "knop 2 ingedrukt");
                }
            };

            //vul tableModel
            final DefaultTableModel tableModel = new DefaultTableModel();
            tableModel.addColumn("kolom 1");
            tableModel.addColumn("kolom 2");
            tableModel.addRow(new Object[]{"tekst 1", action1});
            tableModel.addRow(new Object[]{"tekst 2", action1});
            tableModel.addRow(new Object[]{action2,"nog een tekst"});

            //gebruik de speciale ActiontTable ipv JTable
            final JTable table = new ActionTable(tableModel);
            final JScrollPane scrollPane = new JScrollPane(table);

            this.add(scrollPane, BorderLayout.CENTER);

        }
    }
}

Nu het belangrijkste stuk. Deze ActionTable is uitbreiding op de standaard JTable.
Een JTable gebruikt een normaal JLabel om een cel te tekenen. Maar deze versie gebruikt JButton als in de TableModel een Action tegenkomt.

Om te zien of je een button klikt is er een extra MouseListener toegevoegd, deze controleert of je een cell met button hebt geklikt en zal dan de doClick() van deze button aanropenen..

De knop is niet echt netjes getekend, dit kan je aanpassen in de cellRenderer.

Code:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication35;

import java.awt.Component;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;

/**
 *
 * @author pdekker
 */
public class ActionTable extends JTable {

    private ActionCellRenderer actionRenderer = new ActionCellRenderer();

    public ActionTable(TableModel dm) {
        super(dm);
        addMouseListener(new ActionMouseListener());
    }

    @Override
    public TableCellRenderer getCellRenderer(int row, int column) {
        return isCellButton(row, column) ? actionRenderer : super.getCellRenderer(row, column);
    }

    @Override
    public boolean isCellEditable(int row, int column) {
        return !isCellButton(row, column);  //Cellen met button moeten altijd non-editable zijn.
    }

    private boolean isCellButton(int row, int column) {
        Object obj = getModel().getValueAt(row, column);
        return (obj instanceof Action);
    }

    private void cellButtonEvent(MouseEvent mouseEvent) {
        Point p = new Point(mouseEvent.getX(), mouseEvent.getY());
        int row = rowAtPoint(p);
        int col = columnAtPoint(p);
        if (row < 0 || col < 0 || row >= getRowCount() || col > getColumnCount()) {
            return;
        }
        if (isCellButton(row, col)) {
            TableCellRenderer renderer = getCellRenderer(row, col);
            if (renderer instanceof JButton) {
                JButton knop = (JButton) renderer;
                knop.doClick();
            }
        }
    }

    private class ActionCellRenderer extends JButton implements TableCellRenderer {

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus,
                int row, int column) {

            this.setAction((Action) value);
            return this;
        }
    }

    private class ActionMouseListener extends MouseAdapter {

        @Override
        public void mouseClicked(MouseEvent e) {
            ActionTable.this.cellButtonEvent(e);
        }
    }
}
 
Het duurde even, maar ik heb een werkende versie...

Eerst wat code om een table aan te maken.

Code:
package javaapplication35;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class Main {

    public static void main(String[] args) {
        final JFrame f = new JFrame();
        f.getContentPane().add(new TabelPanel());
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocationByPlatform(true);
        f.pack();
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                f.setVisible(true);
            }
        });
    }

    public static class TabelPanel extends JPanel {

        private TabelPanel() {

            Action action1 = new AbstractAction("Knop 1") {
                public void actionPerformed(ActionEvent e) {
                    JOptionPane.showMessageDialog(TabelPanel.this, "knop 1 ingedrukt");
                }
            };
            Action action2 = new AbstractAction("Knop 2") {
                public void actionPerformed(ActionEvent e) {
                    JOptionPane.showMessageDialog(TabelPanel.this, "knop 2 ingedrukt");
                }
            };

            //vul tableModel
            final DefaultTableModel tableModel = new DefaultTableModel();
            tableModel.addColumn("kolom 1");
            tableModel.addColumn("kolom 2");
            tableModel.addRow(new Object[]{"tekst 1", action1});
            tableModel.addRow(new Object[]{"tekst 2", action1});
            tableModel.addRow(new Object[]{action2,"nog een tekst"});

            //gebruik de speciale ActiontTable ipv JTable
            final JTable table = new ActionTable(tableModel);
            final JScrollPane scrollPane = new JScrollPane(table);

            this.add(scrollPane, BorderLayout.CENTER);

        }
    }
}

Nu het belangrijkste stuk. Deze ActionTable is uitbreiding op de standaard JTable.
Een JTable gebruikt een normaal JLabel om een cel te tekenen. Maar deze versie gebruikt JButton als in de TableModel een Action tegenkomt.

Om te zien of je een button klikt is er een extra MouseListener toegevoegd, deze controleert of je een cell met button hebt geklikt en zal dan de doClick() van deze button aanropenen..

De knop is niet echt netjes getekend, dit kan je aanpassen in de cellRenderer.

Code:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication35;

import java.awt.Component;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;

/**
 *
 * @author pdekker
 */
public class ActionTable extends JTable {

    private ActionCellRenderer actionRenderer = new ActionCellRenderer();

    public ActionTable(TableModel dm) {
        super(dm);
        addMouseListener(new ActionMouseListener());
    }

    @Override
    public TableCellRenderer getCellRenderer(int row, int column) {
        return isCellButton(row, column) ? actionRenderer : super.getCellRenderer(row, column);
    }

    @Override
    public boolean isCellEditable(int row, int column) {
        return !isCellButton(row, column);  //Cellen met button moeten altijd non-editable zijn.
    }

    private boolean isCellButton(int row, int column) {
        Object obj = getModel().getValueAt(row, column);
        return (obj instanceof Action);
    }

    private void cellButtonEvent(MouseEvent mouseEvent) {
        Point p = new Point(mouseEvent.getX(), mouseEvent.getY());
        int row = rowAtPoint(p);
        int col = columnAtPoint(p);
        if (row < 0 || col < 0 || row >= getRowCount() || col > getColumnCount()) {
            return;
        }
        if (isCellButton(row, col)) {
            TableCellRenderer renderer = getCellRenderer(row, col);
            if (renderer instanceof JButton) {
                JButton knop = (JButton) renderer;
                knop.doClick();
            }
        }
    }

    private class ActionCellRenderer extends JButton implements TableCellRenderer {

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus,
                int row, int column) {

            this.setAction((Action) value);
            return this;
        }
    }

    private class ActionMouseListener extends MouseAdapter {

        @Override
        public void mouseClicked(MouseEvent e) {
            ActionTable.this.cellButtonEvent(e);
        }
    }
}

oké heel erg bedankt ze
kga mij daar nu eens in verdiepen
merci ze
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan