NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: zobrazenie obrázku z URL v JPanel spolu s Label textom

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
3012
Člen
Avatar
3012:25.7.2018 22:26

Dobrý večer, dnes som sa celí deň pokúšal prísť na to ako načítať obrázok z URL a zobraziť ho v JPaneli spolu s textovýmy Labelmy, na internete som našiel tento kód krorý som ako jediný s asi 5 kodov ktoré som tam obiavil bol schopný spojazdniť v svojom programe:

String path = "http://www.javalobby.org/images/jlmasthead_450x34.gif";
        URL url = new URL(path);
        BufferedImage image = ImageIO.read(url);
        JLabel label = new JLabel(new ImageIcon(image));
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(label);
        f.pack();
        f.setLocation(200,200);
        f.setVisible(true);

tento kód však obrázok zobrazuje v samostatnom okne mimi pôvodného okna s textom. preto som upravil môj kód takto:

String path = "https://www.google.sk/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png";

                url = new URL(path);
                BufferedImage image = ImageIO.read(url);
                JLabel label = new JLabel(new ImageIcon(image));
                panel.add(label);

tento kód je v jednej vetve podmienky, v ruhej je výpys textu, avšak nedokážem niako dosiahnuť zobrazenie obrázku v pneli. Jediným spôsobom ako text a obrázok zobraziť v jednom okne je dať ich do JFrame, taktiež jediný spôsob zobrazenia obrázku my fungoval cez JFrame. Strávil som nad tým celí ďeň, no neviem si s tým rady.

Za každú odpoveď som vďačný. ďakujem

 
Odpovědět
25.7.2018 22:26
Avatar
3012
Člen
Avatar
3012:26.7.2018 11:42

Dobrý večer, dnes som sa celí deň pokúšal prísť na to ako načítať obrázok z URL a zobraziť ho v JPaneli spolu s textovýmy Labelmy, na internete som našiel tento kód krorý som ako jediný s asi 5 kodov ktoré som tam obiavil bol schopný spojazdniť v svojom programe:

String path = "http://www.javalobby.org/images/jlmasthead_450x34.gif";
        URL url = new URL(path);
        BufferedImage image = ImageIO.read(url);
        JLabel label = new JLabel(new ImageIcon(image));
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(label);
        f.pack();
        f.setLocation(200,200);
        f.setVisible(true);

tento kód však obrázok zobrazuje v samostatnom okne mimi pôvodného okna s textom. preto som upravil môj kód takto:

String path = "https://www.google.sk/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png";

                url = new URL(path);
                BufferedImage image = ImageIO.read(url);
                JLabel label = new JLabel(new ImageIcon(image));
                panel.add(label);

tento kód je v jednej vetve podmienky, v ruhej je výpys textu, avšak nedokážem niako dosiahnuť zobrazenie obrázku v pneli. Jediným spôsobom ako text a obrázok zobraziť v jednom okne je dať ich do JFrame, taktiež jediný spôsob zobrazenia obrázku my fungoval cez JFrame. Strávil som nad tým celí ďeň, no neviem si s tým rady.

Za každú odpoveď som vďačný. ďakujem

 
Nahoru Odpovědět
26.7.2018 11:42
Avatar
3012
Člen
Avatar
3012:26.7.2018 11:50

Doríd ďeň, existuje prosím vás niaky spôsob, ako zobraziť obrázok načítaný z url adresi v JPaneli spolu s textom, v predošlom príspevku môžete vydieť čo som skúšal. Za odpovede ďakujem.

 
Nahoru Odpovědět
26.7.2018 11:50
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na 3012
Lubor Pešek:26.7.2018 11:58

Čau,

byl bych i rád, kdyby se tu rozpoutala diskuze, protože i když je swing v podstatě už deprecated, tak proč se i tak pro zajímavost něco nepřiučit:)
Nicméně za celou dobu, co jsem používal ve swingu obrázky, tak byly dvě možnosti, jak takový obrázek editovat.
Víc agresivní - že budeš při změně obrázku přidávat a odebírat panel - s tím souvisí i to, že všechny případné komponenty na tom panelu budeš muset vytvářet a nastavovat znova. Proto je to hodně zoufalé řešení a funguje jen, pokud jde o to zobrazit nějaký obrázek:

import java.awt.*;
import java.awt.image.BufferedImage;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.*;

/**
 * @author NcFerrari
 * @since 26.07.2018
 */
public class Frame extends JFrame {

        /******************************************************************************************************************/
        //=========================================== KONSTANTNI ATRIBUTY TRIDY ============================================
        //================================================ ATRIBUTY TRIDY ==================================================
        //========================================= KONSTANTNI ATRIBUTY INSTANCE ===========================================
        private final Toolkit toolkit = Toolkit.getDefaultToolkit();
        private final Dimension screenSize = toolkit.getScreenSize();
        private final JPanel rootPanel = new JPanel();
        private final JPanel inputPanel = new JPanel();
        private final JPanel centerPanel = new JPanel();
        private final JLabel text = new JLabel("Popisek na pevné pozici");
        private final FlowLayout flow = new FlowLayout();
        //============================================== ATRIBUTY INSTANCE =================================================
        private JPanel printingPanel = new JPanel();
        private JLabel informationTextForURLInput;
        private JTextField urlInputField;
        private JButton showImageInPanelButton;

        /******************************************************************************************************************/
        //============================================ PRISTUPOVE METODY TRIDY =============================================
        //================================================= METODY TRIDY ===================================================
        //================================================== KONSTRUKTOR ===================================================
        public Frame() {
                flow.setAlignment(FlowLayout.LEFT);
                prepareComponents();
                initFrame();
                initPanels();
        }
        //================================================ TOVARNI METODA ==================================================

        /******************************************************************************************************************/
        //============================================ KONECNE METODY INSTANCE =============================================
        //========================================== PRISTUPOVE METODY INSTANCE ============================================
        //================================================ METODY INSTANCE =================================================

        /******************************************************************************************************************/
        //================================================ SOUKROME METODY =================================================

        /**
         * Nastavi root frame tak, ze bude mit rozmery ve vychozim stavu podle aktualniho rozliseni obrazovky
         */
        private void initFrame() {
                setSize(screenSize.width, screenSize.height);
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                setVisible(true);
                setTitle("Zobrazovani obrázku z URL");
        }

        /**
         * Nastavi zakladni panely pro aplikaci, ktere budou definovat rozlozeni a umisteni konkretnich komponent
         */
        private void initPanels() {
                //nastaveni a pridani root panelu
                rootPanel.setBackground(Color.WHITE);
                rootPanel.setLayout(new BorderLayout());
                add(rootPanel);

                //nastaveni a pridani panelu pro vstupni hodnoty (inputPanel)
                inputPanel.setBackground(Color.GRAY);
                inputPanel.setLayout(flow);
                rootPanel.add(inputPanel, BorderLayout.NORTH);

                //pridani panelu, ktery bude v centru aplikace a bude komponenty zarovnavat v rade
                centerPanel.setBackground(Color.LIGHT_GRAY);
                centerPanel.setLayout(null);
                rootPanel.add(centerPanel, BorderLayout.CENTER);

                text.setSize(200, 70);
                centerPanel.add(text);

        }

        /**
         * Inicializuje a priradi komponenty
         * <li>poznamka: Pokud by slo o vetsi projekt, tak by v takovem pripade bylo vhodnejsi reseni, aby kazdy panel byla jednotliva trida a ta obsahovala svoje
         * vlastni komponenty v abstraktnich metodach, ale jde o cvicny priklad, tak to navrkam vsechno do jedne metody</li>
         */
        private void prepareComponents() {
                //komponenty panelu pro vstupni hodnoty (inputPanel)
                informationTextForURLInput = new JLabel("Zadejte URL obrázku, který chcete zobrazit");
                urlInputField = new JTextField("https://static.ferrarinetwork.ferrari.com/images/ferrari-488-pista-piloti-ferrari-2018-GATE-2_IFtAxpo9.jpg");
                showImageInPanelButton = new JButton("Zobraz obrázek v panelu");

                urlInputField.setPreferredSize(new Dimension(600, 25));
                showImageInPanelButton.addActionListener(evt -> showImageInPanelButtonActionListener());

                inputPanel.add(informationTextForURLInput);
                inputPanel.add(urlInputField);
                inputPanel.add(showImageInPanelButton);

        }

        private void showImageInPanelButtonActionListener() {
                try {
                        centerPanel.remove(printingPanel);
                        URL url = new URL(urlInputField.getText());
                        BufferedImage image = ImageIO.read(url);
                        printingPanel = new JPanel() {
                                @Override
                                public void paintComponent(Graphics g) {
                                        g.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), this);
                                }
                        };
                        printingPanel.setLocation(text.getX() + text.getWidth(), 0);
                        printingPanel.setSize(image.getWidth(), image.getHeight());
                        centerPanel.add(printingPanel);
                        centerPanel.repaint();
                } catch (Exception exp) {
                        JOptionPane.showMessageDialog(this, "Špatné URL obrázku! Nemůžu ho načíst\nURL, které jste zadali: " + urlInputField.getText(), "Wrong URL", 0);
                        exp.printStackTrace();
                }
        }
        //================================================== MAIN METODA ===================================================

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

        /******************************************************************************************************************/
        //=============================================== TESTOVACI METODY =================================================
        //================================================ SOUKROME TRIDY ==================================================
}

No a potom více objektové, ale může být taky nebezpečné řešení (pokud neumíš dobře používat dědičnost), je, že si vytvoříš novou třídu zděděnou z JPanelu, překryješ si takto metodu paintComponent a tím pádem si můžeš editovat obrázek. Všechny komponenty potom můžeš nastavit na tento panel a obrázek přepisuješ pouze setrem:
FRAME CLASS

import java.awt.*;
import java.awt.image.BufferedImage;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.*;

/**
 * @author NcFerrari
 * @since 26.07.2018
 */
public class Frame extends JFrame {

        /******************************************************************************************************************/
        //=========================================== KONSTANTNI ATRIBUTY TRIDY ============================================
        //================================================ ATRIBUTY TRIDY ==================================================
        //========================================= KONSTANTNI ATRIBUTY INSTANCE ===========================================
        private final Toolkit toolkit = Toolkit.getDefaultToolkit();
        private final Dimension screenSize = toolkit.getScreenSize();
        private final JPanel rootPanel = new JPanel();
        private final JPanel inputPanel = new JPanel();
        private final JPanel centerPanel = new JPanel();
        private final JButton buttonOnPicture = new JButton("Tlačítko na obrázku");
        private final FlowLayout flow = new FlowLayout();
        //============================================== ATRIBUTY INSTANCE =================================================
        private Panel printingPanel = new Panel();
        private JLabel informationTextForURLInput;
        private JTextField urlInputField;
        private JButton showImageInPanelButton;

        /******************************************************************************************************************/
        //============================================ PRISTUPOVE METODY TRIDY =============================================
        //================================================= METODY TRIDY ===================================================
        //================================================== KONSTRUKTOR ===================================================
        public Frame() {
                flow.setAlignment(FlowLayout.LEFT);
                prepareComponents();
                initFrame();
                initPanels();
        }
        //================================================ TOVARNI METODA ==================================================

        /******************************************************************************************************************/
        //============================================ KONECNE METODY INSTANCE =============================================
        //========================================== PRISTUPOVE METODY INSTANCE ============================================
        //================================================ METODY INSTANCE =================================================

        /******************************************************************************************************************/
        //================================================ SOUKROME METODY =================================================

        /**
         * Nastavi root frame tak, ze bude mit rozmery ve vychozim stavu podle aktualniho rozliseni obrazovky
         */
        private void initFrame() {
                setSize(screenSize.width, screenSize.height);
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                setVisible(true);
                setTitle("Zobrazovani obrázku z URL");
        }

        /**
         * Nastavi zakladni panely pro aplikaci, ktere budou definovat rozlozeni a umisteni konkretnich komponent
         */
        private void initPanels() {
                //nastaveni a pridani root panelu
                rootPanel.setBackground(Color.WHITE);
                rootPanel.setLayout(new BorderLayout());
                add(rootPanel);

                //nastaveni a pridani panelu pro vstupni hodnoty (inputPanel)
                inputPanel.setBackground(Color.GRAY);
                inputPanel.setLayout(flow);
                rootPanel.add(inputPanel, BorderLayout.NORTH);

                //pridani panelu, ktery bude v centru aplikace a bude komponenty zarovnavat v rade
                centerPanel.setBackground(Color.LIGHT_GRAY);
                centerPanel.setLayout(null);
                rootPanel.add(centerPanel, BorderLayout.CENTER);

                printingPanel.setLayout(null);
                centerPanel.add(printingPanel);

                buttonOnPicture.setSize(200, 70);
                printingPanel.add(buttonOnPicture);

        }

        /**
         * Inicializuje a priradi komponenty
         * <li>poznamka: Pokud by slo o vetsi projekt, tak by v takovem pripade bylo vhodnejsi reseni, aby kazdy panel byla jednotliva trida a ta obsahovala svoje
         * vlastni komponenty v abstraktnich metodach, ale jde o cvicny priklad, tak to navrkam vsechno do jedne metody</li>
         */
        private void prepareComponents() {
                //komponenty panelu pro vstupni hodnoty (inputPanel)
                informationTextForURLInput = new JLabel("Zadejte URL obrázku, který chcete zobrazit");
                urlInputField = new JTextField("https://static.ferrarinetwork.ferrari.com/images/ferrari-488-pista-piloti-ferrari-2018-GATE-2_IFtAxpo9.jpg");
                showImageInPanelButton = new JButton("Zobraz obrázek v panelu");

                urlInputField.setPreferredSize(new Dimension(600, 25));
                showImageInPanelButton.addActionListener(evt -> showImageInPanelButtonActionListener());

                inputPanel.add(informationTextForURLInput);
                inputPanel.add(urlInputField);
                inputPanel.add(showImageInPanelButton);

        }

        private void showImageInPanelButtonActionListener() {
                try {
                        URL url = new URL(urlInputField.getText());
                        BufferedImage image = ImageIO.read(url);
                        printingPanel.setImage(image);
                        printingPanel.setSize(image.getWidth(), image.getHeight());
                } catch (Exception exp) {
                        JOptionPane.showMessageDialog(this, "Špatné URL obrázku! Nemůžu ho načíst\nURL, které jste zadali: " + urlInputField.getText(), "Wrong URL", 0);
                        exp.printStackTrace();
                }
        }
        //================================================== MAIN METODA ===================================================

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

        /******************************************************************************************************************/
        //=============================================== TESTOVACI METODY =================================================
        //================================================ SOUKROME TRIDY ==================================================
}

PANEL CLASS

import java.awt.*;
import java.awt.image.BufferedImage;

import javax.swing.*;

/**
 * @author NcFerrari
 * @since 26.07.2018
 */
public class Panel extends JPanel {

        /******************************************************************************************************************/
        //=========================================== KONSTANTNI ATRIBUTY TRIDY ============================================
        //================================================ ATRIBUTY TRIDY ==================================================
        //========================================= KONSTANTNI ATRIBUTY INSTANCE ===========================================
        //============================================== ATRIBUTY INSTANCE =================================================
        private BufferedImage image;

        /******************************************************************************************************************/
        //============================================ PRISTUPOVE METODY TRIDY =============================================
        //================================================= METODY TRIDY ===================================================
        //================================================== KONSTRUKTOR ===================================================
        //================================================ TOVARNI METODA ==================================================

        /******************************************************************************************************************/
        //============================================ KONECNE METODY INSTANCE =============================================
        //========================================== PRISTUPOVE METODY INSTANCE ============================================
        public void setImage(BufferedImage image) {
                this.image = image;
                repaint();
        }

        //================================================ METODY INSTANCE =================================================
        @Override
        public void paintComponent(Graphics g) {
                g.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), this);
        }

        /******************************************************************************************************************/
        //================================================ SOUKROME METODY =================================================
        //================================================== MAIN METODA ===================================================

        /******************************************************************************************************************/
        //=============================================== TESTOVACI METODY =================================================
        //================================================ SOUKROME TRIDY ==================================================
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
26.7.2018 11:58
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:26.7.2018 12:02

PS: dík za nový poznatek:) v práci používáme proxy a ten mi to načítání obrázků blokoval:) Je to vcelku pochopitelné, ale než jsem si to uvědomil, tak jsem vrtěl hlavou jak holub:)

Jinak zkoušel jsem ty tvoje dva obrázky. Ten druhý načetl v poho a ten první mi pořád vypisoval IO exceptionu. Není to nějaký zabezpečený obrázek? Nemohl jsem se prostě k němu dostat, ale URL vypadá, že by to neměl být problém..
A ještě jsem si všiml, že jsem tam omylem nechal obrázek s Ferrari:) tak to se omlouvám, na tom jsem to testoval a nechtěl jsem to tam furt vkládat jak magor, takže to si kdyžtak odmaž:)

Editováno 26.7.2018 12:04
Nahoru Odpovědět
26.7.2018 12:02
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
3012
Člen
Avatar
3012:26.7.2018 16:24

ahoj veˇmy ti ďakujem za riešenie, čo sa týka prvého obrázku, skopýroval som kód z webu na ktorom som to našiel, preto ti nešiel načítať, pravdepodobne už ani nexistuje, len som sa chcel opýtať kde robým chybu, na priloženom obrázku je jeden eror ako ho odstránim?

 
Nahoru Odpovědět
26.7.2018 16:24
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:26.7.2018 16:30

Jednoduše... nakopíruješ si i třídu Panel, protože to je jeho metoda a ty ji voláš....-.-

Nahoru Odpovědět
26.7.2018 16:30
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:26.7.2018 16:33

ten druhý způsob (z mého pohledu lepší, protože přepisuješ metodu, ale nemusíš mazat komponenty, tak to jsou dvě třídy:) Koukám, že jsem to vcelku oddělil nepatrně, takže jsi možná omylem zkopčil obě třídy do jedné.

Nahoru Odpovědět
26.7.2018 16:33
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
3012
Člen
Avatar
3012:26.7.2018 16:35

a ešte , som sa chcel opýtať, ak som pomenoval triedu FRAME a druhú PANEL, ako ich zavolám v metode main ak mám napr tento kód:

else if (x == "a"){
//tu sa zavolá zobrazenie textu v JPanel
}
else if (x == "a"){
//tu sa zavolá zobrazenie obrázku v JPanel
}

Ďakujem

 
Nahoru Odpovědět
26.7.2018 16:35
Avatar
3012
Člen
Avatar
3012:26.7.2018 16:41

Nie v jednej triede mám len jeden zdroják celí obsah triedy vyzerá takto:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package anwendjournal;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.*;

/**
 *
 * @author michal
 */
public class FRAME  extends JFrame {

    /******************************************************************************************************************/
        //=========================================== KONSTANTNI ATRIBUTY TRIDY ============================================
        //================================================ ATRIBUTY TRIDY ==================================================
        //========================================= KONSTANTNI ATRIBUTY INSTANCE ===========================================
        private final Toolkit toolkit = Toolkit.getDefaultToolkit();
        private final Dimension screenSize = toolkit.getScreenSize();
        private final JPanel rootPanel = new JPanel();
        private final JPanel inputPanel = new JPanel();
        private final JPanel centerPanel = new JPanel();
        private final JButton buttonOnPicture = new JButton("Tlačítko na obrázku");
        private final FlowLayout flow = new FlowLayout();
        //============================================== ATRIBUTY INSTANCE =================================================
        private Panel printingPanel = new Panel();
        private JLabel informationTextForURLInput;
        private JTextField urlInputField;
        private JButton showImageInPanelButton;

        /******************************************************************************************************************/
        //============================================ PRISTUPOVE METODY TRIDY =============================================
        //================================================= METODY TRIDY ===================================================
        //================================================== KONSTRUKTOR ===================================================
        public FRAME() {
                flow.setAlignment(FlowLayout.LEFT);
                prepareComponents();
                initFrame();
                initPanels();
        }
        //================================================ TOVARNI METODA ==================================================

        /******************************************************************************************************************/
        //============================================ KONECNE METODY INSTANCE =============================================
        //========================================== PRISTUPOVE METODY INSTANCE ============================================
        //================================================ METODY INSTANCE =================================================

        /******************************************************************************************************************/
        //================================================ SOUKROME METODY =================================================

        /**
         * Nastavi root frame tak, ze bude mit rozmery ve vychozim stavu podle aktualniho rozliseni obrazovky
         */
        private void initFrame() {
                setSize(screenSize.width, screenSize.height);
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                setVisible(true);
                setTitle("Zobrazovani obrázku z URL");
        }

        /**
         * Nastavi zakladni panely pro aplikaci, ktere budou definovat rozlozeni a umisteni konkretnich komponent
         */
        private void initPanels() {
                //nastaveni a pridani root panelu
                rootPanel.setBackground(Color.WHITE);
                rootPanel.setLayout(new BorderLayout());
                add(rootPanel);

                //nastaveni a pridani panelu pro vstupni hodnoty (inputPanel)
                inputPanel.setBackground(Color.GRAY);
                inputPanel.setLayout(flow);
                rootPanel.add(inputPanel, BorderLayout.NORTH);

                //pridani panelu, ktery bude v centru aplikace a bude komponenty zarovnavat v rade
                centerPanel.setBackground(Color.LIGHT_GRAY);
                centerPanel.setLayout(null);
                rootPanel.add(centerPanel, BorderLayout.CENTER);

                printingPanel.setLayout(null);
                centerPanel.add(printingPanel);

                buttonOnPicture.setSize(200, 70);
                printingPanel.add(buttonOnPicture);

        }

        /**
         * Inicializuje a priradi komponenty
         * <li>poznamka: Pokud by slo o vetsi projekt, tak by v takovem pripade bylo vhodnejsi reseni, aby kazdy panel byla jednotliva trida a ta obsahovala svoje
         * vlastni komponenty v abstraktnich metodach, ale jde o cvicny priklad, tak to navrkam vsechno do jedne metody</li>
         */
        private void prepareComponents() {
                //komponenty panelu pro vstupni hodnoty (inputPanel)
                informationTextForURLInput = new JLabel("Zadejte URL obrázku, který chcete zobrazit");
                urlInputField = new JTextField("https://static.ferrarinetwork.ferrari.com/images/ferrari-488-pista-piloti-ferrari-2018-GATE-2_IFtAxpo9.jpg");
                showImageInPanelButton = new JButton("Zobraz obrázek v panelu");

                urlInputField.setPreferredSize(new Dimension(600, 25));
                showImageInPanelButton.addActionListener(evt -> showImageInPanelButtonActionListener());

                inputPanel.add(informationTextForURLInput);
                inputPanel.add(urlInputField);
                inputPanel.add(showImageInPanelButton);

        }

        private void showImageInPanelButtonActionListener() {
                try {
                        URL url = new URL(urlInputField.getText());
                        BufferedImage image = ImageIO.read(url);
                        printingPanel.setImage(image);
                        printingPanel.setSize(image.getWidth(), image.getHeight());
                } catch (Exception exp) {
                        JOptionPane.showMessageDialog(this, "Špatné URL obrázku! Nemůžu ho načíst\nURL, které jste zadali: " + urlInputField.getText(), "Wrong URL", 0);
                        exp.printStackTrace();
                }
        }
        //================================================== MAIN METODA ===================================================

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

        /******************************************************************************************************************/
        //=============================================== TESTOVACI METODY =================================================
        //================================================ SOUKROME TRIDY ==================================================


}
 
Nahoru Odpovědět
26.7.2018 16:41
Avatar
3012
Člen
Avatar
3012:26.7.2018 16:51

Prepáč no môj kód vyzerá tak ako ho vydíš na predošlom príspevku no ajtak tam mám ten error

 
Nahoru Odpovědět
26.7.2018 16:51
Avatar
3012
Člen
Avatar
3012:26.7.2018 16:54

a ak rozkliknem ten eror vypýše toto no žiadna z mozností ho nerieši:

 
Nahoru Odpovědět
26.7.2018 16:54
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:26.7.2018 17:55

Tak toto byl example, jak to má fungovat (popravdě, taky to není úplně kód, který bych pustil do éteru, dalo by se tam spoustu věcí vylepšit).
By bylo lepší, kdybys poskytl přímo celý kód. Třídu nejlíp použiješ tak, že si ji deklaruješ, zavoláš její instanci. Nebo prostě všechno, co je v main metodě ve třídě JFrame, tak narveš do té tvojí podmínkové větve. Způsobů je spousta.

K tomu, proč ti to nejde, tak jestli používáš jenom tu jednu třídu, tak jak jsem psal už výše. Potřebuješ vedle ní tu druhou classu - Panel. printingPanel není JPanel, ale Panel, který jsem si tam právě já definoval, abych mohl ten atribut měnit pomocí setteru a pak překreslit.

Udělej si úplně jednoduchou kontrolu. Když smažeš tu metodu setImage a necháš si u toho printingPanelu vypsat metody, tak co ti to vypíše? Ono totiž Panel je součástí standartní edice - je v Balíku java.awt. A jelikož já importuju v tom kódu celý balík, tak pokud ta třída neexistuje někde v tom projektu tak to vezme z toho balíku. A Panel metodu setImage nemá. To má ten můj, kde jsem ji definoval

Nahoru Odpovědět
26.7.2018 17:55
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
3012
Člen
Avatar
3012:26.7.2018 18:34

Ja mám definovane obe triedy vlastné:
trieda PANEL:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package anwendjournal;

import java.awt.*;
import java.awt.image.BufferedImage;

import javax.swing.*;

/**
 *
 * @author michal
 */
public class PANEL extends JPanel {

    /******************************************************************************************************************/
        //=========================================== KONSTANTNI ATRIBUTY TRIDY ============================================
        //================================================ ATRIBUTY TRIDY ==================================================
        //========================================= KONSTANTNI ATRIBUTY INSTANCE ===========================================
        //============================================== ATRIBUTY INSTANCE =================================================
        private BufferedImage image;

        /******************************************************************************************************************/
        //============================================ PRISTUPOVE METODY TRIDY =============================================
        //================================================= METODY TRIDY ===================================================
        //================================================== KONSTRUKTOR ===================================================
        //================================================ TOVARNI METODA ==================================================

        /******************************************************************************************************************/
        //============================================ KONECNE METODY INSTANCE =============================================
        //========================================== PRISTUPOVE METODY INSTANCE ============================================
        public void setImage(BufferedImage image) {
                this.image = image;
                repaint();
        }

        //================================================ METODY INSTANCE =================================================
        @Override
        public void paintComponent(Graphics g) {
                g.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), this);
        }

        /******************************************************************************************************************/
        //================================================ SOUKROME METODY =================================================
        //================================================== MAIN METODA ===================================================

        /******************************************************************************************************************/
        //=============================================== TESTOVACI METODY =================================================
        //================================================ SOUKROME TRIDY ==================================================

}

trieda FRAME:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package anwendjournal;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.*;

/**
 *
 * @author michal
 */
public class FRAME  extends JFrame {

    /******************************************************************************************************************/
        //=========================================== KONSTANTNI ATRIBUTY TRIDY ============================================
        //================================================ ATRIBUTY TRIDY ==================================================
        //========================================= KONSTANTNI ATRIBUTY INSTANCE ===========================================
        private final Toolkit toolkit = Toolkit.getDefaultToolkit();
        private final Dimension screenSize = toolkit.getScreenSize();
        private final JPanel rootPanel = new JPanel();
        private final JPanel inputPanel = new JPanel();
        private final JPanel centerPanel = new JPanel();
        private final JButton buttonOnPicture = new JButton("Tlačítko na obrázku");
        private final FlowLayout flow = new FlowLayout();
        //============================================== ATRIBUTY INSTANCE =================================================
        private Panel printingPanel = new Panel();
        private JLabel informationTextForURLInput;
        private JTextField urlInputField;
        private JButton showImageInPanelButton;

        /******************************************************************************************************************/
        //============================================ PRISTUPOVE METODY TRIDY =============================================
        //================================================= METODY TRIDY ===================================================
        //================================================== KONSTRUKTOR ===================================================
        public FRAME() {
                flow.setAlignment(FlowLayout.LEFT);
                prepareComponents();
                initFrame();
                initPanels();
        }
        //================================================ TOVARNI METODA ==================================================

        /******************************************************************************************************************/
        //============================================ KONECNE METODY INSTANCE =============================================
        //========================================== PRISTUPOVE METODY INSTANCE ============================================
        //================================================ METODY INSTANCE =================================================

        /******************************************************************************************************************/
        //================================================ SOUKROME METODY =================================================

        /**
         * Nastavi root frame tak, ze bude mit rozmery ve vychozim stavu podle aktualniho rozliseni obrazovky
         */
        private void initFrame() {
                setSize(screenSize.width, screenSize.height);
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                setVisible(true);
                setTitle("Zobrazovani obrázku z URL");
        }

        /**
         * Nastavi zakladni panely pro aplikaci, ktere budou definovat rozlozeni a umisteni konkretnich komponent
         */
        private void initPanels() {
                //nastaveni a pridani root panelu
                rootPanel.setBackground(Color.WHITE);
                rootPanel.setLayout(new BorderLayout());
                add(rootPanel);

                //nastaveni a pridani panelu pro vstupni hodnoty (inputPanel)
                inputPanel.setBackground(Color.GRAY);
                inputPanel.setLayout(flow);
                rootPanel.add(inputPanel, BorderLayout.NORTH);

                //pridani panelu, ktery bude v centru aplikace a bude komponenty zarovnavat v rade
                centerPanel.setBackground(Color.LIGHT_GRAY);
                centerPanel.setLayout(null);
                rootPanel.add(centerPanel, BorderLayout.CENTER);

                printingPanel.setLayout(null);
                centerPanel.add(printingPanel);

                buttonOnPicture.setSize(200, 70);
                printingPanel.add(buttonOnPicture);

        }

        /**
         * Inicializuje a priradi komponenty
         * <li>poznamka: Pokud by slo o vetsi projekt, tak by v takovem pripade bylo vhodnejsi reseni, aby kazdy panel byla jednotliva trida a ta obsahovala svoje
         * vlastni komponenty v abstraktnich metodach, ale jde o cvicny priklad, tak to navrkam vsechno do jedne metody</li>
         */
        private void prepareComponents() {
                //komponenty panelu pro vstupni hodnoty (inputPanel)
                informationTextForURLInput = new JLabel("Zadejte URL obrázku, který chcete zobrazit");
                urlInputField = new JTextField("https://static.ferrarinetwork.ferrari.com/images/ferrari-488-pista-piloti-ferrari-2018-GATE-2_IFtAxpo9.jpg");
                showImageInPanelButton = new JButton("Zobraz obrázek v panelu");

                urlInputField.setPreferredSize(new Dimension(600, 25));
                showImageInPanelButton.addActionListener(evt -> showImageInPanelButtonActionListener());

                inputPanel.add(informationTextForURLInput);
                inputPanel.add(urlInputField);
                inputPanel.add(showImageInPanelButton);

        }

        private void showImageInPanelButtonActionListener() {
                try {
                        URL url = new URL(urlInputField.getText());
                        BufferedImage image = ImageIO.read(url);
                        printingPanel.setImage(image);
                        printingPanel.setSize(image.getWidth(), image.getHeight());
                } catch (Exception exp) {
                        JOptionPane.showMessageDialog(this, "Špatné URL obrázku! Nemůžu ho načíst\nURL, které jste zadali: " + urlInputField.getText(), "Wrong URL", 0);
                        exp.printStackTrace();
                }
        }
        //================================================== MAIN METODA ===================================================

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

        /******************************************************************************************************************/
        //=============================================== TESTOVACI METODY =================================================
        //================================================ SOUKROME TRIDY ==================================================


}

prepáč ale nemôžem sem dať celí kód, ulohu aplikácie chcem udržať v utajení, každopádne mám v programe obe triedy FRAME aj PANEL a potrebujem načítať a zobraziť obrázok z webu ak je splnená táto podmienka:

if ("txt".equals(premenna) { //text

                panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

                //int maxTextDlzka = 200;
                //int textDlzka = parameter.length(); //System.out.println(textDlzka);
                //String medzera = " ";
                //while (textDlzka != maxTextDlzka){
                //parameter = parameter + medzera;
                //textDlzka = parameter.length();
                //}

                parameter = "          " + parameter;
                //System.out.println(textDlzka);
                JLabel text = new JLabel(parameter);
                panel.add(text); //obrázok potrebujem zobraziť v totožnom panely


           }

else if ("img".equals(premenna)) { //obrázok
                //neviem aký kód mám napísať sem


        }

premenná url predá adresu z ktorej sa má načítať obrázok a zobraziť sa v paneli spolu s textom v rovnakom panely z názvom panel. Celé podmenky sú obalené while ciklom.

 
Nahoru Odpovědět
26.7.2018 18:34
Avatar
3012
Člen
Avatar
3012:26.7.2018 18:36

teda premenná v podmenke má predať url adresu obrázku a ten sa maá zobraziť v paneli rovnako ako text

 
Nahoru Odpovědět
26.7.2018 18:36
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:26.7.2018 18:37

VOLE!!!!
No to se nediv. Jestli sis pojmenoval tu třídu PANEL
A v deklaraci ji chceš volat:

private Panel printingPanel = new Panel();

Tak jak by ti to potom mohlo fungovat....?-.-
Přejmenuj buď typ v deklaraci na

private PANEL printingPanel = new PANEL();

a nebo přejmenuj tu třídu....
Dochází přesně k tomu, co jsem říkal - JVM se snaží zavolat tu třídu z balíku, jenže ať dělá co dělá, java.awt.Panel prostě metodu setImage nezná.

Kdes to viděl takhle pojmenovávat třídy?? tukane:)

Editováno 26.7.2018 18:38
Nahoru Odpovědět
26.7.2018 18:37
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:26.7.2018 18:51
  1. Měj v projektu tu třídu Panel (nebo si to třeba nazvy MyPanel, to by možná bylo i lepší)
  2. Předpokládám, že tvoje proměnná panel je typu JPanel, tak to musíš deklarovat právě tak, že napíšeš MyPanel panel = new MyPanel();

Případně, pokud to uděláš tak, jak to mám já, tak klidně můžeš použít JPanel panel = new MyPanel();
Pokud to dědíš, bude to fungovat i takto. Dokonce je to šikovnější.

  1. Zkus tam napísať:
try {
                        URL url = new URL(img); // <-- v pripade, ze ta promenna img je adresa toho obrazku, jinak tam pochopitelne patri ta adresa
                        BufferedImage image = ImageIO.read(url);
                        printingPanel.setImage(image); // <-- misto printingPanel tam dej nazev svojeho panelu.takže panel.setImage(image);
                        printingPanel.setSize(image.getWidth(), image.getHeight());  // <--- to same i tu, bude tam panel, ne printingPanel
                } catch (Exception exp) {
                        JOptionPane.showMessageDialog(this, "Špatné URL obrázku! Nemůžu ho načíst\nURL, které jste zadali: " + urlInputField.getText(), "Wrong URL", 0);
                        exp.printStackTrace();
                }

Ta třída MyPanel, pokud ji zdědíš, tak bude obsahovat všechny metody, které obsahuje JPanel. Ty v té třídě jen budeš šahat do třídy paintComponen­t(Graphics). Na první pohled to vypadá, jako obcházení zapouzdření, ale v podstatě ty si budeš nastavovat svoji vlastní proměnnou. Je to nešikovné, bylo by lepší, kdyby mohl rovnou nastavit ten obrázek jako parametr, ale jak jsem psal úvodem. Já jsem doteď jiný způsobem ve swingu nenašel:(
Java FX a JSP to už řeší nádherně přes csska, ale swing má i hodně divnou techniku vykreslování. Hlavně pokud jde o vlákna,tak swing na ně prostě není dobrý.

Snad někdo ještě postne lepší řešení. Tohle je řešení takové hrubé síly. Že to sice funguje, ale není to nejčistší, když v podstatě šaháš do logiky metody předka.

Nahoru Odpovědět
26.7.2018 18:51
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
3012
Člen
Avatar
3012:26.7.2018 22:49

ten posledný kód try a catch mám napýsať do vetvi podmienky?

 
Nahoru Odpovědět
26.7.2018 22:49
Avatar
3012
Člen
Avatar
3012:27.7.2018 8:48

Ahoj, ne neviem sa v tom už orientovať, mohol by si mi sem dať celí ten tvoj projekt na ktorom si testoval, možno ak uvidím ako funguje budem ho vedieť lepšie použiť. Mislím tím či bi si sem nedal ten funkčný projekt ktorý by zobrazil ten obrázok, napr. v zipe ďakujem.

 
Nahoru Odpovědět
27.7.2018 8:48
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:27.7.2018 10:38

Čau,

ten projekt obsahoval jen ty dvě třídy (bez jiných balíčků)
Obě třídy máš k dispozici.

Nejdřív ti napíšu postup a pak ti vynadám...

  1. Vytvoř si nový projekt (testováno v Idei, BlueJ a i jsem si kvůli tobě stáhl netbeany:) ). Pojmenuj si ho třeba Test, ať je sranda:)
  2. V testu vytvoř dvě třídy: Frame, Panel (dodržuj velikost písmen)
  3. zkopíruj obě třídy, které jsem sem postoval (Frame do Frame, Panel do Panelu:) pro jistotu to píšu)
  4. Jelikož není potřeba žádná externí knihovna, tak by ti měli obě třídy jít přeložit (Frame ti bude nejdřív chvilku držkovat, protože nebude znát tu metodu ze třídy Panel, ale jak tam nakopíruješ panel, tak vše funguje)
  5. Spusť nový projekt tak, že třída Frame bude main class (jestli používáš netbeany, tak přejdi do třídy Frame a dej Shift + F6)
  6. aplikace se spustí (pokud máš problém s tímto bodem, tak to napiš)
  7. Zadej do text fieldu link svojeho obrázku (funguje jak JPG, tak PNG tak i GIF, i když gif se nebude promítat, bude to jen konstantní obrázek)
  8. Pokud budeš mít problém s načítáním obrázku, je možné, že tě nepustí firewall. Tak si ho vypni nebo nastav proxy, i když do toho se radši nepouštěj... je to peklo, tak radši vypni firewall
  9. uživej si, že to funguje

A pokud jsi došel až k bodu 9, tak tě (v dobrém) chci trošku seřvat....
Proč se sakra pouštíš do takovýchto poměrně už komplikovanějších projektů?:( Pokud se ptáš, kam a jak máš implementovat vzorový úkol, tak mi to přijde podezřelé. Prošel sis zdejší tutoriály? Já je teď procházím ještě s jedním borcem, kterého učím na dálku. Jsou fakt dobré a některým tvým otázkám by ses vyhnul. Chápu, že chceš, abys už mohl předvést okýnko a ukázat mamce, jak si tam přidáš obrázek a že když se klikne na tlačítko, tak to něco vykoná. Ale pokud budeš brát programování takovým způsobem, že někde něco nějak zkopíruješ a bude to fungovat, tak je to špatně a zkazí tě to:(
Na těchto stránkách je výborná zejména jedna věc. Že když se tu předvádí vzorová řešení, tak je u toho i ten komentář, proč to tak je a jakým způsobem by se mělo u programování přemýšlet.
Možná máš už nějakou zkušenost, ale máš v tom evidentně zmatek. Buď si někoho domluv a dělej pár projektů pod něčím dohledem (je tu spousta ochotných maníků, včetně mě, kteří ti rádi poradí a naučí tě krok za krokem, jak máš uvažovat. Někteří si to zpoplatní, ale furt lepší někomu poslat 500,- za pár hodin učení, než si za 200,- koupit krabku cigaret na dva dny - to netvrdím, že to musí být zrovna tvůj případ, neznám tě, ale dal jsem to jako příklad. Že investice do něčeho takového se určitě vyplatí.
Věřím, že když si projdeš reakce tady na foru, vybereš si týpka, který má vysokou auru, spoustu akceptovaných řešení a aktivně komentuje a že když mu napíšeš, jestli by tě nedoučil, tak tě odmítne malé procento lidí. ITáci jsou v praxi velmi kolektivní a rádi předávají zkušenosti. Obzvlášť, že právě při takovémto učení si sami uvědomí věci, které jim byly trošku nejasné atd:) To jednou možná poznáš.

Proto bych být tebou nějak dokončil tento projekt, ale určitě si pořádně osvojil základy. Zatím se ubíráš špatným směrem a to, že aplikace funguje, neznamená, že je to dobře.

Nahoru Odpovědět
27.7.2018 10:38
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
3012
Člen
Avatar
3012:27.7.2018 13:00

Ahoj, musím isť teraz niečo vybaviť takže postup ktorí si mi napísal a za ktorí ti ďakujem, skúsim za cvíľu.
Čo sa tíka tvojich pripomienok, ja mám prečítanú celú knihu java bez předchzích znalostí, a tým pádom som prešiel teoriu ohľadom tried, obiektov a dedičnosti. okrem toho som sa naučil základnú konštrukciu mnohých ďalších jazykov od Pythonu, VB.net, aj z oop, javaScript, ObjectiveC, az z OOP, niečo z PHP tuto z itnetwork, no a teda mám naštudovaný prebitok teorie ale takmer žiadnu prax. Viem ze zkopirovaním kódu s internetu bez porozumenia sa nič nevyrieši, to som robil na uplnom začiatku, keď som sa pokúšal tvori hru. Až potom som sa začal učiť programovacie jazyky. Teraz sice ovládam teoriu okolo programovania, no nemám vytvorený žiadny kompletný projekt hoci som ich už pár začal. Pocopnie cudzieho kódu zvládam iba vtedy ak sa jedná o pár riadkov, no netušil som že zobraziť ten obrézok bude také ťazké, ja sa snažim rozumieť svojmu kódu, no ja si pomenovávam svoje premenné, objekty a triedy v slovenčine aby som ich rozoznal od tých vstavaných do jazyka a ak my potom niekdo poskitne dlhší kód v ktorom použije vlastné anglické identifikátory ťažko sa mi potom v jeho kóde orientuje. Ja mám najradšej svoj vlastný kód, ktorý od niekaľ nemusím kopírovať, to som sa už pri snahe o "vývoj hier" naučil, pretože som síce naprogramoval pohyblivú kocku, no nebol som v kóde schopný nič zmeniť. No ako som už spomínal študiu jazykov som venoval posledné 3 roky a rád by som už vytvoril vlastný projekt kím sa začnem učiť ďalší jazyk. ešte raz ďakujem za postup, vyskúšam ho a skúsom ho potom až ho aspoň trochu pochopým upraviť implementovať do projektu. jedná sa len o to že by som už chcel vytvoriť aj niečo vlastné a originálne a nie len dookola programovať hello world, kalkulačku, či jednoduchú databázu použivaťeľov v OOP.

 
Nahoru Odpovědět
27.7.2018 13:00
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na 3012
Lubor Pešek:27.7.2018 16:41

Neber to pochopitelně ode mě ve zlém. Já se ti snažím pomoct a vyvarovat tě špatných postupů.
Bohužel, tohle je jeden z nich:(

V praxi NIKDY nebudeš ťukat vlastní kód od a do z. Spíš právě naopak - musíš umět pochopit stávající kód. A toto je ještě v pohodě. Tady tě odkazuje přímo IDE. Ale až se dostaneš do styku s frameworkem a budeš muset vše domýšlet, to je potom parádička:)

Divaj, něco tě naučím;)

Když bude někdo tak hodný, jako já:) a poskytne ti kompletně celý kód. Tak třeba ti to ukážu tady na tomto pidi projektu.
Pokud se jedná o standartní edici, tak můžeš počítat s jedním faktem.

  1. KAŽDÝ PROJEKT ZAČÍNÁ METODOU MAIN!

Takže první co uděláš je, že v IDE vyhledáš main class. V netbeansech to jde i lehce - u projektu klikneš pravým, zadáš properties a v položce run vidíš, která třída se v projektu spouští jako main class.
Tak v této třídě najdeš main metodu A tam to všechno začíná.
(Pro zajímavost - v IDEI spouštěcí classu vidíš hned v pravém horním rohu, kde si můžeš v combo boxu rychle nastavit, která z class je main. Prostě IDEA je jednoznačně top a čím dál tím víc zjišťuji, že ti pomáhá velmi rychle k vyhledávání)
Tak tady máš v main metodě jen jeden příkaz.

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

Což už vidíš hned na první pohled - zavoláš bezparametrický konstruktor třídy Frame;
Tak se přesuneš do konstruktoru.

  1. Konstruktor -máš tu 4 další příkazy:
public Frame() {
                flow.setAlignment(FlowLayout.LEFT);
                prepareComponents();
                initFrame();
                initPanels();
        }

flow. Je to očividně nějaký objekt, který volá metodu setAlignment. Tak se podíváš, co je flow. Pak se podíváš, co asi ta metoda může dělat.
pak jsou tu 3 metody. Tak se do nich přepneš. Možná bude u nich i nějaký komentář.
Atd. atd. atd. Už nemám čas to psát, chcu jít dom:D

Prostě začni main metodou a odkazuj se. IDEA, NetBeans i Eclipse mají skvělou vlastnost. Jump to declaration.
Můžeš použít i zkratku. CTRL + Left mouse button.
To tě bude přesměrovávat do metod a do deklarace proměnných. Díky tomu můžeš hezky zjistit, co jak kdy proč.

A takhle se hledá a v praxi je toto naprosto běžné. Nesmíš se na Třídy dívat jako na posloupnost metod, které budou napsány v pořadí, jak se budou používat. Prostě do nich skáčeš. Horší je, když máš metodu, ve které je 1300 řádků a ve které je 50 logických bloků a ještě ideální, když 40 logických bloků je vnořených ifama do sebe.... To je pak paráda orientace..

Zkus si to na tomto příkladě a klidně si to i sám komentuj. flow - je to proměnná FlowLayoutu. Hmmm layout.... to bude asi nějak definovat grafické rozhraní panelu. Takže flow je layout. A tou metodou setAlignment nastavuju jeho vlastnost. A pak ho někde jenom použiju. Fajn. Co dál? Metody - aha tak tato metoda udělá tohle a tohle.

Toto je třeba ukázka, jak bys měl i ten kód psát. Já jsem rozdělil celé grafické rozhraní na 3 bloky (metody) a přitom by to šlo všechno navrkat jen do jedné metody. Ale takhle vím, že všechno, co se bude týkat panelů, tak je v metodě initPanels()
Uznávám.... teď mi dochází, že ten layout by taky mohl být v této metodě:D:D:D vidíš jaký jsem ňouma:D Sám tě školím a sám dělám chyby:)

Snažil jsem se i navrkat tam nějaké jednoduché komentáře, tak snad tě navedou (dobrý komentář poznáš tak, že nemusíš metodu studovat, ale hned po přečtení komentáře pochopíš, na co ta metoda slouží. Komentář typu: "v této metodě je cyklus" je pičovina. Komentářem bys mohl i definovat, k čemu ta metoda bude sloužit a potom se tím řídit.
A potom tě to i samotného navede. Když budeš mít metodu třeba graphicInterface() a u ní komentář typu: "tato metoda slouží pro vykreslování přednastavených komponent"
Tak bys do takové metody neměl rvát třeba načítání z databáze.... Ano, šlo by třeba o jeden řádek. Ale to je jeden řádek teď a logiku metody by to totálně narušilo. A nikdy si neříkej, že jeden řádek je v pohodě. Za týden zjistíš, že potřebuješ ten jeden řádek rozšířit nebo tam přidat další 3. I kvůli jednomu řádku (což může vypadat směšně) je dobré vytvořit novou metodu, klidně i třídu či balíček, pokud to dobře zdůvodníš a okomentuješ.

Příklad - já třeba využívám svoji třídu TFile. (T, protože je v mojem vlastním balíku tools). Tato třída mi generuje soubor, umí z něj číst, přidávat, přepisovat, mazat text atd. A začal jsem tím, že to byla jedna třída v samotném balíčku. Ale protože logika byla taková, že je to pomocný nástroj, tak teď jsem tam třeba lupl i generátor textu, když potřebuju třeba v unitových testech rychle generovat nějak jména nebo náhodná písmena. Případně když testuji case sensitive field, tak to taky využiju. A mám tam ještě další třídy. Ale začalo to jedním balíkem. Ale teď, když bych třeba potřeboval novou třídu... já nevím, XMLGenerator třeba. Tak to šoupnu do balíku tools.
Prostě dodržuju tu logiku. A taky bych mohl úplně na začátku všechno rvát do základního bylíku, možná i ten generátor souboru by mohla být samotná metoda v nějaké třídě. Ale protože nad tím uvažuju, tak to má nějaký smysl.

Hlavně nikdy nepleť spoustu logických operací do sebe. Jako příklad ti dám třeba Třídu noha. Noha bude asi nějak vypadat (takže metoda vykresli() ), pak se bude nějak ohýbat (metoda ohniV(Kloub) ) a třeba metoda pohyb(). Ale i když metoda pohyb bude mít jednoduchou definici, která by mohla být v metodě vykresli, tak proč bych to tam rval? Prostě pokud má něco vykreslovat, tak tam nebudu cpát další logiku, když nemusím....

Nahoru Odpovědět
27.7.2018 16:41
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
3012
Člen
Avatar
3012:27.7.2018 18:32

Ahoj už som to podľa tvojho postupu spojazdnil, a fungovalo to bez problémov, začal som to upravovať, pre potreby môjho software no zatiaľ to nefunguje s moji pôvodným kódom tak ako potrebujem, čiže sa s tým skúšam hrať, mimocodom ďakujem za rady ako pristupovať k cudziemu kódu uvedené v tvojom poslednom príspevku.

 
Nahoru Odpovědět
27.7.2018 18:32
Avatar
3012
Člen
Avatar
3012:28.7.2018 13:40

Ahoj, už všetko funguje tak ako má. Ďakujem ti že si sa bol ochotný venovať môjmu problému a za všetky tvoje rady.

 
Nahoru Odpovědět
28.7.2018 13:40
Avatar
3012
Člen
Avatar
3012:28.7.2018 14:06

a skoro som zabudol, možno ťa teraz na oplátku naučím zas niečo ja, obrázok z url zobrázíš v okne týmto kódom:

public class Test {
/**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws MalformedURLException, IOException {
        // TODO code application logic here
        String path = "https://www.google.sk/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png";

        JFrame okno = new JFrame("zobrazenie obrazku");
        okno.setVisible(true);
        okno.setSize(600, 600);
        okno.setLocationRelativeTo(null);
        okno.setResizable(false);
        okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
            panel.setLocale(null);
            okno.add(panel);

        URL url = new URL(path);
                BufferedImage image = ImageIO.read(url);
                JLabel label = new JLabel(new ImageIcon(image));
                panel.add(label);
                okno.setVisible(true);
}
}
 
Nahoru Odpovědět
28.7.2018 14:06
Avatar
Odpovídá na 3012
Matúš Olejník:28.7.2018 14:19

Už to že to je cele takto v metóde main nie je úplne dobre ;)

Nahoru Odpovědět
28.7.2018 14:19
/* I am not sure why this works but it fixes the problem */
Avatar
3012
Člen
Avatar
3012:28.7.2018 15:20

sem som uviedol len príklad ako zobraziť obrázok, môj software je oveľa zložitejší a jeho kód nieje vložený celí v main

 
Nahoru Odpovědět
28.7.2018 15:20
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na 3012
Lubor Pešek:28.7.2018 18:36

Z praktického hlediska bych obrázky do popisku moc nerval. Vím, že to jde (a javaFX naštěstí využívá obrázky v Labelu víc logičtěji), ale používá se to, když chceš v labelu třeba zobrazit smajlíka případně dát tam obrázek v mezi textu.

Ale zkus si představit aplikaci, kde máš popisek. Dejme tomu, že by se do něj generoval text na základě inputu od uživatele. Pokud bys to nastavil tak, že by tam mohl vkládat buď text nebo obrázek, tak se může stát, že ti ten label rozhodí celé formátování stránky a může to vypadat hnusně. Label slouží hlavně jako jednořádkový popisek. Ale tak, jak jsi to teď použil, tak proč ne. Jenom... potom právě až se budeš dívat na ten svůj kód za 5 let, tak si uvědom, co uvidíš.

Uvidíš deklarovaný label. Co si řekneš? Aha, tady bude popisek. Pustíš aplikaci, budeš hledat popis a uvidíš obrázek. Tak řekneš ku*** drát, kde je ten popis a pak budeš muset louskat kód, a zjišťovat, kdy a proč je v tomto labelu obrázek.

Ok, jde to a neříkám, že v tomto ukázkovém řešení je to špatné - to že to narveš do main metody, tak bych neviděl tak zle, jak ostatní. Taky to dělám, když chci vyzkoušet jedinou funkčnost a nechci se srát s vymýšlením názvů metod:) (i když už i v takové blbosti jsi porušil to, co jsem ti psal.... Rozdělíš to na logické bloky a pak v Bloku, kde načítáš obrázek, tak zároveň vytváříš label a ještě hůř, pak nastavuješ viditelnost okna. Je to blbůstka a fakt to není v tomto případě podstatné. Ale měl by ses učit už nějaké zásady právě na tady takových malinkých projektech. Vím o čem mluvím. Nové věci se učí velmi snadno. Ale je někdy nemožné odnaučit se zlozvyky.
Jako příklad ti uvedu sám sebe. Já jsem se naučil psát na české klávesnici. Naučil jsem se používat zkratky a mám to v ruce. Neznám v práci nikoho, kdo by používal anglickou klávesnici. A když třeba u řešíme problém buď já u nich nebo oni u mě, tak co řádek příkazů, to překlepy. A jen proto, že používáme odlišné klávesky a já se nechci pochopitelně přeučovat, protože to mám vžité do ruky.

Je to problém a možná bych to měl kvůli týmu změnit, ale pokud budu ťukat kód u sebe a nebudu potřebovat často poradit, tak to bude sice nepříjemné, ale nic zásadního. Ale je to zlozvyk.

Takže ok, sice tě zklamu, protože jsi mě nic nenaučil:) (v podstatě jsi použil ten kód, který jsi měl i sám na začátku a který jsem já použil pro JPanel a pochopitelně pokud už máš obrázek ve třídě Image, tak ho můžeš použít kdekoliv jako komponentu), ale zamysli se hlavně nad praktickým využitím. Toto je pochopitelně hodně komplikované, protože nikde nemáš napsané, pro co je to či ono vhodné použít.

Ale jinak dobrá snaha:) A už to uzavřem. Už jen díky těm kódům je toto vlákno samo o sobě velký spam

Nahoru Odpovědět
28.7.2018 18:36
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
3012
Člen
Avatar
3012:28.7.2018 19:22

V poriadku, ešte raz za všetko Ďakujem, a chcel som len že som spokojný s tým ako to funguje pre potreby môjho softwate je to ideálne, funguje presne ako potrebujem.

 
Nahoru Odpovědět
28.7.2018 19:22
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 29 zpráv z 29.