Vícenásobné použití stejné komponenty – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vícenásobné použití stejné komponenty – Java – Fórum – Programujte.comVícenásobné použití stejné komponenty – Java – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Nicolas0
Návštěvník
13. 12. 2012   #1
-
0
-

Ahoj lidi,

měl bych takový začátečnický problém :-) raději jsem vytvořil krátký příklad níže. 

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class MainClass {
    public static void main(String[] args) {
        nazev apl = new nazev();
    }
}
class nazev extends JFrame {

String SvarA;

JTabbedPane tabbedPane = new JTabbedPane();
JPanel panel1 = new JPanel();

JButton button1 = new JButton("Go");
JButton button2 = new JButton("Go");
JButton button3 = new JButton("Go");

JTextField field1 = new JTextField(5);
JTextField field2 = new JTextField(5);
JTextField field3 = new JTextField(5);

JComboBox box1 = new JComboBox();
JComboBox box2 = new JComboBox();
JComboBox box3 = new JComboBox();

public nazev () {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible (true);
getContentPane().setLayout (new BorderLayout());
getContentPane().add(panel1,BorderLayout.CENTER);

panel1.add(box1);
panel1.add(button1);
panel1.add(field1);

panel1.add(box2);
panel1.add(button2);
panel1.add(field2);

panel1.add(box3);
panel1.add(button3);
panel1.add(field3);

button1.addActionListener (new ActionButton1());
button2.addActionListener (new ActionButton2());
button3.addActionListener (new ActionButton3());

box1.addItem("A");
box1.addItem("B");
box1.addItem("C");
box1.addItem("D");

box2.addItem("A");
box2.addItem("B");
box2.addItem("C");
box2.addItem("D");

box3.addItem("A");
box3.addItem("B");
box3.addItem("C");
box3.addItem("D");

setSize (170,140);
    }

        class ActionButton1 implements ActionListener {
        public void actionPerformed(ActionEvent e) {

            SvarA = box1.getSelectedItem().toString();
            field1.setText(SvarA);
	}
    }
        class ActionButton2 implements ActionListener {
        public void actionPerformed(ActionEvent e) {

            SvarA = box2.getSelectedItem().toString();
            field2.setText(SvarA);
        }
    }
        class ActionButton3 implements ActionListener {
        public void actionPerformed(ActionEvent e) {

            SvarA = box3.getSelectedItem().toString();
            field3.setText(SvarA);
        }
    }
}

Všimněte si, mám tam box1, box2 a box3, ale to je jen příklad, ve skutečnosti jich potřebuji udělat mnohem více (aby si uživatel mohl z předem nedefinovaného množství řádků vybrat předdefinovanou variantu). Podle mě je nesmysl tam vytvářet takhle třeba sto Comboboxů?

Poraďte prosím, jak se to standardně řeší, nebo jak se alespoň řešení jmenuje, abych si to mohl najít.

Předem díky, N.

Nahlásit jako SPAM
IP: 62.209.192.–
Nicolas

Quis ut Deus?
liborb
~ Redaktor
+18
Guru
13. 12. 2012   #2
-
0
-

Pole

Nahlásit jako SPAM
IP: 188.75.135.–
ingiraxo+15
Grafoman
13. 12. 2012   #3
-
0
-

je tady otázka, jestli se tohle provede pouze při spustění app nebo počet těch boxů bude v průběhu app proměnlivej

pokud pouze po spuštění (kde uživatel zada třeba počet), tak nepotřebuješ pole a jen cyklus od 0 < N, kde budes vytvaret a nastavovat jednotlivej box a přidávat je na panel/form

pokud to bude dynamicky, tak potrebujes pole, ktery bude obsahovat boxy a budes mit tak kontrolu nad jejim poctem a jednodussi pridavani/odebirani apod.

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Nicolas0
Návštěvník
14. 12. 2012   #4
-
0
-

Později to chci vyřešit dynamicky, ale nejdřív se to musím naučit, takže začnu jednorázovým spuštěním...

OK, tedy pole.

O polích jsem toho našel dost, ale nikde jsem nenarazil na něco podobného jako vkládání boxů do pole. Chtěl bych se zeptat:

Jaký datový tip by takové pole mělo mít?

Říká se tomu potom "pole objektů"? Nebo to je něco jiného?

Díky, N.

Nahlásit jako SPAM
IP: 62.209.192.–
Nicolas

Quis ut Deus?
Nicolas0
Návštěvník
14. 12. 2012   #5
-
0
-

#4 Nicolas
sory za tu hrubku :-)

Nahlásit jako SPAM
IP: 62.209.192.–
Nicolas

Quis ut Deus?
ingiraxo+15
Grafoman
14. 12. 2012   #6
-
0
-

já nevim co přesně to pole bude uchovávat, pokud tam budou treba tlačítka (Button), tak bude pole buttonu, pokud cisla int tak pole treba "intů"

napred by sis mel spis zjistit, jak vytvorit jednotlivej button, jak ho nastavit a pridat na okno bez naklikani

v dalsim kroku to projedes N pres cyklus a az se ti ty buttony zobrazej na okne jak chces a budou taky tak nastaveny, tak potom zkus to s polem, kde to budes pridavat dynamicky za chodu (princip uz bude stejnej)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Nicolas0
Návštěvník
14. 12. 2012   #7
-
0
-

#6 ingiraxo

... přidat na okno bez naklikání.

Nějak takhle? Přidal jsem Combobox.

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class MainClass {
    public static void main(String[] args) {
        nazev apl = new nazev();
    }
}
class nazev extends JFrame {

JTabbedPane tabbedPane = new JTabbedPane();
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();

JComboBox box1 = new JComboBox();

JButton button1 = new JButton("Pridej");

public nazev () {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible (true);
getContentPane().setLayout (new BorderLayout());
getContentPane().add(panel1,BorderLayout.CENTER);

box1.addItem("A");
box1.addItem("B");
box1.addItem("C");

panel2.add(box1);
box1.setVisible(false);

panel1.add(panel2);
panel2.setBackground(Color.ORANGE);
panel2.setPreferredSize(new Dimension (150,300));
panel1.add(button1);

button1.addActionListener (new ActionButton1());

setSize (200,390);
    }

        class ActionButton1 implements ActionListener { //Login
        public void actionPerformed(ActionEvent e) {

box1.setVisible(true);

        }
    }
}
Nahlásit jako SPAM
IP: 62.209.192.–
Nicolas

Quis ut Deus?
ingiraxo+15
Grafoman
14. 12. 2012   #8
-
0
-

spíš si to zkus se dvema prvkama napřed, (treba JPanel, kterej obsahuje JButton), ale jinak takto pokud se ti to zobrazuje jak potrebujes, tak to muzes udelat

ale ty spis potrebujes aby to bylo dynamicky, takze si spis zkus udelat tlacitko (klidne pres naklikani), ktery po kliknuti prida 5 JPanelů, ktery budou obsahovat JButton (zatim bez pole)

potom vlastne mas celej zaklad hotovej a staci to jen rozsirit a upravit podle potreby

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Nicolas0
Návštěvník
14. 12. 2012   #9
-
0
-

Asi takhle?

Ale box1 se mně tam stejně objeví jen 1x, u ostatních se zobrazí jen prázdný panel. Což mně vlastně nepřipadá nijak divný, protože když bych s tím chtěl pak pracovat, tak program by nevěděl, který box1 má reflektovat... teda si myslím.

 A přiznám se že nevím jestli jsi nemyslel je tam přidávat postupně a ne takhle najednou.

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class MainClass {
    public static void main(String[] args) {
        nazev apl = new nazev();
    }
}
class nazev extends JFrame {

JTabbedPane tabbedPane = new JTabbedPane();
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
JPanel panel3 = new JPanel();
JPanel panel4 = new JPanel();
JPanel panel5 = new JPanel();
JPanel panel6 = new JPanel();

JComboBox box1 = new JComboBox();

JButton button1 = new JButton("Pridej");

public nazev () {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible (true);
getContentPane().setLayout (new BorderLayout());
getContentPane().add(panel1,BorderLayout.CENTER);

box1.addItem("A");
box1.addItem("B");
box1.addItem("C");

panel2.add(box1);
panel3.add(box1);
panel4.add(box1);
panel5.add(box1);
panel6.add(box1);

panel1.add(panel2);
panel2.setBackground(Color.ORANGE);
panel2.setPreferredSize(new Dimension (50,40));
panel2.add(box1);
panel2.setVisible(false);

panel1.add(panel3);
panel3.setBackground(Color.ORANGE);
panel3.setPreferredSize(new Dimension (50,40));
panel3.add(box1);
panel3.setVisible(false);

panel1.add(panel4);
panel4.setBackground(Color.ORANGE);
panel4.setPreferredSize(new Dimension (50,40));
panel4.add(box1);
panel4.setVisible(false);

panel1.add(panel5);
panel5.setBackground(Color.ORANGE);
panel5.setPreferredSize(new Dimension (50,40));
panel5.add(box1);
panel5.setVisible(false);

panel1.add(panel6);
panel6.setBackground(Color.ORANGE);
panel6.setPreferredSize(new Dimension (50,40));
panel6.add(box1);
panel6.setVisible(false);

panel1.add(button1);

button1.addActionListener (new ActionButton1());

setSize (350,200);
    }

        class ActionButton1 implements ActionListener { //Login
        public void actionPerformed(ActionEvent e) {

        panel2.setVisible(true);
        panel3.setVisible(true);
        panel4.setVisible(true);
        panel5.setVisible(true);
        panel6.setVisible(true);

        }
    }
}

Prosím tě trpělivost, jsem fakt tvrdej ořech :-)

Nahlásit jako SPAM
IP: 62.209.192.–
Nicolas

Quis ut Deus?
ingiraxo+15
Grafoman
14. 12. 2012   #10
-
0
-

#9 Nicolas
ne tohle jsem vubec nemyslel :) kdyby si to měl pridat 100x, tak to by si delal takto taky?

mel jsem spis na mysli, aby si to udelal pres cyklus, ted zapomen na nejaky zpetny ref. (uchovani promennych), ale zkus jen cisty pridani tech komponent do okna

pro ty reference bude slouzit pole potom, ale napred je dulezity, aby si to umel udelat takto "nanečisto"

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Nicolas0
Návštěvník
14. 12. 2012   #11
-
0
-

OK, mrknu na to a dám vědět, 

teď už ale musím letět :-)

Zatím díky, N.

Nahlásit jako SPAM
IP: 62.209.192.–
Nicolas

Quis ut Deus?
Nicolas0
Návštěvník
21. 12. 2012   #12
-
0
-

#10 ingiraxo
Ahoj,

tak jsem se k tomu asi nakonec dopracoval, i když jsem si trochu změnil zadání a použil jsem buttony, aby to pro mě na začátek bylo srozumitelnější. 

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class MainClass {
    public static void main(String[] args) {
        nazev apl = new nazev();
    }
}
class nazev extends JFrame {

JTabbedPane tabbedPane = new JTabbedPane();
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();

JButton button1 = new JButton("Pridej");

JButton [] button = new JButton[]{};


public nazev () {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible (true);
getContentPane().setLayout (new BorderLayout());
getContentPane().add(panel1,BorderLayout.CENTER);

panel1.add(button1);

panel1.add(panel2);
panel2.setBackground(Color.ORANGE);
panel2.setPreferredSize(new Dimension (300,180));
panel2.setName("panel");
panel2.setLayout(new FlowLayout());

button1.addActionListener (new ActionButton1());

setSize (350,250);
    }

        class ActionButton1 implements ActionListener {
        public void actionPerformed(ActionEvent e) {

for (int i = 0; i < 5; i++){
             Button btn = new Button();
             btn.setName("btn"+i);
             panel2.add(btn);
             int c = panel2.getComponentCount();
             System.out.println(c);

panel2.revalidate();
            }
        }
    }
}

1) Když to chci ale odkrokovat v NetBeans, Debugger Console mě vyhodí hlášku viz. níže a já nevím co s tím mám děla. Poraďte prosím.

Listening on javadebug
User program running
Not able to submit breakpoint FieldBreakpoint nazev.list, reason: Field 'list' does not exist in class nazev.

Jinak to ale funguje a za int 5 si pak dosadím jen proměnou kterou dostanu z databáze.

2) Mám tam nějakou pitomost, kterou byste udělali jinak? Popř. prosím jak?

Díky, N.

Nahlásit jako SPAM
IP: 62.209.192.–
Nicolas

Quis ut Deus?
liborb
~ Redaktor
+18
Guru
21. 12. 2012   #13
-
0
-

Hlavní "problém" je v tom, že si nikam, tj. do toho pole, neukládáš ty buttony. Na druhou stranu, pokud nebudeš potřebovat přistupovat k jejich instancím jinde než v reakcím na nějakou jejich událost, tak je to to šumák. Jinak princip by mohl být přibližně takový:

JButton [] button;

...


public void actionPerformed(ActionEvent e) {
	int pocet = 5;

	button =  new JButton[pocet];

	for (int i = 0;i < pocet;i++) {
		button[i] = new JButton();
		button[i].setName("btn"+i);
		panel2.add(button[i]);
		...
        }
}

a pak můžeš udělat třeba button[1].setName("blabla"); tj. přistupovat na libovolný button.

Nahlásit jako SPAM
IP: 188.75.135.–
Nicolas0
Návštěvník
21. 12. 2012   #14
-
0
-

#13 liborb
Tak teď jsem to konečně chápu :-) tedy snad...

JButton [] button; je deklarace proměnné, něco jako když deklaruju obyčejnou proměnnou třeba int X = 0; a

button =  new JButton[pocet]; je teprve vytvoření samotného pole, s proměnným počtem Buttonů počet.

To si nedovedete představit jak je taková jednoduchá věc pro laika těžká pochopit :-)

Moc díky oběma, N.

Nahlásit jako SPAM
IP: 62.209.192.–
Nicolas

Quis ut Deus?
liborb
~ Redaktor
+18
Guru
21. 12. 2012   #15
-
0
-

#14 Nicolas
Možná se budeš divit, ale dokážu si to představit :)

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

Přidej příspěvek

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

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

×Vložení zdrojáku

×Vložení obrázku

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

×Vložení videa

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

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

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

Podobná vlákna

Vícenásobné větvení — založil wh

Vícenásobné zanoření — založil Bobek

Instalace komponenty — založil Michal

Prirazeni komponenty — založil dyžon

DELETE komponenty — založil otasimek

Moderátoři diskuze

 

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