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.
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.
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)
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
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);
}
}
}
#9Nicolas
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"
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?
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.