Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Programmeren

JAVA: JTable vraagje

Rob van Esch
11 antwoorden
  • Ik heb een vraag over het gebruik van de JTable.

    Als ik deze code uitvoer, dan krijg ik netjes een scherm te zien met daarin de tabel. Ik wil dat wanneer ik op een rij klik, de hele rij geselecteerd wordt, en niet alleen 1 cell zoals dat nu het geval is. Mijn vraag is of dit kan, en zo ja hoe.

    Alvast bedankt,

    Rob

    [code:1:496c889bde]
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.table.*;

    public class Table extends JFrame implements ActionListener{

    public JTable table;

    public static void main(String[] args){
    Table table = new Table();
    table.setResizable(false);
    table.setSize(800,600);
    table.setVisible(true);
    }

    public Table(){
    getContentPane().setLayout(new BorderLayout());
    String dataValues[][]={
    { "12", "234", "67" },
    { "-123", "43", "853" },
    { "93", "89.2", "109" },
    { "279", "9033", "3092" }
    };

    String columnNames[] = { "Column 1", "Column 2", "Column 3" };


    DefaultTableModel data = new DefaultTableModel(dataValues, columnNames){
    public boolean isCellEditable(int row, int column)
    {
    return false;
    }
    };

    table = new JTable( data );
    ListSelectionModel lsm = table.getSelectionModel();
    lsm.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);

    JScrollPane scrollPane = new JScrollPane( table );
    getContentPane().add( scrollPane, BorderLayout.CENTER );

    JButton button = new JButton("Go");
    button.addActionListener(this);
    getContentPane().add( button, BorderLayout.SOUTH );
    }

    public void actionPerformed(ActionEvent e) {
    System.out.println(table.getValueAt(table.getSelectedRow() , table.getSelectedColumn()));
    }
    }
    [/code:1:496c889bde]
  • hm, bij mij wordt juist steeds een hele rij geselecteerd, maar wanneer ik op Go druk, wordt alleen de waarde van de laatst geklikte cel geprint.
    Wat je allemaal met een JTAble kan (oa (automatisch) rijen selecteren, kolommen, waarden opvragen) kan je hier vinden.

    Als t daar niet mee lukt, laat je t nog maar even weten
  • Bedankt voor de snelle reactie. De API van Java had ik natuurlijk al bekeken. Alleen deze class heeft zoveel mogelijkheden dat ik niet weet welke te gebruiken.

    Ik wil een zelfde effect al bijvoorbeeld in Outlook hebben. Dat je 1 komplete regel selecteerd. waarin in verschillende kolommen wat data staan. Zoals onderwerp afzender etc.

    Als je goed kijkt naar de tabel dan zie je dat de cell waar je op klikt nog een selectie rand extra krijgt. Deze selectierand wil ik over de hele trij hebben. Of is dit niet mogelijk?

    Alvast bedankt.

    Rob
  • ik weet zo niet of t mogelijk is, als t dat is zal t ergens bij de eerder gegeven link staan. Volgens mij moet je iets doen met "ListSelectionModel"

    Ik zal er vanavond nader naar kijken

    Groet, Marien
  • Ik heb nog ff wat gezocht, maar ik krijg t niet voor elkaar dat dat "selectie-randje" over een hele rij gebeurt, of helemaal niet. Hopelijk kan je zelf iets vinden?
  • Gelukt.

    Met een custom cell renderer krijg je het voor elkaar. Indien iemand geintereseerd is in de code, dan zal ik hem nog even posten. In ieder geval bedankt voor het meedenken.

    Rob
  • ik ben wel geinteresseerd in de code ja
    Hartelijk dank!
  • Bij deze dan.
    [code:1:7f41ea6c38]
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.table.*;
    import javax.swing.border.*;
    import java.util.*;
    public class Table extends JFrame implements ActionListener{
    class MyTableCellRenderer extends DefaultTableCellRenderer{

    public static final int LEFT_CELL = 0;
    public static final int MIDDLE_CELL = 1;
    public static final int RIGHT_CELL = 2;
    //final Border blueBorder = BorderFactory.createLineBorder(Color.blue);
    Border borderStyle;

    MyTableCellRenderer(int Place, Color forcol){



    if ( Place == LEFT_CELL ){
    borderStyle = BorderFactory.createMatteBorder(1,1,1,0, forcol );
    }
    if ( Place == MIDDLE_CELL ){
    borderStyle = BorderFactory.createMatteBorder(1,0,1,0, forcol );
    }
    if ( Place == RIGHT_CELL ){
    borderStyle = BorderFactory.createMatteBorder(1,0,1,1, forcol );
    }
    }

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col){
    super.getTableCellRendererComponent( table, value, isSelected, false, row, col);

    if( isSelected)
    setBorder( borderStyle);
    else
    setBorder(BorderFactory.createEmptyBorder());
    return this;
    }






    }
    public JTable table;

    public static void main(String[] args){
    Table table = new Table();
    table.setResizable(false);
    table.setSize(800,600);
    table.setVisible(true);
    }

    public Table(){
    getContentPane().setLayout(new BorderLayout());
    String dataValues[][]={
    { "12", "234", "67" },
    { "-123", "43", "853" },
    { "93", "89.2", "109" },
    { "279", "9033", "3092" }
    };

    String columnNames[] = { "Column 1", "Column 2", "Column 3" };


    DefaultTableModel data = new DefaultTableModel(dataValues, columnNames){
    public boolean isCellEditable(int row, int column)
    {
    return false;
    }
    };

    table = new JTable( data );

    ListSelectionModel selectionModel = table.getSelectionModel();
    selectionModel.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );

    TableColumnModel tcm = table.getColumnModel();
    tcm.setColumnMargin(0);

    TableCellRenderer renderer;
    TableColumn column;

    for ( int i =0; i < tcm.getColumnCount(); i ++ ){
    if ( i == 0 ){
    renderer = new MyTableCellRenderer( 0, new Color(90,130,191) );
    }
    else if ( i == tcm.getColumnCount() - 1 ){
    renderer = new MyTableCellRenderer( 2, new Color(90,130,191));
    }
    else{
    renderer = new MyTableCellRenderer( 1, new Color(90,130,191));
    }
    column = tcm.getColumn( i );
    column.setCellRenderer( renderer );
    }

    table.setShowVerticalLines( false );
    table.setShowHorizontalLines( false );

    JScrollPane scrollPane = new JScrollPane( table );
    getContentPane().add( scrollPane, BorderLayout.CENTER );

    JButton button = new JButton("Go");
    button.addActionListener(this);
    getContentPane().add( button, BorderLayout.SOUTH );


    }

    public void actionPerformed(ActionEvent e) {
    System.out.println(table.getValueAt(table.getSelectedRow() , table.getSelectedColumn()));
    }
    }
    [/code:1:7f41ea6c38]

    Groeten Rob
  • hartelijk dank. Leuk om te zien dat je er zelf uit bent gekomen.
    Ik vind t wel jammer dat de cellen nu geen border meer hebben. Ik krijg m wel aan, maar dan wordt-ie wit ipv zwart.
  • De kleur van de border kun je gewoon zelf instellen, als je het grid terug wil, verander je de twee regels
    [code:1:d007db0c59]
    table.setShowVerticalLines( false );
    table.setShowHorizontalLines( false );
    [/code:1:d007db0c59] in

    [code:1:d007db0c59]
    table.setShowVerticalLines( true );
    table.setShowHorizontalLines( true );
    [/code:1:d007db0c59]

    Rob
  • dom, helemaal over heen gelezen :oops:

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.