Avatar billede javanybegynder Nybegynder
14. november 2005 - 12:42 Der er 10 kommentarer og
1 løsning

Problemer med JTabel

Hej!

Vi er ved at lave et vagtplanlægningsprogram i Java.
Vi er nu igang med at kode GUI. Vi overvejer at bruge JTabel til at vise vagtplanen, og har i den forbindelse nogle spørgsmål:
- Hvordan undgår man at kollonnerne kan flyttes rundt?
- Hvordan gør man cellerne skrivebeskyttede?
- Kan man skrive flere end én linje i en celle?

Håber der er nogle der kan hjælpe.
Med venlig hilsen 3 fortvivlede studerende.
Avatar billede mikkelbm Nybegynder
14. november 2005 - 13:04 #1
Avatar billede javanybegynder Nybegynder
14. november 2005 - 13:23 #2
Ja, det har vi kigget på, og det kan vi ikke rigtig finde hoved og hale i.
Vi har brug for nogle konkrete kodeeksempler...!
Dataene i tabellen henter vi fra en SQL database.
Avatar billede mikkelbm Nybegynder
14. november 2005 - 16:50 #3
Jeg laver lige et lille mere konkret eksempel, når jeg kommer hjem.
Avatar billede mikkelbm Nybegynder
14. november 2005 - 19:02 #4
Så fik jeg lidt tid:

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;

public class TestJTable extends JFrame
{
    public TestJTable ()
    {
        setSize (400, 400);
       
        String[] headers = {"Kolonne1", "Kolonne2"};
       
        Object[][] data = new Object[2][2];
        data[0][0] = "Data1";
        data[0][1] = "Data2";
        data[1][0] = "Data3";
        data[1][1] = "Data4";
       
        MyTableModel model = new MyTableModel (data, headers);
       
       
        JTable table = new JTable (model);
        table.getTableHeader().setReorderingAllowed(false);
       
        this.getContentPane().add(new JScrollPane (table));
    }
   
    private class MyTableModel extends DefaultTableModel
    {
        public MyTableModel (Object[][] data, Object[] headers)
        {
            super (data, headers);
        }
       
        public boolean isCellEditable (int row, int col)
        {
            if (col == 0)
                return true;
            else return false;
        }
    }
   
    public static void main (String[] args)
    {
        new TestJTable().setVisible (true);
    }
}


1) table.getTableHeader().setReorderingAllowed(false);
2) Lav egen TableModel og overskriv metoden isCellEditable
3) Ved jeg faktisk ikke lige, men det søger jeg lige på.
Avatar billede javanybegynder Nybegynder
15. november 2005 - 09:54 #5
Tak for hjælpen - det virker. Håber du kan give svar på det sidste spørgsmål, for det er det der afgør, om vi overhovedet skal bruge JTabel. Idéen er nemlig, at hver celle skal kunne indeholde et tidsinterval og et navn på 2 forskellige linjer. Hvis det ikke kan lade sig gøre, har du så en idé til hvad vi ellers kunne bruge...? (Du får dine point når du har svaret på spørgsmål 3...!)
Avatar billede mikkelbm Nybegynder
15. november 2005 - 10:00 #6
Jeg kigger på det. Men jeg får ikke tid før i aften.
Avatar billede mikkelbm Nybegynder
15. november 2005 - 19:59 #7
Så fandt jeg lidt der muligvis kan bruges:

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.table.*;
import javax.swing.border.*;

public class TestJTable extends JFrame
{
    public TestJTable ()
    {
        setSize (400, 400);
       
        int numberOfLines = 2;
       
        String[] headers = {"Kolonne1", "Kolonne2"};
       
        Object[][] data = new Object[2][2];
        data[0][0] = "Line1\nLine2";
        data[0][1] = "Line1\nLine2";
        data[1][0] = "Line1\nLine2";
        data[1][1] = "Line1\nLine2";
       
        MyTableModel model = new MyTableModel (data, headers);
       
       
        JTable table = new JTable (model);
        table.setRowHeight(table.getRowHeight() * numberOfLines);
        table.setDefaultRenderer(String.class, new MultiLineCellRenderer());
        table.getTableHeader().setReorderingAllowed(false);
       
        this.getContentPane().add(new JScrollPane (table));
    }
   
    private class MyTableModel extends DefaultTableModel
    {
        public MyTableModel (Object[][] data, Object[] headers)
        {
            super (data, headers);
        }
       
        public boolean isCellEditable (int row, int col)
        {
            return true;
        }
       
        public Class getColumnClass(int columnIndex)
        {       
            return String.class;     
        }
    }
   
   
    public class MultiLineCellRenderer extends JTextArea implements TableCellRenderer
    {
        public MultiLineCellRenderer()
        {
            setLineWrap(true);
            setWrapStyleWord(true);
            setOpaque(true);
        }
   
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
        {
            if (isSelected)
            {
                setForeground(table.getSelectionForeground());
                setBackground(table.getSelectionBackground());
            }
            else
            {
                setForeground(table.getForeground());
                setBackground(table.getBackground());
            }
                         
              if (hasFocus)
              {
                setBorder( UIManager.getBorder("Table.focusCellHighlightBorder") );
               
                if (table.isCellEditable(row, column))
                {
                    setForeground( UIManager.getColor("Table.focusCellForeground") );
                    setBackground( UIManager.getColor("Table.focusCellBackground") );
                }
            }
            else
            {
                setBorder(new EmptyBorder(1, 2, 1, 2));
            }
           
            setFont(table.getFont());
            setText((value == null) ? "" : value.toString());
            return this;
        }
    }


   
    public static void main (String[] args)
    {
        new TestJTable().setVisible (true);
    }
}


Det I skal lægge mærke til er, at I nu selv skal sørge for at "tegne" cellerne i en TableCellRenderer.
Avatar billede javanybegynder Nybegynder
16. november 2005 - 13:41 #8
Tusind tak for hjælpen, det virker helt perfekt :-)
Avatar billede javanybegynder Nybegynder
16. november 2005 - 13:43 #9
Hej
Avatar billede javanybegynder Nybegynder
16. november 2005 - 13:45 #10
Hej mikkelbm

Lidt pinligt, men vi kan ikke få den til at acceptere dit svar, er det noget du kender til?
Avatar billede javanybegynder Nybegynder
16. november 2005 - 13:46 #11
Hej

Vi fandt ud af det, værsgo'.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester