Problem mit JTree und JTable

Status
Nicht offen für weitere Antworten.

Rave

Bekanntes Mitglied
Hallo,
Ich versuche schon seit 2 Tagen unter meinem JTree und JTable Platz zu bekommen. Also ich möchte das unter den beiden Noch ca ein Bereich von 100Pixel frei bleibt wo ich z.B. Buttons einfügen kann !!!

Hier der Code:
Java:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import javax.swing.tree.*;
//import javazoom.jl.player.Player;
import javax.media.*;

public class MP3Player extends JFrame implements KeyListener, MouseListener, TreeSelectionListener {

    // Anfang Attribute
    private File[] mp3Files;
    private File directory;
    private Player player;
    private DefaultMutableTreeNode root;
    private final TreeTablePanel treeTablePanel;
    private final JTree tree;
    
    float laut=1.0f;
    // Ende Attribute

    public MP3Player() {
        this.setTitle("MP3 Player");
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setSize(850, 500);
        this.setLocationRelativeTo(null);
        setLayout(new GridLayout());
        this.directory = new File("music/");
        if (!directory.isDirectory()) {
            directory.mkdir();
            System.err.println("Dies ist kein Verzeichnis: " + directory);
        }
        mp3Files = readDirectory();
        // Anfang Komponenten
        DefaultTreeModel model = new DefaultTreeModel(createTree(directory));
        treeTablePanel = new TreeTablePanel(this, model, null);
        treeTablePanel.setBorder(BorderFactory.createTitledBorder("Your Music: "));
        tree = treeTablePanel.addTreeSelectionListener(this);
        tree.setSelectionRow(1);
        add(treeTablePanel, BorderLayout.CENTER);
        this.setVisible(true);

        addKeyListener(this);
        addMouseListener(this);

        laut = 1.0f;
        // Ende Komponenten
    }

    // Anfang Methoden
    private File[] readDirectory() {
        File[] files = directory.listFiles(new FileFilter() {

            @Override
            public boolean accept(File currentFile) {
                return currentFile.getName().toLowerCase().endsWith(".mp3");
            }
        });
        return files;
    }

    public static void main(String[] args) {
        new MP3Player();
    }

    public void valueChanged(TreeSelectionEvent e) {
        TreePath selectionPath = tree.getSelectionPath();
        if (selectionPath == null) {
            return;
        }
        Object comp = selectionPath.getLastPathComponent();
        TableNode node = (TableNode) ((DefaultMutableTreeNode) comp).getUserObject();
        String path = node.getDataRow().get(0).toString();
        File mp3ToPlay = new File(path);
        if (!mp3ToPlay.exists() || !mp3ToPlay.isFile()) {
            return;
        }
        if (player != null) {//javax.media.Player
            player.stop();
        }
        this.play(mp3ToPlay);
    }

    private void play(File mp3) {
        try {
            player = Manager.createRealizedPlayer(mp3.toURI().toURL());//javax.media.Player
//            BufferedInputStream input = new BufferedInputStream(new FileInputStream(mp3));
//            player = new Player(input);
        } catch (Exception e) {
            System.out.println("Error: " + e);
        }

        Thread playInBackground = new Thread() {

            @Override
            public void run() {
                try {
                    player.start();//javax.media.Player
                    player.getGainControl().setLevel(laut);
//                    player.play();
//                    player.close();
                } catch (Exception e) {
                    System.out.println(e);
                }
            }
        };
        playInBackground.start();
    }

    private DefaultMutableTreeNode createTree(File directory) {
        // create root node and add more nodes
        root = new DefaultMutableTreeNode(new TableNode(directory.getName(), directory.getPath(), null));
        load(root);
        return root;
    }

    private void load(DefaultMutableTreeNode node) {
        TableNode n = (TableNode) node.getUserObject();
        String path = n.getDataRow().get(0).toString();
        File f = new File(path);
        if (f.isDirectory()) {
            mp3Files = f.listFiles();
            for (File file : mp3Files) {
                DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(
                        new TableNode(file.getName(), file.getPath(), file.length()));
                if (file.isDirectory()) {
                    node.add(newNode);
                    load(newNode);
                } else {
                    node.add(newNode);
                }
            }
        }

    }
    public void keyPressed(KeyEvent e)
  {
    System.out.println("User pressed key " + e.getKeyCode());
  }

  public void keyReleased(KeyEvent e)
  {
         System.out.println("User released key " + e.getKeyCode());
  }

  public void keyTyped(KeyEvent e)
  {
         System.out.println("User typed key " + e.getKeyCode());
  }
   public void mouseClicked(MouseEvent e)
  {
    int x=e.getX();
    int y=e.getY();
    System.out.println("Maus at "+x+"   "+y);

  }



  public void mouseEntered(MouseEvent e)
  {
    System.out.println("User clicked mouse " + e.getClickCount() + " times!");
  }

  public void mouseExited(MouseEvent e)
  {

  }

  public void mousePressed(MouseEvent e)
  {

  }

  public void mouseReleased(MouseEvent e)
  {

  }

  public void mouseMoved(MouseEvent e)
  {
  }

  public void mouseDragged(MouseEvent e)
  {
  }

    // Ende Methoden
}

/** JTable that has different renderers depending on the classes in TreeModel */
class Table extends JTable {

    void registerRenderers() {
//        setDefaultRenderer(Color.class, new TableColorRenderer(Color.WHITE));
    }

    public Table() {
        super();
        registerRenderers();
    }

    public Table(TableModel dm) {
        super(dm);

        registerRenderers();
    }

    public Table(TableModel dm, TableColumnModel cm) {
        super(dm, cm);

        registerRenderers();
    }

    @Override
    public TableCellRenderer getCellRenderer(int row, int column) {
        Object value = getModel().getValueAt(row, column);
        if (value == null) {
            value = "";
        }
        /** enable to have custom renderers depending on class of cell */
        TableCellRenderer tcr = getDefaultRenderer(value.getClass());

        return tcr;
    }

    @Override
    public Rectangle getCellRect(int row, int column, boolean includeSpacing) {
        Rectangle sRect = super.getCellRect(row, column, includeSpacing);
        if ((row < 0) || (column < 0) ||
                (getRowCount() <= row) || (getColumnCount() <= column)) {
            return sRect;
        }
        int index = 0;
        int columnMargin = getColumnModel().getColumnMargin();
        Rectangle cellFrame = new Rectangle();
        if (column > 0 && shouldCombineCells(row)) {
            return cellFrame;
        }
        int aCellHeight = rowHeight;
        cellFrame.y = row * aCellHeight;
        cellFrame.height = aCellHeight;

        Enumeration enumeration = getColumnModel().getColumns();
        while (enumeration.hasMoreElements()) {
            TableColumn aColumn = (TableColumn) enumeration.nextElement();
            cellFrame.width = aColumn.getWidth() + columnMargin;
            if (index == column) {
                break;
            }
            cellFrame.x += cellFrame.width;
            index++;
        }
        while (enumeration.hasMoreElements() && shouldCombineCells(row)) {
            TableColumn aColumn = (TableColumn) enumeration.nextElement();
            cellFrame.width += aColumn.getWidth() + columnMargin;
        }
        if (!includeSpacing) {
            Dimension spacing = getIntercellSpacing();
            cellFrame.setBounds(cellFrame.x + spacing.width / 2,
                    cellFrame.y + spacing.height / 2,
                    cellFrame.width - spacing.width,
                    cellFrame.height - spacing.height);
        }
        return cellFrame;
    }

    private boolean shouldCombineCells(int row) {
        TableAdapter model = (TableAdapter) getModel();
        JTree tree = model.getTree();
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getPathForRow(row).getLastPathComponent();
        return node.getLevel() < 1;
    }
}
/*
JTree already has a good data model (DefaultTreeModel), and it's easier
to implement an adapter that simply puts a TableModel on top of the TreeModel,
rather than to implement JTree renderers in a  JTable and work around the API
to achieve correct displays.

The class "TableAdapter" puts an AbstractTableModel on top of DefaultTreeModel
which is suggested by Swing for a JTree. The TableModel consists of the
dataRow vector from "TableNode". The TableAdapter is also responsible for
firing updates on the table data in case the JTree is collapsed or expanded.
 */

class TableAdapter extends AbstractTableModel {

    private JTree tree;
    private JTable table;
    private int[] sel_rows;
    private ListSelectionListener selectionListener;
    private String[] columnNames = {"Path", "Size"};

    public TableAdapter(JTree t) {
        tree = t;

        tree.addTreeExpansionListener(new TreeExpansionListener() {

            public void treeExpanded(TreeExpansionEvent event) {
                fireTableDataChanged();
                select();
            }

            public void treeCollapsed(TreeExpansionEvent event) {
                fireTableDataChanged();
                select();
            }
        });
    }

    public void addTable(JTable t) {
        table = t;
        table.setBackground(Color.lightGray);

        tree.addTreeSelectionListener(new TreeSelectionListener() {

            public void valueChanged(TreeSelectionEvent e) {
                sel_rows = tree.getSelectionRows();
                select();
            }
        });
        selectionListener = new ListSelectionListener() {

            public void valueChanged(ListSelectionEvent e) {
                int row = table.getSelectedRow();
                tree.setSelectionRow(row);
                table.repaint();
            }
        };
        table.getSelectionModel().addListSelectionListener(selectionListener);

    }

    public JTree getTree() {
        return tree;
    }

    private void select() {
        if (sel_rows != null) {
            table.getSelectionModel().setSelectionInterval(sel_rows[0], sel_rows[0]);
        }
    }

    //assumes all nodes have same number of items as root node
    public int getColumnCount() {
        DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot();
        TableNode n = (TableNode) root.getUserObject();
        return n.getDataRow().size();
    }

    public int getRowCount() {
        return tree.getRowCount();
    }

    @Override
    public String getColumnName(int col) {
        return columnNames[col];
    }

    public Object getValueAt(int row, int col) {
        TreePath tPath = tree.getPathForRow(row);
        Object[] oPath = tPath.getPath();
        int len = oPath.length;
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) oPath[len - 1];
        TableNode treeNode = (TableNode) node.getUserObject();
        Vector dataRow = treeNode.getDataRow();

        return dataRow.elementAt(col);
    }

    @Override
    public void setValueAt(Object value, int row, int col) {
        TreePath tPath = tree.getPathForRow(row);
        Object[] oPath = tPath.getPath();
        int len = oPath.length;
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) oPath[len - 1];
        TableNode treeNode = (TableNode) node.getUserObject();
        Vector dataRow = treeNode.getDataRow();
        dataRow.setElementAt(value, col);
    }

    @Override
    public Class getColumnClass(int c) {
        DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot();
        TableNode n = (TableNode) root.getUserObject();
        return n.getDataRow().elementAt(c).getClass();
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }
}
/*
TreeModels contain DefaultMutableTreeNodes. Each DefaultMutableTreeNode
contains a UserObject for which we can easily create a class "TableNode"
having a String to be displayed in the JTree, and a vector of objects
to be displayed in the JTable.
 */

class TableNode {

    private String label;
    private Vector dataRow;

    public TableNode(String s, Object x, Object y) {
        label = s;
        dataRow = new Vector();
        dataRow.add(x);
        dataRow.add(y);
    }

    @Override
    public String toString() {
        return label;
    }

    public Vector getDataRow() {
        return dataRow;
    }
}

class TreeTablePanel extends JPanel implements TableModelListener {

    private JTree tree;
    private Rectangle selectedRowBounds;
    private Color selectionColor;
    private TableAdapter adapter;
    private Table table;
    private JSplitPane splitPane;
    private JTableHeader tableHeader;
    private JButton btAdd;
    private TreeTablePanel[] treeTablePanels;
    private Frame frame;
    private final JScrollPane scrollPane;

    public TreeTablePanel(Frame frame, DefaultTreeModel model, TreeTablePanel[] treeTablePanels) {
        super(new BorderLayout());
        this.frame = frame;
        this.treeTablePanels = treeTablePanels;
        tree = new JTree(model) {
            //Override paintComponent of JTree:

            @Override
            public void paintComponent(final Graphics g) {
                if (selectedRowBounds != null) {
                    //Set selection Color:
                    g.setColor(selectionColor);
                    //Draw selection rectangle using the width of JTree:
                    g.fillRect(0, (int) selectedRowBounds.getY(), getWidth(), (int) selectedRowBounds.getHeight());
                }
                super.paintComponent(g);
            }
        };
        adapter = new TableAdapter(tree);
        table = new Table(adapter);
        customizeTable(table);
        customizeTree(tree, table);
        customizeSplitpane(tree, table);
        adapter.addTableModelListener(this);
        //
        scrollPane = new JScrollPane(splitPane);
        add(scrollPane, BorderLayout.CENTER);
        JPanel header = new JPanel(null);
        tableHeader = table.getTableHeader();
        header.add(tableHeader);
        header.setPreferredSize(new Dimension(0, 16));
        add(header, BorderLayout.NORTH);

        btAdd = new JButton();
        btAdd.setVisible(false);
        add(btAdd, BorderLayout.SOUTH);
        btAdd.setAction(new AbstractAction("Add") {

            public void actionPerformed(ActionEvent e) {
                DefaultMutableTreeNode n = new DefaultMutableTreeNode(new TableNode("NEW", "", Color.GREEN));
                DefaultMutableTreeNode parent = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
                if (parent != null) {
                    parent.add(n);
                    ((DefaultTreeModel) tree.getModel()).nodeStructureChanged(parent);
                    table.repaint();
                    validate();
                }
            }
        });
    }

    private void customizeTable(final JTable table) {
        table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        //connect Selection listeners
        adapter.addTable(table);
        table.setRowHeight(18);
        table.addComponentListener(new ComponentAdapter() {

            @Override
            public void componentResized(ComponentEvent e) {
                if (table.isShowing()) {
                    Point loc = table.getLocationOnScreen();
                    tableHeader.setBounds(
                            new Rectangle(loc.x - frame.getLocation().x - 3 -
                            getInsets().left, 0, 1100, 18));
                    tableHeader.setReorderingAllowed(false);
                }
            }
        });

    }

    private void customizeTree(final JTree tree, final JTable table) {
        tree.setShowsRootHandles(true);
        tree.setRowHeight(table.getRowHeight());
        tree.setFocusable(false);
        selectionColor = table.getSelectionBackground();
        tree.putClientProperty("JTree.lineStyle", "Horizontal");
        tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);

        tree.setOpaque(false);
        //Adapt the default selection colors:
        DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) tree.getCellRenderer();
        renderer.setBorderSelectionColor(Color.WHITE);
        renderer.setBackgroundSelectionColor(new Color(0, 0, 0, 0));
        //Add the TreeSelectionListener:
        TreeSelectionModel selectionModel = tree.getSelectionModel();
        selectionModel.addTreeSelectionListener(new TreeSelectionListener() {

            public void valueChanged(final TreeSelectionEvent e) {
                paintSelectionRect();
            }
        });
        //Add the TreeExpansionListener:
        tree.addTreeExpansionListener(new TreeExpansionListener() {

            public void treeCollapsed(final TreeExpansionEvent event) {
                paintSelectionRect();
            }

            public void treeExpanded(final TreeExpansionEvent event) {
                paintSelectionRect();
            }
        });
        //Add MouseListener if you want to listen to whole line width:
        tree.addMouseListener(new MouseAdapter() {

            @Override
            public void mousePressed(final MouseEvent e) {
                int row = tree.getClosestRowForLocation(e.getX(), e.getY());
                if (e.getClickCount() == 2) {
                    if (tree.isCollapsed(row)) {
                        tree.expandRow(row);
                    } else {
                        tree.collapseRow(row);
                    }
                } else {
                    tree.setSelectionRow(row);
                }
            }
        });

    }

    private void customizeSplitpane(final JTree tree, final JTable table) {
        splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, tree, table);
        splitPane.setDividerLocation(250);
        splitPane.setBackground(Color.WHITE);
        splitPane.setContinuousLayout(true);
    }
    //This method is called in valueChanged, treeCollapsed and treeExpanded
    //to paint the selection rectangle:

    private void paintSelectionRect() {
        //Get selected row bounds:
        int[] rows = tree.getSelectionRows();
        if (rows == null) {
            selectedRowBounds = null;
            return;
        }
        selectedRowBounds = tree.getRowBounds(rows[0]);
        //Repaint the JTree:
        tree.repaint();
    }

    public void tableChanged(TableModelEvent e) {
        if (treeTablePanels != null) {
            for (TreeTablePanel treeTablePanel : treeTablePanels) {
                treeTablePanel.getTable().repaint();
            }
        }
    }

    public Table getTable() {
        return table;
    }

    public JTree addTreeSelectionListener(TreeSelectionListener l) {
        tree.getSelectionModel().addTreeSelectionListener(l);
        return tree;
    }
}

Jemand ne Idee ???
 

Marco13

Top Contributor
Jo, 600 Zeilen ... :autsch: Einen "Bereich mit 100 Pixeln höhe" kann man vielleicht so bauen:
Code:
JPanel panelForButtons = new JPanel();
panelForButtons.setPreferredSize(new Dimension(1,100));
Wo genau du das jetzt einbauen müßtest, werd' ich mir da aber nicht rauslesen...
 

Rave

Bekanntes Mitglied
Jo, 600 Zeilen ... :autsch: Einen "Bereich mit 100 Pixeln höhe" kann man vielleicht so bauen:
Code:
JPanel panelForButtons = new JPanel();
panelForButtons.setPreferredSize(new Dimension(1,100));
Wo genau du das jetzt einbauen müßtest, werd' ich mir da aber nicht rauslesen...

Okay und den bekomme ich dann wie nach unten in dem Fenster ??? Auch mit BorderLayout.BOTTOM ??? oder bin ich da grade falsch ^^ :lol:
 

Paddelpirat

Bekanntes Mitglied
Mach dir noch ein buttonPanel auf dem du die Buttons hinzufügst und dann ergänzt du dein Programm z.B. so:

Java:
add(treeTablePanel, BorderLayout.CENTER); //das kommt noch von dir

add(buttonPanel, BorderLayout.SOUTH);
 

Rave

Bekanntes Mitglied
Mach dir noch ein buttonPanel auf dem du die Buttons hinzufügst und dann ergänzt du dein Programm z.B. so:

Java:
add(treeTablePanel, BorderLayout.CENTER); //das kommt noch von dir

add(buttonPanel, BorderLayout.SOUTH);

Okay werd ich mal ausprobieren ;-) danke für die Tips
 

Rave

Bekanntes Mitglied
So hab da nun einen Panel auch mit dem BorderLayout.SOUTH und so weiter nur jetzt zeichnet er mit den immer noch recht an den Rand es Frames ;(

Hab ich irgendwas vergessen ????
 

Rave

Bekanntes Mitglied
So hier der Aktuelle Stand:
Java:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import javax.swing.tree.*;

import javax.media.*;

public class MP3Player extends JFrame implements KeyListener, MouseListener, TreeSelectionListener {

    // Anfang Attribute
    private File[] mp3Files;
    private File directory;
    private Player player;
    private DefaultMutableTreeNode root;
    private final TreeTablePanel treeTablePanel;
    private final JTree tree;
    
    float laut=1.0f;
    private JPanel ButtonPanel = new JPanel();
    // Ende Attribute

    public MP3Player() {
        this.setTitle("MP3 Player");
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setSize(1050, 500);
        this.setLocationRelativeTo(null);
        setLayout(new GridLayout());
        this.directory = new File("music/");
        if (!directory.isDirectory()) {
            directory.mkdir();
            System.err.println("Dies ist kein Verzeichnis: " + directory);
        }
        mp3Files = readDirectory();
        // Anfang Komponenten
        DefaultTreeModel model = new DefaultTreeModel(createTree(directory));
        treeTablePanel = new TreeTablePanel(this, model, null);
        treeTablePanel.setBorder(BorderFactory.createTitledBorder("Your Music: "));
        tree = treeTablePanel.addTreeSelectionListener(this);
        tree.setSelectionRow(1);
        add(treeTablePanel, BorderLayout.CENTER);

        add(ButtonPanel, BorderLayout.SOUTH);

        this.setVisible(true);

        addKeyListener(this);
        addMouseListener(this);

        laut = 1.0f;
        // Ende Komponenten
    }

    // Anfang Methoden
    private File[] readDirectory() {
        File[] files = directory.listFiles(new FileFilter() {

            @Override
            public boolean accept(File currentFile) {
                return currentFile.getName().toLowerCase().endsWith(".mp3");
            }
        });
        return files;
    }

    public static void main(String[] args) {
        new MP3Player();
    }

    public void valueChanged(TreeSelectionEvent e) {
        TreePath selectionPath = tree.getSelectionPath();
        if (selectionPath == null) {
            return;
        }
        Object comp = selectionPath.getLastPathComponent();
        TableNode node = (TableNode) ((DefaultMutableTreeNode) comp).getUserObject();
        String path = node.getDataRow().get(0).toString();
        File mp3ToPlay = new File(path);
        if (!mp3ToPlay.exists() || !mp3ToPlay.isFile()) {
            return;
        }
        if (player != null) {
            player.stop();
        }
        this.play(mp3ToPlay);
    }

    private void play(File mp3) {
        try {
            player = Manager.createRealizedPlayer(mp3.toURI().toURL());//javax.media.Player
//            BufferedInputStream input = new BufferedInputStream(new FileInputStream(mp3));
//            player = new Player(input);
        } catch (Exception e) {
            System.out.println("Error: " + e);
        }

        Thread playInBackground = new Thread() {

            @Override
            public void run() {
                try {
                    player.start();
                    player.getGainControl().setLevel(laut);
                } catch (Exception e) {
                    System.out.println(e);
                }
            }
        };
        playInBackground.start();
    }

    private DefaultMutableTreeNode createTree(File directory) {
        // create root node and add more nodes
        root = new DefaultMutableTreeNode(new TableNode(directory.getName(), directory.getPath(), null));
        load(root);
        return root;
    }

    private void load(DefaultMutableTreeNode node) {
        TableNode n = (TableNode) node.getUserObject();
        String path = n.getDataRow().get(0).toString();
        File f = new File(path);
        if (f.isDirectory()) {
            mp3Files = f.listFiles();
            for (File file : mp3Files) {
                DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(
                        new TableNode(file.getName(), file.getPath(), file.length()));
                if (file.isDirectory()) {
                    node.add(newNode);
                    load(newNode);
                } else {
                    node.add(newNode);
                }
            }
        }

    }
    public void keyPressed(KeyEvent e)
  {
    System.out.println("User pressed key " + e.getKeyCode());
  }

  public void keyReleased(KeyEvent e)
  {
         System.out.println("User released key " + e.getKeyCode());
  }

  public void keyTyped(KeyEvent e)
  {
         System.out.println("User typed key " + e.getKeyCode());
  }
   public void mouseClicked(MouseEvent e)
  {
    int x=e.getX();
    int y=e.getY();
    System.out.println("Maus at "+x+"   "+y);

  }



  public void mouseEntered(MouseEvent e)
  {
    System.out.println("User clicked mouse " + e.getClickCount() + " times!");
  }

  public void mouseExited(MouseEvent e)
  {

  }

  public void mousePressed(MouseEvent e)
  {

  }

  public void mouseReleased(MouseEvent e)
  {

  }

  public void mouseMoved(MouseEvent e)
  {
  }

  public void mouseDragged(MouseEvent e)
  {
  }

    // Ende Methoden
}

/** JTable that has different renderers depending on the classes in TreeModel */
class Table extends JTable {

    void registerRenderers() {
//        setDefaultRenderer(Color.class, new TableColorRenderer(Color.WHITE));
    }

    public Table() {
        super();
        registerRenderers();
        
    }

    public Table(TableModel dm) {
        super(dm);

        registerRenderers();
    }

    public Table(TableModel dm, TableColumnModel cm) {
        super(dm, cm);

        registerRenderers();
    }

    @Override
    public TableCellRenderer getCellRenderer(int row, int column) {
        Object value = getModel().getValueAt(row, column);
        if (value == null) {
            value = "";
        }
        /** enable to have custom renderers depending on class of cell */
        TableCellRenderer tcr = getDefaultRenderer(value.getClass());

        return tcr;
    }

    @Override
    public Rectangle getCellRect(int row, int column, boolean includeSpacing) {
        Rectangle sRect = super.getCellRect(row, column, includeSpacing);
        if ((row < 0) || (column < 0) ||
                (getRowCount() <= row) || (getColumnCount() <= column)) {
            return sRect;
        }
        int index = 0;
        int columnMargin = getColumnModel().getColumnMargin();
        Rectangle cellFrame = new Rectangle();
        if (column > 0 && shouldCombineCells(row)) {
            return cellFrame;
        }
        int aCellHeight = rowHeight;
        cellFrame.y = row * aCellHeight;
        cellFrame.height = aCellHeight;

        Enumeration enumeration = getColumnModel().getColumns();
        while (enumeration.hasMoreElements()) {
            TableColumn aColumn = (TableColumn) enumeration.nextElement();
            cellFrame.width = aColumn.getWidth() + columnMargin;
            if (index == column) {
                break;
            }
            cellFrame.x += cellFrame.width;
            index++;
        }
        while (enumeration.hasMoreElements() && shouldCombineCells(row)) {
            TableColumn aColumn = (TableColumn) enumeration.nextElement();
            cellFrame.width += aColumn.getWidth() + columnMargin;
        }
        if (!includeSpacing) {
            Dimension spacing = getIntercellSpacing();
            cellFrame.setBounds(cellFrame.x + spacing.width / 2,
                    cellFrame.y + spacing.height / 2,
                    cellFrame.width - spacing.width,
                    cellFrame.height - spacing.height);
        }
        return cellFrame;
    }

    private boolean shouldCombineCells(int row) {
        TableAdapter model = (TableAdapter) getModel();
        JTree tree = model.getTree();
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getPathForRow(row).getLastPathComponent();
        return node.getLevel() < 1;
    }
}
/*
JTree already has a good data model (DefaultTreeModel), and it's easier
to implement an adapter that simply puts a TableModel on top of the TreeModel,
rather than to implement JTree renderers in a  JTable and work around the API
to achieve correct displays.

The class "TableAdapter" puts an AbstractTableModel on top of DefaultTreeModel
which is suggested by Swing for a JTree. The TableModel consists of the
dataRow vector from "TableNode". The TableAdapter is also responsible for
firing updates on the table data in case the JTree is collapsed or expanded.
 */

class TableAdapter extends AbstractTableModel {

    private JTree tree;
    private JTable table;
    private int[] sel_rows;
    private ListSelectionListener selectionListener;
    private String[] columnNames = {"Path", "Size"};

    public TableAdapter(JTree t) {
        tree = t;

        tree.addTreeExpansionListener(new TreeExpansionListener() {

            public void treeExpanded(TreeExpansionEvent event) {
                fireTableDataChanged();
                select();
            }

            public void treeCollapsed(TreeExpansionEvent event) {
                fireTableDataChanged();
                select();
            }
        });
    }

    public void addTable(JTable t) {
        table = t;
        table.setBackground(Color.lightGray);

        tree.addTreeSelectionListener(new TreeSelectionListener() {

            public void valueChanged(TreeSelectionEvent e) {
                sel_rows = tree.getSelectionRows();
                select();
            }
        });
        selectionListener = new ListSelectionListener() {

            public void valueChanged(ListSelectionEvent e) {
                int row = table.getSelectedRow();
                tree.setSelectionRow(row);
                table.repaint();
            }
        };
        table.getSelectionModel().addListSelectionListener(selectionListener);

    }

    public JTree getTree() {
        return tree;
    }

    private void select() {
        if (sel_rows != null) {
            table.getSelectionModel().setSelectionInterval(sel_rows[0], sel_rows[0]);
        }
    }

    //assumes all nodes have same number of items as root node
    public int getColumnCount() {
        DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot();
        TableNode n = (TableNode) root.getUserObject();
        return n.getDataRow().size();
    }

    public int getRowCount() {
        return tree.getRowCount();
    }

    @Override
    public String getColumnName(int col) {
        return columnNames[col];
    }

    public Object getValueAt(int row, int col) {
        TreePath tPath = tree.getPathForRow(row);
        Object[] oPath = tPath.getPath();
        int len = oPath.length;
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) oPath[len - 1];
        TableNode treeNode = (TableNode) node.getUserObject();
        Vector dataRow = treeNode.getDataRow();

        return dataRow.elementAt(col);
    }

    @Override
    public void setValueAt(Object value, int row, int col) {
        TreePath tPath = tree.getPathForRow(row);
        Object[] oPath = tPath.getPath();
        int len = oPath.length;
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) oPath[len - 1];
        TableNode treeNode = (TableNode) node.getUserObject();
        Vector dataRow = treeNode.getDataRow();
        dataRow.setElementAt(value, col);
    }

    @Override
    public Class getColumnClass(int c) {
        DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot();
        TableNode n = (TableNode) root.getUserObject();
        return n.getDataRow().elementAt(c).getClass();
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }
}
/*
TreeModels contain DefaultMutableTreeNodes. Each DefaultMutableTreeNode
contains a UserObject for which we can easily create a class "TableNode"
having a String to be displayed in the JTree, and a vector of objects
to be displayed in the JTable.
 */

class TableNode {

    private String label;
    private Vector dataRow;

    public TableNode(String s, Object x, Object y) {
        label = s;
        dataRow = new Vector();
        dataRow.add(x);
        dataRow.add(y);
    }

    @Override
    public String toString() {
        return label;
    }

    public Vector getDataRow() {
        return dataRow;
    }
}

class TreeTablePanel extends JPanel implements TableModelListener {

    private JTree tree;
    private Rectangle selectedRowBounds;
    private Color selectionColor;
    private TableAdapter adapter;
    private Table table;
    private JSplitPane splitPane;
    private JTableHeader tableHeader;
    private JButton btAdd;
    private TreeTablePanel[] treeTablePanels;
    private Frame frame;
    private final JScrollPane scrollPane;

    public TreeTablePanel(Frame frame, DefaultTreeModel model, TreeTablePanel[] treeTablePanels) {
        super(new BorderLayout());
        this.frame = frame;
        this.treeTablePanels = treeTablePanels;
        tree = new JTree(model) {
            //Override paintComponent of JTree:

            @Override
            public void paintComponent(final Graphics g) {
                if (selectedRowBounds != null) {
                    //Set selection Color:
                    g.setColor(selectionColor);
                    //Draw selection rectangle using the width of JTree:
                    g.fillRect(0, (int) selectedRowBounds.getY(), getWidth(), (int) selectedRowBounds.getHeight());
                }
                super.paintComponent(g);
            }
        };
        adapter = new TableAdapter(tree);
        table = new Table(adapter);
        customizeTable(table);
        customizeTree(tree, table);
        customizeSplitpane(tree, table);
        adapter.addTableModelListener(this);
        //
        scrollPane = new JScrollPane(splitPane);
        add(scrollPane, BorderLayout.CENTER);
        JPanel header = new JPanel(null);
        tableHeader = table.getTableHeader();
        header.add(tableHeader);
        header.setPreferredSize(new Dimension(0, 16));
        add(header, BorderLayout.NORTH);

        btAdd = new JButton();
        btAdd.setVisible(false);
        add(btAdd, BorderLayout.SOUTH);
        btAdd.setAction(new AbstractAction("Add") {

            public void actionPerformed(ActionEvent e) {
                DefaultMutableTreeNode n = new DefaultMutableTreeNode(new TableNode("NEW", "", Color.GREEN));
                DefaultMutableTreeNode parent = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
                if (parent != null) {
                    parent.add(n);
                    ((DefaultTreeModel) tree.getModel()).nodeStructureChanged(parent);
                    table.repaint();
                    validate();
                }
            }
        });
    }

    private void customizeTable(final JTable table) {
        table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        //connect Selection listeners
        adapter.addTable(table);
        table.setRowHeight(18);
        table.addComponentListener(new ComponentAdapter() {

            @Override
            public void componentResized(ComponentEvent e) {
                if (table.isShowing()) {
                    Point loc = table.getLocationOnScreen();
                    tableHeader.setBounds(
                            new Rectangle(loc.x - frame.getLocation().x - 3 -
                            getInsets().left, 0, 1100, 18));
                    tableHeader.setReorderingAllowed(false);
                }
            }
        });

    }

    private void customizeTree(final JTree tree, final JTable table) {
        tree.setShowsRootHandles(true);
        tree.setRowHeight(table.getRowHeight());
        tree.setFocusable(false);
        selectionColor = table.getSelectionBackground();
        tree.putClientProperty("JTree.lineStyle", "Horizontal");
        tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);

        tree.setOpaque(false);
        //Adapt the default selection colors:
        DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) tree.getCellRenderer();
        renderer.setBorderSelectionColor(Color.WHITE);
        renderer.setBackgroundSelectionColor(new Color(0, 0, 0, 0));
        //Add the TreeSelectionListener:
        TreeSelectionModel selectionModel = tree.getSelectionModel();
        selectionModel.addTreeSelectionListener(new TreeSelectionListener() {

            public void valueChanged(final TreeSelectionEvent e) {
                paintSelectionRect();
            }
        });
        //Add the TreeExpansionListener:
        tree.addTreeExpansionListener(new TreeExpansionListener() {

            public void treeCollapsed(final TreeExpansionEvent event) {
                paintSelectionRect();
            }

            public void treeExpanded(final TreeExpansionEvent event) {
                paintSelectionRect();
            }
        });
        //Add MouseListener if you want to listen to whole line width:
        tree.addMouseListener(new MouseAdapter() {

            @Override
            public void mousePressed(final MouseEvent e) {
                int row = tree.getClosestRowForLocation(e.getX(), e.getY());
                if (e.getClickCount() == 2) {
                    if (tree.isCollapsed(row)) {
                        tree.expandRow(row);
                    } else {
                        tree.collapseRow(row);
                    }
                } else {
                    tree.setSelectionRow(row);
                }
            }
        });

    }

    private void customizeSplitpane(final JTree tree, final JTable table) {
        splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, tree, table);
        splitPane.setDividerLocation(250);
        splitPane.setBackground(Color.WHITE);
        splitPane.setContinuousLayout(true);
    }
    //This method is called in valueChanged, treeCollapsed and treeExpanded
    //to paint the selection rectangle:

    private void paintSelectionRect() {
        //Get selected row bounds:
        int[] rows = tree.getSelectionRows();
        if (rows == null) {
            selectedRowBounds = null;
            return;
        }
        selectedRowBounds = tree.getRowBounds(rows[0]);
        //Repaint the JTree:
        tree.repaint();
    }

    public void tableChanged(TableModelEvent e) {
        if (treeTablePanels != null) {
            for (TreeTablePanel treeTablePanel : treeTablePanels) {
                treeTablePanel.getTable().repaint();
            }
        }
    }

    public Table getTable() {
        return table;
    }

    public JTree addTreeSelectionListener(TreeSelectionListener l) {
        tree.getSelectionModel().addTreeSelectionListener(l);
        return tree;
    }
}
 

Marco13

Top Contributor
NEIN, genau so NICHT :noe:


Es stimmt schon fast: Statt des
setLayout(new GridLayout());
muss dort ein
setLayout(new BorderLayout());
hin.

Dann noch
Code:
....
        [b]ButtonPanel.setPreferredSize(new Dimension(1,100));[/b]
        add(ButtonPanel, BorderLayout.SOUTH);
rein, dann müßte es schon passen.
 

Rave

Bekanntes Mitglied
NEIN, genau so NICHT :noe:


Es stimmt schon fast: Statt des
setLayout(new GridLayout());
muss dort ein
setLayout(new BorderLayout());
hin.

Dann noch
Code:
....
        [b]ButtonPanel.setPreferredSize(new Dimension(1,100));[/b]
        add(ButtonPanel, BorderLayout.SOUTH);
rein, dann müßte es schon passen.


Dann kommt der hier:

Exception in thread "main" java.lang.NullPointerException
at MP3Player.<init>(MP3Player.java:47)
at MP3Player.main(MP3Player.java:72)
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Diese Warnungen haben nichts mit dem Problem zu tun. Die kommen aus der TableAdapter und TableNode Klasse. Kannst ja direkt vor die beiden Klassen
Code:
[b]@SuppressWarnings("unchecked")[/b]
class TableAdapter extends AbstractTableModel {
...

[b]@SuppressWarnings("unchecked")[/b]
class TableNode {
...
einfügen....
 

Rave

Bekanntes Mitglied
War auch die Faschle Meldung die ich kopiert hatte sry ^^ hab schon editiert aber hier noch mal:

Exception in thread "main" java.lang.NullPointerException
at MP3Player.<init>(MP3Player.java:47)
at MP3Player.main(MP3Player.java:72)
 

Marco13

Top Contributor
In Zeile 47 von MP3Player.java wird auf etwas zugegriffen, was "null" ist. Auf basis des zuletzt geposteten Codes könnte das nur das ButtonPanel sein (das buttonPanel heißen sollte), aber das kann es NICHT sein, weil du das ja schon ganz oben erstellst... Also. irgendwas ist da null...
 

Rave

Bekanntes Mitglied
So hier noch mal alles : Ich find nämlich nichts :-(

Java:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.JPanel;
import javax.swing.table.*;
import javax.swing.tree.*;
//import javazoom.jl.player.Player;
import javax.media.*;

public class MP3Player extends JFrame implements KeyListener, MouseListener, TreeSelectionListener {

    // Anfang Attribute
    private File[] mp3Files;
    private File directory;
    private Player player;
    private DefaultMutableTreeNode root;
    private final TreeTablePanel treeTablePanel;
    private final JTree tree;
    
    float laut=1.0f;
    private JPanel ButtonPanel;
    // Ende Attribute

    public MP3Player() {
        this.setTitle("MP3 Player");
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setSize(1050, 500);
        this.setLocationRelativeTo(null);
        setLayout(new BorderLayout());
        this.directory = new File("music/");
        if (!directory.isDirectory()) {
            directory.mkdir();
            System.err.println("Dies ist kein Verzeichnis: " + directory);
        }
        mp3Files = readDirectory();
        // Anfang Komponenten
        DefaultTreeModel model = new DefaultTreeModel(createTree(directory));
        treeTablePanel = new TreeTablePanel(this, model, null);
        treeTablePanel.setBorder(BorderFactory.createTitledBorder("Your Music: "));
        tree = treeTablePanel.addTreeSelectionListener(this);
        tree.setSelectionRow(1);
        add(treeTablePanel, BorderLayout.CENTER);

        add(ButtonPanel, BorderLayout.SOUTH);
        ButtonPanel.setPreferredSize(new Dimension(1,100));

        this.setVisible(true);

        addKeyListener(this);
        addMouseListener(this);

        laut = 1.0f;
        // Ende Komponenten
    }

    // Anfang Methoden
    private File[] readDirectory() {
        File[] files = directory.listFiles(new FileFilter() {

            @Override
            public boolean accept(File currentFile) {
                return currentFile.getName().toLowerCase().endsWith(".mp3");
            }
        });
        return files;
    }

    public static void main(String[] args) {
        new MP3Player();
    }

    public void valueChanged(TreeSelectionEvent e) {
        TreePath selectionPath = tree.getSelectionPath();
        if (selectionPath == null) {
            return;
        }
        Object comp = selectionPath.getLastPathComponent();
        TableNode node = (TableNode) ((DefaultMutableTreeNode) comp).getUserObject();
        String path = node.getDataRow().get(0).toString();
        File mp3ToPlay = new File(path);
        if (!mp3ToPlay.exists() || !mp3ToPlay.isFile()) {
            return;
        }
        if (player != null) {
            player.stop();
        }
        this.play(mp3ToPlay);
    }

    private void play(File mp3) {
        try {
            player = Manager.createRealizedPlayer(mp3.toURI().toURL());//javax.media.Player
//            BufferedInputStream input = new BufferedInputStream(new FileInputStream(mp3));
//            player = new Player(input);
        } catch (Exception e) {
            System.out.println("Error: " + e);
        }

        Thread playInBackground = new Thread() {

            @Override
            public void run() {
                try {
                    player.start();
                    player.getGainControl().setLevel(laut);
                } catch (Exception e) {
                    System.out.println(e);
                }
            }
        };
        playInBackground.start();
    }

    private DefaultMutableTreeNode createTree(File directory) {
        // create root node and add more nodes
        root = new DefaultMutableTreeNode(new TableNode(directory.getName(), directory.getPath(), null));
        load(root);
        return root;
    }

    private void load(DefaultMutableTreeNode node) {
        TableNode n = (TableNode) node.getUserObject();
        String path = n.getDataRow().get(0).toString();
        File f = new File(path);
        if (f.isDirectory()) {
            mp3Files = f.listFiles();
            for (File file : mp3Files) {
                DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(
                        new TableNode(file.getName(), file.getPath(), file.length()));
                if (file.isDirectory()) {
                    node.add(newNode);
                    load(newNode);
                } else {
                    node.add(newNode);
                }
            }
        }

    }
    public void keyPressed(KeyEvent e)
  {
    System.out.println("User pressed key " + e.getKeyCode());
  }

  public void keyReleased(KeyEvent e)
  {
         System.out.println("User released key " + e.getKeyCode());
  }

  public void keyTyped(KeyEvent e)
  {
         System.out.println("User typed key " + e.getKeyCode());
  }
   public void mouseClicked(MouseEvent e)
  {
    int x=e.getX();
    int y=e.getY();
    System.out.println("Maus at "+x+"   "+y);

  }



  public void mouseEntered(MouseEvent e)
  {
    System.out.println("User clicked mouse " + e.getClickCount() + " times!");
  }

  public void mouseExited(MouseEvent e)
  {

  }

  public void mousePressed(MouseEvent e)
  {

  }

  public void mouseReleased(MouseEvent e)
  {

  }

  public void mouseMoved(MouseEvent e)
  {
  }

  public void mouseDragged(MouseEvent e)
  {
  }

    // Ende Methoden
}

/** JTable that has different renderers depending on the classes in TreeModel */
class Table extends JTable {

    void registerRenderers() {
//        setDefaultRenderer(Color.class, new TableColorRenderer(Color.WHITE));
    }

    public Table() {
        super();
        registerRenderers();
        
    }

    public Table(TableModel dm) {
        super(dm);

        registerRenderers();
    }

    public Table(TableModel dm, TableColumnModel cm) {
        super(dm, cm);

        registerRenderers();
    }

    @Override
    public TableCellRenderer getCellRenderer(int row, int column) {
        Object value = getModel().getValueAt(row, column);
        if (value == null) {
            value = "";
        }
        /** enable to have custom renderers depending on class of cell */
        TableCellRenderer tcr = getDefaultRenderer(value.getClass());

        return tcr;
    }

    @Override
    public Rectangle getCellRect(int row, int column, boolean includeSpacing) {
        Rectangle sRect = super.getCellRect(row, column, includeSpacing);
        if ((row < 0) || (column < 0) ||
                (getRowCount() <= row) || (getColumnCount() <= column)) {
            return sRect;
        }
        int index = 0;
        int columnMargin = getColumnModel().getColumnMargin();
        Rectangle cellFrame = new Rectangle();
        if (column > 0 && shouldCombineCells(row)) {
            return cellFrame;
        }
        int aCellHeight = rowHeight;
        cellFrame.y = row * aCellHeight;
        cellFrame.height = aCellHeight;

        Enumeration enumeration = getColumnModel().getColumns();
        while (enumeration.hasMoreElements()) {
            TableColumn aColumn = (TableColumn) enumeration.nextElement();
            cellFrame.width = aColumn.getWidth() + columnMargin;
            if (index == column) {
                break;
            }
            cellFrame.x += cellFrame.width;
            index++;
        }
        while (enumeration.hasMoreElements() && shouldCombineCells(row)) {
            TableColumn aColumn = (TableColumn) enumeration.nextElement();
            cellFrame.width += aColumn.getWidth() + columnMargin;
        }
        if (!includeSpacing) {
            Dimension spacing = getIntercellSpacing();
            cellFrame.setBounds(cellFrame.x + spacing.width / 2,
                    cellFrame.y + spacing.height / 2,
                    cellFrame.width - spacing.width,
                    cellFrame.height - spacing.height);
        }
        return cellFrame;
    }

    private boolean shouldCombineCells(int row) {
        TableAdapter model = (TableAdapter) getModel();
        JTree tree = model.getTree();
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getPathForRow(row).getLastPathComponent();
        return node.getLevel() < 1;
    }
}
/*
JTree already has a good data model (DefaultTreeModel), and it's easier
to implement an adapter that simply puts a TableModel on top of the TreeModel,
rather than to implement JTree renderers in a  JTable and work around the API
to achieve correct displays.

The class "TableAdapter" puts an AbstractTableModel on top of DefaultTreeModel
which is suggested by Swing for a JTree. The TableModel consists of the
dataRow vector from "TableNode". The TableAdapter is also responsible for
firing updates on the table data in case the JTree is collapsed or expanded.
 */

class TableAdapter extends AbstractTableModel {

    private JTree tree;
    private JTable table;
    private int[] sel_rows;
    private ListSelectionListener selectionListener;
    private String[] columnNames = {"Path", "Size"};

    public TableAdapter(JTree t) {
        tree = t;

        tree.addTreeExpansionListener(new TreeExpansionListener() {

            public void treeExpanded(TreeExpansionEvent event) {
                fireTableDataChanged();
                select();
            }

            public void treeCollapsed(TreeExpansionEvent event) {
                fireTableDataChanged();
                select();
            }
        });
    }

    public void addTable(JTable t) {
        table = t;
        table.setBackground(Color.lightGray);

        tree.addTreeSelectionListener(new TreeSelectionListener() {

            public void valueChanged(TreeSelectionEvent e) {
                sel_rows = tree.getSelectionRows();
                select();
            }
        });
        selectionListener = new ListSelectionListener() {

            public void valueChanged(ListSelectionEvent e) {
                int row = table.getSelectedRow();
                tree.setSelectionRow(row);
                table.repaint();
            }
        };
        table.getSelectionModel().addListSelectionListener(selectionListener);

    }

    public JTree getTree() {
        return tree;
    }

    private void select() {
        if (sel_rows != null) {
            table.getSelectionModel().setSelectionInterval(sel_rows[0], sel_rows[0]);
        }
    }

    //assumes all nodes have same number of items as root node
    public int getColumnCount() {
        DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot();
        TableNode n = (TableNode) root.getUserObject();
        return n.getDataRow().size();
    }

    public int getRowCount() {
        return tree.getRowCount();
    }

    @Override
    public String getColumnName(int col) {
        return columnNames[col];
    }

    public Object getValueAt(int row, int col) {
        TreePath tPath = tree.getPathForRow(row);
        Object[] oPath = tPath.getPath();
        int len = oPath.length;
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) oPath[len - 1];
        TableNode treeNode = (TableNode) node.getUserObject();
        Vector dataRow = treeNode.getDataRow();

        return dataRow.elementAt(col);
    }

    @Override
    public void setValueAt(Object value, int row, int col) {
        TreePath tPath = tree.getPathForRow(row);
        Object[] oPath = tPath.getPath();
        int len = oPath.length;
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) oPath[len - 1];
        TableNode treeNode = (TableNode) node.getUserObject();
        Vector dataRow = treeNode.getDataRow();
        dataRow.setElementAt(value, col);
    }

    @Override
    public Class getColumnClass(int c) {
        DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot();
        TableNode n = (TableNode) root.getUserObject();
        return n.getDataRow().elementAt(c).getClass();
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }
}
/*
TreeModels contain DefaultMutableTreeNodes. Each DefaultMutableTreeNode
contains a UserObject for which we can easily create a class "TableNode"
having a String to be displayed in the JTree, and a vector of objects
to be displayed in the JTable.
 */

class TableNode {

    private String label;
    private Vector dataRow;

    public TableNode(String s, Object x, Object y) {
        label = s;
        dataRow = new Vector();
        dataRow.add(x);
        dataRow.add(y);
    }

    @Override
    public String toString() {
        return label;
    }

    public Vector getDataRow() {
        return dataRow;
    }
}

class TreeTablePanel extends JPanel implements TableModelListener {

    private JTree tree;
    private Rectangle selectedRowBounds;
    private Color selectionColor;
    private TableAdapter adapter;
    private Table table;
    private JSplitPane splitPane;
    private JTableHeader tableHeader;
    private JButton btAdd;
    private TreeTablePanel[] treeTablePanels;
    private Frame frame;
    private final JScrollPane scrollPane;

    public TreeTablePanel(Frame frame, DefaultTreeModel model, TreeTablePanel[] treeTablePanels) {
        super(new BorderLayout());
        this.frame = frame;
        this.treeTablePanels = treeTablePanels;
        tree = new JTree(model) {
            //Override paintComponent of JTree:

            @Override
            public void paintComponent(final Graphics g) {
                if (selectedRowBounds != null) {
                    //Set selection Color:
                    g.setColor(selectionColor);
                    //Draw selection rectangle using the width of JTree:
                    g.fillRect(0, (int) selectedRowBounds.getY(), getWidth(), (int) selectedRowBounds.getHeight());
                }
                super.paintComponent(g);
            }
        };
        adapter = new TableAdapter(tree);
        table = new Table(adapter);
        customizeTable(table);
        customizeTree(tree, table);
        customizeSplitpane(tree, table);
        adapter.addTableModelListener(this);
        //
        scrollPane = new JScrollPane(splitPane);
        add(scrollPane, BorderLayout.CENTER);
        JPanel header = new JPanel(null);
        tableHeader = table.getTableHeader();
        header.add(tableHeader);
        header.setPreferredSize(new Dimension(0, 16));
        add(header, BorderLayout.NORTH);

        btAdd = new JButton();
        btAdd.setVisible(false);
        add(btAdd, BorderLayout.SOUTH);
        btAdd.setAction(new AbstractAction("Add") {

            public void actionPerformed(ActionEvent e) {
                DefaultMutableTreeNode n = new DefaultMutableTreeNode(new TableNode("NEW", "", Color.GREEN));
                DefaultMutableTreeNode parent = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
                if (parent != null) {
                    parent.add(n);
                    ((DefaultTreeModel) tree.getModel()).nodeStructureChanged(parent);
                    table.repaint();
                    validate();
                }
            }
        });
    }

    private void customizeTable(final JTable table) {
        table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        //connect Selection listeners
        adapter.addTable(table);
        table.setRowHeight(18);
        table.addComponentListener(new ComponentAdapter() {

            @Override
            public void componentResized(ComponentEvent e) {
                if (table.isShowing()) {
                    Point loc = table.getLocationOnScreen();
                    tableHeader.setBounds(
                            new Rectangle(loc.x - frame.getLocation().x - 3 -
                            getInsets().left, 0, 1100, 18));
                    tableHeader.setReorderingAllowed(false);
                }
            }
        });

    }

    private void customizeTree(final JTree tree, final JTable table) {
        tree.setShowsRootHandles(true);
        tree.setRowHeight(table.getRowHeight());
        tree.setFocusable(false);
        selectionColor = table.getSelectionBackground();
        tree.putClientProperty("JTree.lineStyle", "Horizontal");
        tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);

        tree.setOpaque(false);
        //Adapt the default selection colors:
        DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) tree.getCellRenderer();
        renderer.setBorderSelectionColor(Color.WHITE);
        renderer.setBackgroundSelectionColor(new Color(0, 0, 0, 0));
        //Add the TreeSelectionListener:
        TreeSelectionModel selectionModel = tree.getSelectionModel();
        selectionModel.addTreeSelectionListener(new TreeSelectionListener() {

            public void valueChanged(final TreeSelectionEvent e) {
                paintSelectionRect();
            }
        });
        //Add the TreeExpansionListener:
        tree.addTreeExpansionListener(new TreeExpansionListener() {

            public void treeCollapsed(final TreeExpansionEvent event) {
                paintSelectionRect();
            }

            public void treeExpanded(final TreeExpansionEvent event) {
                paintSelectionRect();
            }
        });
        //Add MouseListener if you want to listen to whole line width:
        tree.addMouseListener(new MouseAdapter() {

            @Override
            public void mousePressed(final MouseEvent e) {
                int row = tree.getClosestRowForLocation(e.getX(), e.getY());
                if (e.getClickCount() == 2) {
                    if (tree.isCollapsed(row)) {
                        tree.expandRow(row);
                    } else {
                        tree.collapseRow(row);
                    }
                } else {
                    tree.setSelectionRow(row);
                }
            }
        });

    }

    private void customizeSplitpane(final JTree tree, final JTable table) {
        splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, tree, table);
        splitPane.setDividerLocation(250);
        splitPane.setBackground(Color.WHITE);
        splitPane.setContinuousLayout(true);
    }
    //This method is called in valueChanged, treeCollapsed and treeExpanded
    //to paint the selection rectangle:

    private void paintSelectionRect() {
        //Get selected row bounds:
        int[] rows = tree.getSelectionRows();
        if (rows == null) {
            selectedRowBounds = null;
            return;
        }
        selectedRowBounds = tree.getRowBounds(rows[0]);
        //Repaint the JTree:
        tree.repaint();
    }

    public void tableChanged(TableModelEvent e) {
        if (treeTablePanels != null) {
            for (TreeTablePanel treeTablePanel : treeTablePanels) {
                treeTablePanel.getTable().repaint();
            }
        }
    }

    public Table getTable() {
        return table;
    }

    public JTree addTreeSelectionListener(TreeSelectionListener l) {
        tree.getSelectionModel().addTreeSelectionListener(l);
        return tree;
    }
}

Und hier der komplette Fehler:


Exception in thread "main" java.lang.NullPointerException
at java.awt.Container.addImpl(Container.java:1041)
at java.awt.Container.add(Container.java:959)
at javax.swing.JFrame.addImpl(JFrame.java:545)
at java.awt.Container.add(Container.java:927)
at MP3Player.<init>(MP3Player.java:47)
at MP3Player.main(MP3Player.java:72)
 

Marco13

Top Contributor
Ohne es nochmal gestartet zu haben, durch draufschauen: Vorher stand da sowas wie
private JPanel ButtonPanel = new JPanel(irgendeinLayout);
jetzt steht da
private JPanel ButtonPanel;
Und das ist eben 'null', wenn man nichts dagegen unternimmt....
 

Rave

Bekanntes Mitglied
Ohne es nochmal gestartet zu haben, durch draufschauen: Vorher stand da sowas wie
private JPanel ButtonPanel = new JPanel(irgendeinLayout);
jetzt steht da
private JPanel ButtonPanel;
Und das ist eben 'null', wenn man nichts dagegen unternimmt....

Jo jetzt gehts ;-) Danke an alle :toll:

LG Rave
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Problem: JTree mit integrierten JCheckboxen Java Basics - Anfänger-Themen 5
S JTree, Problem mit View Update Java Basics - Anfänger-Themen 2
G JTree Problem. Java Basics - Anfänger-Themen 5
G Problem mit Refresh von JTree Java Basics - Anfänger-Themen 11
G JTree Explorer Problem mit listRoots() Java Basics - Anfänger-Themen 9
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
I WildFily - unterschiedliche Libs im Projekt verursachen Problem Java Basics - Anfänger-Themen 11
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
L Taschenrechner Problem Java Basics - Anfänger-Themen 4
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
A ScheduledExecutorService problem Java Basics - Anfänger-Themen 7
marcelnedza Problem mit Weltzuweisung, JavaKarol Java Basics - Anfänger-Themen 13
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
M Erste Schritte Collatz Problem max int Java Basics - Anfänger-Themen 3
M Problem bei verschachtelter for-Schleife bei zweidimensionalen Arrays Java Basics - Anfänger-Themen 3
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
L Problem bei Rechnung mit Math.pow Java Basics - Anfänger-Themen 13
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
SUPERTJB return Problem Java Basics - Anfänger-Themen 3
sserio BigInteger Problem Java Basics - Anfänger-Themen 4
JordenJost Taschenrechner problem Java Basics - Anfänger-Themen 5
K Problem mit "Random" Java Basics - Anfänger-Themen 5
S Datei anlegen Problem! Groß- und Kleinschreibung wird nicht unterschieden Java Basics - Anfänger-Themen 4
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
xanxk Problem For-Schleife mit Charakter Java Basics - Anfänger-Themen 2
L Unbekanntes Problem mit 2d Array Java Basics - Anfänger-Themen 6
sserio Liste erstellt und ein Problem mit dem Index Java Basics - Anfänger-Themen 8
sserio Schwimmen als Spiel. Problem mit to String/ generate a card Java Basics - Anfänger-Themen 4
J Schleife Problem Java Basics - Anfänger-Themen 2
D Problem mit der Erkennung von \n Java Basics - Anfänger-Themen 2
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
M Verständins Problem bei Aufgabe Java Basics - Anfänger-Themen 4
HeiTim Problem mit der Kommasetzung an der richtigen stelle Java Basics - Anfänger-Themen 59
Temsky34 Problem mit dem Code Java Basics - Anfänger-Themen 17
P Problem mit Calendar.getDisplayName() Java Basics - Anfänger-Themen 8
C Problem mit mehreren Methoden + Scanner Java Basics - Anfänger-Themen 5
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
M Problem mit Klassenverständnis und Button Java Basics - Anfänger-Themen 8
EchtKeineAhnungManchmal hallo habe ein Problem mit einer Datei -> (Zugriff verweigert) Java Basics - Anfänger-Themen 4
H Problem mit Verzweigungen Java Basics - Anfänger-Themen 6
H Problem mit Rückgabewert Java Basics - Anfänger-Themen 7
josfe1234 JAVA FX problem Java Basics - Anfänger-Themen 3
A Code Problem Java Basics - Anfänger-Themen 6
Henri Problem von Typen Java Basics - Anfänger-Themen 7
J Problem mit "ArrayIndexOutOfBoundsException" Java Basics - Anfänger-Themen 11
K jackson Mapping - Problem mit Zeitzonen Java Basics - Anfänger-Themen 10
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
D Schleifen Problem Java Basics - Anfänger-Themen 2
H So viele Fehlermeldungen, dass ich nicht weiß wo das Problem ist. Java Basics - Anfänger-Themen 6
J JAVA-Problem blockiert MEDIATHEKVIEW Java Basics - Anfänger-Themen 13
T Problem mit Lehrzeichen und String bei einfacher Chiffre Java Basics - Anfänger-Themen 8
J extends Problem Java Basics - Anfänger-Themen 2
C Polymorphie-Problem Java Basics - Anfänger-Themen 3
Kalibru Problem bei Ausgabe von Objekt Java Basics - Anfänger-Themen 1
I Format Problem mit Wert - bekomme 0,10 anstatt 10,00 Java Basics - Anfänger-Themen 6
J Problem mit einer Methode die gewissen Inhalt einer Array löschen soll Java Basics - Anfänger-Themen 9
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
J Allgemeines Problem mit Klassen Java Basics - Anfänger-Themen 5
U Problem mit dem initialisieren meines Strings in einer Schleife Java Basics - Anfänger-Themen 5
amgadalghabra algorithmisches Problem Java Basics - Anfänger-Themen 19
J Traveling Salesman Problem [Arrays] Java Basics - Anfänger-Themen 9
R ArrayList Problem Java Basics - Anfänger-Themen 6
InfinityDE Problem mit Datenübergabe an Konstruktor Java Basics - Anfänger-Themen 7
C RegEx Problem Java Basics - Anfänger-Themen 4
J Anfänger TicTacToe, Problem bei Gewinnoption, sowohl Unentschieden Java Basics - Anfänger-Themen 8
E Taschenrechner GUI Problem mit Fehlerhandling Java Basics - Anfänger-Themen 6
M Input/Output Fallunterscheidung Problem Java Basics - Anfänger-Themen 17
P Problem beim Überschreiben einer vererbten Methode Java Basics - Anfänger-Themen 4
M Problem bei Ausgabe Java Basics - Anfänger-Themen 7
Splayfer Java Array Problem... Java Basics - Anfänger-Themen 2
G Problem bei der Ausgabe einer Main Claase Java Basics - Anfänger-Themen 7
F Problem mit KeyListener in kombination mit dem ActionListener Java Basics - Anfänger-Themen 4
G Subset sum problem mit Backtracking Java Basics - Anfänger-Themen 18
N Problem mit Scanner Java Basics - Anfänger-Themen 2
J Klassen Problem Java Basics - Anfänger-Themen 8
A Out.format problem. Java Basics - Anfänger-Themen 3
J Problem bei der Programmierung eines Tannenbaums Java Basics - Anfänger-Themen 9
A Array problem Java Basics - Anfänger-Themen 16
2 Taschenrechner mit GUI Problem bei der Berechnung Java Basics - Anfänger-Themen 8
W Remote Method Invocation RMI - Problem Java Basics - Anfänger-Themen 0
I Ich habe ein Problem Java Basics - Anfänger-Themen 3
A Problem bei returnen eines Wertes Java Basics - Anfänger-Themen 6
M Regex Erstellung Problem Java Basics - Anfänger-Themen 2
D Input/Output Problem bei der Benutzereingabe eines Befehls Java Basics - Anfänger-Themen 14
M (Sehr großes Problem) Listen als static in anderen Klassen verwendet Java Basics - Anfänger-Themen 12
F Habe ein problem mit dem ActionListener Java Basics - Anfänger-Themen 3
C Regex-Problem Java Basics - Anfänger-Themen 4
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
M Problem in der Modellierung Java Basics - Anfänger-Themen 20
W Wo ist das URL-Problem ? Java Basics - Anfänger-Themen 1
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
D FileWriter / FileReader Problem Java Basics - Anfänger-Themen 10
G Problem beim Speichern von Objekten in einer Datei Java Basics - Anfänger-Themen 7
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
J Problem mit Array: 2 Klassen Java Basics - Anfänger-Themen 2
S Collections funktionale Listen (ListNode<E>) review und problem beim clone Java Basics - Anfänger-Themen 0
W OOP Vererbung und Problem bei Zählschleife in einer Methode Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben