Víceřádková položka JTree – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Víceřádková položka JTree – Java – Fórum – Programujte.comVíceřádková položka JTree – Java – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Bicek0
Newbie
2. 6. 2021   #1
-
0
-

Potřebuji vytvořit víceřádkový textový prvek stromu JTree. Zkusil jsem 2 různé metody - odřádkování pomocí HTML tagů a zapouzdření více prvků do JPanelu. Obě metody fungují, ale..
Při použití "look and feel" ve variantě "Windows", je zobrazení všech prvků omezeno pouze na výšku jednoho řádku. Jsou-li zobrazeny 2 řádky, vidíme z prvního řádku dolní půlku a z druhého horní půlku. Je-li řádků více, tak v případě HTML verze je viditelný 1 řádek a v případě JPanelu jsou veškeré texty nečitelné - viz přiložený obrázek. 

V případě použití "look and feel" "Nimbus" nebo "Metal" je zobrazení v pořádku.

Zkoušel jsem, co mě napadlo. Např. nastavit minimální velikost panelu, preferovanou velikost apod., ale nepodařilo se mi objevit nic, co by fungovalo. Přikládám upravený zdrojový kód z příkladu na internetu.

Nějaké nápady?..
 

Připojen obrázek.

/*
Definitive Guide to Swing for Java 2, Second Edition
By John Zukowski     
ISBN: 1-893115-78-X
Publisher: APress
 */
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeCellRenderer;

public class BookTree {

    public static void main(String args[]) {
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
//                if ("Nimbus".equals(info.getName())) {
                if ("Windows".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(BookTree.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(BookTree.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(BookTree.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(BookTree.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }

        JFrame frame = new JFrame("Book Tree");
        Book javaBooks[] = {
            new Book("Core Java 2 Fundamentals", "Cornell/Horstmann",
            42.99f),
            new Book("Taming Java Threads", "Holub", 34.95f),
            new Book("JavaServer  Pages", "Pekowsky", 39.95f)};
        Book htmlBooks[] = {new Book("Dynamic HTML", "Goodman", 39.95f),
            new Book("HTML 4 Bible", "Pfaffenberger/Gutzman", 49.99f)};
        Vector javaVector = new NamedVector("Java Books", javaBooks);
        Vector htmlVector = new NamedVector("HTML Books", htmlBooks);
        Object rootNodes[] = {javaVector, htmlVector};
        Vector rootVector = new NamedVector("Root", rootNodes);
        JTree tree = new JTree(rootVector);
        TreeCellRenderer renderer = new BookCellRenderer();
        tree.setCellRenderer(renderer);
        JScrollPane scrollPane = new JScrollPane(tree);
        frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
        frame.setSize(300, 300);
        frame.setVisible(true);
    }
}

class Book {

    String title;

    String authors;

    float price;

    public Book(String title, String authors, float price) {
        this.title = title;
        this.authors = authors;
        this.price = price;
    }

    public String getTitle() {
        return title;
    }

    public String getAuthors() {
        return authors;
    }

    public float getPrice() {
        return price;
    }
}

class BookCellRenderer implements TreeCellRenderer {

    JLabel titleLabel;

    JLabel authorsLabel;

    JLabel priceLabel;

    JPanel renderer;

    DefaultTreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer();

    Color backgroundSelectionColor;

    Color backgroundNonSelectionColor;

    public BookCellRenderer() {
        renderer = new JPanel(new GridLayout(0, 1));
        titleLabel = new JLabel(" ");
        titleLabel.setForeground(Color.blue);
        renderer.add(titleLabel);
        authorsLabel = new JLabel(" ");
        authorsLabel.setForeground(Color.blue);
        renderer.add(authorsLabel);
        priceLabel = new JLabel(" ");
        priceLabel.setHorizontalAlignment(JLabel.RIGHT);
        priceLabel.setForeground(Color.red);
        renderer.add(priceLabel);
        renderer.setBorder(BorderFactory.createLineBorder(Color.black));
        backgroundSelectionColor = defaultRenderer
                .getBackgroundSelectionColor();
        backgroundNonSelectionColor = defaultRenderer
                .getBackgroundNonSelectionColor();
    }

    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value,
            boolean selected, boolean expanded, boolean leaf, int row,
            boolean hasFocus) {
        Component returnValue = null;
        if ((value != null) && (value instanceof DefaultMutableTreeNode)) {
            Object userObject = ((DefaultMutableTreeNode) value)
                    .getUserObject();
            if (userObject instanceof Book) {
                Book book = (Book) userObject;
                titleLabel.setText(book.getTitle());
                authorsLabel.setText(book.getAuthors());
                priceLabel.setText("" + book.getPrice());
                if (selected) {
                    renderer.setBackground(backgroundSelectionColor);
                } else {
                    renderer.setBackground(backgroundNonSelectionColor);
                }
                renderer.setEnabled(tree.isEnabled());
                returnValue = renderer;
            }
        }
        if (returnValue == null) {
            returnValue = defaultRenderer.getTreeCellRendererComponent(tree,
                    value, selected, expanded, leaf, row, hasFocus);
        }
        return returnValue;
    }
}

class NamedVector extends Vector {

    String name;

    public NamedVector(String name) {
        this.name = name;
    }

    public NamedVector(String name, Object elements[]) {
        this.name = name;
        for (int i = 0, n = elements.length; i < n; i++) {
            add(elements[i]);
        }
    }

    public String toString() {
        return "[" + name + "]";
    }
}
Nahlásit jako SPAM
IP: 89.190.73.–
MilanL+1
Grafoman
Nahlásit jako SPAM
IP: 185.112.167.–
Bicek0
Newbie
6. 6. 2021   #3
-
0
-

Stejný problém :-)
Opravdu bylo klíčové nastavit  následující vlastnost na nulu.

setRowHeight
Nahlásit jako SPAM
IP: 85.207.99.–
13. 7. 2021   #4
-
0
-

So great

Nahlásit jako SPAM
IP: 27.2.17.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 58 hostů

Podobná vlákna

Listbox dalsia polozka — založil martin.007

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý