[java] getselectedrow() bij JTable werkt niet

Pagina: 1
Acties:

  • Goldme
  • Registratie: September 2000
  • Laatst online: 29-08 13:40
Ik gebruik JTable voor het tonen van een aantal resultaten, een gebruiker kan een rij aanklikken in de tabel en aan de hand van het nummer van dat rij kan ik weer verder werken.

JTable heeft voor die actie de methode: getSelectedRow wat de index van de geselcteerde rij bevat. Echter, dit werkt helemaal niet bij mij. Als ik een rij selecteer en vervolgens controleer op de geselecteerde index blijkt het -1 te zijn, oftewel: er is niks geselecteerd.

Als ik een rij in de tabel aanklik dan verandert de rij in een paarse kleur(dat is toch geselecteerd in swing?) en ik kan de waarden editen(wil ik niet hebben, hoe kan ik dit uitschakelen?) door nog een keer op die cel te drukken. Moet ik een aantal opties inschakelen of iets dergelijks binnen JTable?

Ik moet zeggen dat swing er mooi uitziet maar die omslachtigheid ervan(werken met models) is om te kotsen.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

een lang voorbeeld :) hierin zie je hoe je een model kunt gebruiken, en per row kan aangeven of iets editable is. Al mijn table models die lijken op dit model. Hoop dat je er iets mee kan. Oja.. aan de hand van die getColumnClass kan je instellen wat voor componentje je wilt gebruiken. Je kunt ook een combobox of checkbox ed erin plaatsen.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
final class ColumnTableModel extends AbstractTableModel
{
    private final String[] columnNames = {"Name","SQLName","Type","Primary Key","View"};
    private final static int MAPPED_NAME_INDEX=0;
    private final static int REAL_NAME_INDEX=1;
    private final static int TYPE_INDEX=2;
    private final static int IS_PRIMARY_KEY_INDEX=3;
    private final static int HAS_VIEW_INDEX=4;
    

    private Table    table=null;
    private Component component=null;
    private ColumnList columnList = null;
    
    public ColumnTableModel(Table table,Component component)
    {
          this.table = table;
        this.component = component;
        columnList = table.getColumnList();
    }

    public int getRowCount()
    {
        return columnList.size();
    }

    public int getColumnCount()
    {
           return columnNames.length;
    }

    public String getColumnName(int column)
    {
        return columnNames[column];
    }

    public Class getColumnClass(int c)
    {
        return getValueAt(0, c).getClass();
    }

    public boolean isCellEditable(int nRow, int nCol)
    {
        boolean editable = false;
        
        switch (nCol)
        {
            case MAPPED_NAME_INDEX:
                editable = true;
                break;
            case HAS_VIEW_INDEX:
                editable = true;
                break;
            case IS_PRIMARY_KEY_INDEX:
                editable = true;
                break;
        }

        return editable;
    }

    public Object getValueAt(int nRow, int nCol)
    {
        if (nRow < 0 || nRow >= getRowCount())
            return "";

        Column column = columnList.get(nRow);
        
        Object answer = null;
        switch (nCol)
        {
            case REAL_NAME_INDEX:
                answer = column.getRealColumn().getName();
                break;
            case MAPPED_NAME_INDEX:
                answer = column.getMappedName();
                break;
                case TYPE_INDEX:
                answer = column.getType().getName();
                break;
            case IS_PRIMARY_KEY_INDEX:
                answer = new Boolean(column.isPrimaryKey());
                break;
            case HAS_VIEW_INDEX:
                answer = new Boolean(column.isView());
                break;
            default:
                answer = "should not happen";
         }
        
        return answer;
    }

    
    public void setValueAt(Object value, int nRow, int nCol)
    {
        if (nRow < 0 || nRow>=getRowCount())
            return;
        
        Column column = columnList.get(nRow);

        switch (nCol)
        {
            case MAPPED_NAME_INDEX:
                try
                {
                    column.setMappedName((String)value);
                    JOptionPane.showMessageDialog(component, "Mapped name has been altered", "Column", JOptionPane.INFORMATION_MESSAGE);
                }
                catch(AbstractMultiDatabaseException e)
                {
                    JOptionPane.showMessageDialog(component, e.getMessage(), "", JOptionPane.ERROR_MESSAGE);
                }
                break;
            case HAS_VIEW_INDEX:
                column.setView(((Boolean)value).booleanValue());
                break;
            case IS_PRIMARY_KEY_INDEX:
                try
                {
                    column.setIsPrimaryKey(((Boolean)value).booleanValue());
                }
                catch(ColumnException e)
                {
                    JOptionPane.showMessageDialog(component, e.getMessage(), "", JOptionPane.ERROR_MESSAGE);
                }
                break;
        }
    }
}

  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
Op dinsdag 27 november 2001 14:54 schreef Goldme

Ik moet zeggen dat swing er mooi uitziet maar die omslachtigheid ervan(werken met models) is om te kotsen.
MVC !(en nee niet c compiler van microsoft)
Het delen van een probleem in een model een view en een controle is juist een erg mooi ontwerp principe.
IMHO

Wat niet kan is nog nooit gebeurd


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Goldme: Ik moet zeggen dat swing er mooi uitziet maar die omslachtigheid ervan(werken met models) is om te kotsen.
Ga je mond spoelen ;) . Zoals al genoemd heeft Swing een soort MVC design. Dit lijkt als je voor het eerst iets simpels maakt, misschien lastig, maar als je goed bezig gaat met userinterfaces wordt het juist erg makkelijk.

Je kunt door het MVC model in Swing generieker werken. Je kunt voorkomen dat je vastlegt dat data een bepaalde GUI moet hebben. Je kunt dezelfde data in verschillende componenten laten zien. Je kunt data in modellen makkelijker verbinden. Je hoeft niet expliciet de GUI aan te passen als je data verandert enz. enz.

Prachtig systeem dus :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment