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.
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
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 ==================================================
}
+20 Zkušeností
+2,50 Kč
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ž:)
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?
Jednoduše... nakopíruješ si i třídu Panel, protože to je jeho metoda a ty ji voláš....-.-
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é.
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
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 ==================================================
}
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
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.
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:)
- Měj v projektu tu třídu Panel (nebo si to třeba nazvy MyPanel, to by možná bylo i lepší)
- 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ší.
- 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
paintComponent(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.
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.
Č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...
- 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:)
- V testu vytvoř dvě třídy: Frame, Panel (dodržuj velikost písmen)
- zkopíruj obě třídy, které jsem sem postoval (Frame do Frame, Panel do Panelu:) pro jistotu to píšu)
- 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)
- 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)
- aplikace se spustí (pokud máš problém s tímto bodem, tak to napiš)
- 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)
- 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
- 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.
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.
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.
- 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.
- 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....
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.
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);
}
}
Matúš Olejník:28.7.2018 14:19
Už to že to je cele takto v metóde main nie je úplne dobre
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
Zobrazeno 29 zpráv z 29.