Avatar billede Erik_Steen Nybegynder
22. oktober 2014 - 16:09 Der er 4 kommentarer og
1 løsning

Java 8 med JTable giver problemer/Error

Java 8 med JTable giver problemer/Error

Jeg har installeret Java 8 (jdk-8u25-windows-i586.exe) med tilhørende jre fra Oracle.
Herefter kan jeg ikke anvende JTable i mine programmer.

Jeg anvender Windows 7 32 bit
Som udviklingsmiljø anvendes Eclipse 3.70 Indigo.
og som sagt jdk-8u25-windows-i586.exe

Følgende fejl får jeg:

import javax.swing.JTable;              Giver Error
import javax.swing.table.*;            Er Ok
JTable tableView = new JTable(sorter);  Giver Error uanset hvilken import der anvendes.


Når jeg læser dokumentationen (jdk-8u25-docs-all.zip) står der:

- at klassen "Class JTable" / "javax.swing.JTable" findes.
  (\jdk-8u25-docs-all\api\javax\swing\JTable.html)

- I afsnittet "\jdk-8u25-docs-all\api\index.html" står der:
  javax.swing.table  >>  Provides classes and interfaces for
  dealing with javax.swing.JTable.
  (og i dette afsnit er javax.swing.JTable ikke nævnt.)


Når jeg prøver Oracle demo-programmer (jdk-8u25-windows-i586-demos.zip) fåes følgende:

- For eksempel når jeg prøver programmet: TableExample3.java i
  "\jdk1.8.0_25 Demo\demo\jfc\TableExample\src.zip\" giver det
  fejl ved linien "JTable tableView = new JTable(sorter);"
  ligesom de øvrige eksempler giver fejl med JTable.


Er der nogle der har en løsning / workaround på ovennævnte problem.




For letheds skyld er nedenstående en kopi af TableExample3.java,
hvor linien "JTable tableView = new JTable(sorter);" giver fejl.

import javax.swing.*;
import javax.swing.table.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.Dimension;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.UIManager.LookAndFeelInfo;

/**
* An example showing the JTable with a dataModel that is not derived
* from a database. We add the optional TableSorter object to give the
* JTable the ability to sort.
*
* @author Philip Milne
*/
public class TableExample3 {

    public TableExample3() {
        JFrame frame = new JFrame("Table");
        frame.addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        // Take the dummy data from SwingSet.
        final String[] names = { "First Name", "Last Name", "Favorite Color",
            "Favorite Number", "Vegetarian" };
        final Object[][] data = {
            { "Mark", "Andrews", "Red", new Integer(2), Boolean.TRUE },
            { "Tom", "Ball", "Blue", new Integer(99), Boolean.FALSE },
            { "Alan", "Chung", "Green", new Integer(838), Boolean.FALSE },
            { "Jeff", "Dinkins", "Turquois", new Integer(8), Boolean.TRUE },
            { "Amy", "Fowler", "Yellow", new Integer(3), Boolean.FALSE },
            { "Brian", "Gerhold", "Green", new Integer(0), Boolean.FALSE },
            { "James", "Gosling", "Pink", new Integer(21), Boolean.FALSE },
            { "David", "Karlton", "Red", new Integer(1), Boolean.FALSE },
            { "Dave", "Kloba", "Yellow", new Integer(14), Boolean.FALSE },
            { "Peter", "Korn", "Purple", new Integer(12), Boolean.FALSE },
            { "Phil", "Milne", "Purple", new Integer(3), Boolean.FALSE },
            { "Dave", "Moore", "Green", new Integer(88), Boolean.FALSE },
            { "Hans", "Muller", "Maroon", new Integer(5), Boolean.FALSE },
            { "Rick", "Levenson", "Blue", new Integer(2), Boolean.FALSE },
            { "Tim", "Prinzing", "Blue", new Integer(22), Boolean.FALSE },
            { "Chester", "Rose", "Black", new Integer(0), Boolean.FALSE },
            { "Ray", "Ryan", "Gray", new Integer(77), Boolean.FALSE },
            { "Georges", "Saab", "Red", new Integer(4), Boolean.FALSE },
            { "Willie", "Walker", "Phthalo Blue", new Integer(4), Boolean.FALSE },
            { "Kathy", "Walrath", "Blue", new Integer(8), Boolean.FALSE },
            { "Arnaud", "Weber", "Green", new Integer(44), Boolean.FALSE }
        };

        // Create a model of the data.
        @SuppressWarnings("serial")
        TableModel dataModel = new AbstractTableModel() {
            // These methods always need to be implemented.

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

            public int getRowCount() {
                return data.length;
            }

            public Object getValueAt(int row, int col) {
                return data[row][col];
            }

            // The default implementations of these methods in
            // AbstractTableModel would work, but we can refine them.
            @Override
            public String getColumnName(int column) {
                return names[column];
            }

            @Override
            public Class getColumnClass(int col) {
                return getValueAt(0, col).getClass();
            }

            @Override
            public boolean isCellEditable(int row, int col) {
                return (col == 4);
            }

            @Override
            public void setValueAt(Object aValue, int row, int column) {
                data[row][column] = aValue;
            }
        };

        // Instead of making the table display the data as it would normally
        // with:
        // JTable tableView = new JTable(dataModel);
        // Add a sorter, by using the following three lines instead of the one
        // above.
        TableSorter sorter = new TableSorter(dataModel);
        JTable tableView = new JTable(sorter);
        sorter.addMouseListenerToHeaderInTable(tableView);

        JScrollPane scrollpane = new JScrollPane(tableView);

        scrollpane.setPreferredSize(new Dimension(700, 300));
        frame.getContentPane().add(scrollpane);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        // Trying to set Nimbus look and feel
        try {
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (Exception ex) {
            Logger.getLogger(TableExample3.class.getName()).log(Level.SEVERE,
                    "Failed to apply Nimbus look and feel", ex);
        }
        new TableExample3();
    }
}

Hilsen Erik Steen
Avatar billede arne_v Ekspert
23. oktober 2014 - 02:30 #1
JTable virker her med 1.8u25
Avatar billede Erik_Steen Nybegynder
23. oktober 2014 - 16:36 #2
Har nu prøvet at installerer Eclipse M1
(eclipse-standard-mars-M1-win32.zip)
og  Java 8 (jdk-8u25-windows-i586.exe)
med tilhørende jre fra Oracle.

Her virker JTable i eksemplet TableExample3.java
"\jdk1.8.0_25 Demo\demo\jfc\TableExample\src.zip\"

Underligt at det skal være Editoren der bestemmer om Java virker.

NB: Men alle tidligere .jar-filer hvor der er anvendt Java 7 og
    JTable skal genereres igen, da de ikke kan køre med Java 8
    Runtimer.
Avatar billede arne_v Ekspert
23. oktober 2014 - 19:40 #3
Principielt afhaenger det kun af Java versionen og ikke af IDE versionen.

Men du skal bruge Eclipse 4.4+ for at kunne bruge nye features i Java 8.

Du burde kunne bruge aeldre Eclipse med Java 8 saa lanege du ikke bruger features som er nye i Java 8.

Men Eclipse 3.7 er gammel (2011) og der er tilsyneladende et problem.

Du boer helt klart brugee Eclipse 4.4.

4.5M1 er beta.
Avatar billede Erik_Steen Nybegynder
23. oktober 2014 - 22:31 #4
Java 8 er ikke bagud kompatibel med Java 7.

Hvis man opgraderer til Java 8 er der flere steder man skal
ændre i sin kode for at den virker.
Det gælder JTable, JDBC/ODBC mm.

Opgraderer man til Java 8 skal man ligeledes opgraderer sin
editor så den er kompatibel med Java 8.

Hvis man har lavet nogle .jar filer i fx. Java 7 skal de alle
genereres igen med Java 8.

men, det er jo meget normalt, at der skal ændringer til når man
opgraderer til en ny stor release og det gælder ikke kun for Java.

Erik Steen
Avatar billede arne_v Ekspert
05. november 2014 - 04:12 #5
Java 8 er stort set bagudkompatibel med Java 7. Der er en liste over potentielle problemer her:

http://www.oracle.com/technetwork/java/javase/8-compatibility-guide-2156366.html

Sandsynligheden for at man skal ændre i sin egen kode er meget lille.

JTable er ikke naevnt i ovenstaaende liste over bagud kompabilitets problemer.

JDBC-ODBC bridge er fjernet i Java 8. Det blev annonceret for 3 aar siden. Og i mere end 10 aar har dokumentationen klart sagt at den var en midlertidig loesning.

Hvis man vil bruge ny sprog funktionalitet skal man have en IDE som understoetter Java 8. Tilsyneladende er der ogsaa problemer med en 3 aar gammel Eclipse selvom man ikke bruger nye features i Java 8. Den slags bliver sjaeldent opdaget, da langt de fleste opdaterer deres Eclipse (ny Eclipse understoetter nemlig gammel Java).

Jar filer bygget med Java 7 virker stadig med Java 8.
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

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