ugrás a tartalomhoz

JPanel hiba...

szobek · 2014. Feb. 27. (Cs), 12.58
Sziasztok!

Most kezdem tanulni a Java programozást, igazából még nagyon az elején vagyok és csak ismerkedek vele, de van egy probléma amit az istenért sem tudok megoldani, a tanár is csak annyit tudott hozzáfűzni, hogy "ezért kell Linuxon fejleszteni". (Köszi)
Szóval a hiba ott van, hogy egy Frame-ben létrehozok egy panelt, majd egy gombnyomásra ezt le szeretném cserélni egy másik panelra. Működne is a dolog, de csak akkor működik ha a megjelenő ablak szélére kattintok, mintha át akarnám méretezni... És kipróbáltam, hogy Clean and Build-del exportálom majd másik gépen futtatom de így is jelentkezik a hiba. Megírtam a programot egy korábbi verziójú netbeanssel, de ugyan az... Ötlet valakinek? Csatolom hogy mire jutottam... Előre is köszönöm!!


package javaapplication3;


import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JLabel;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class Label extends JFrame implements ActionListener, KeyListener {

    private JLabel label1;
    private JLabel label2;
    private JLabel label3;
    private JLabel label4;
    
    private JMenuBar menubar;
    private JMenu menu;
    private JMenuItem menup1;
    private JMenuItem menup2;
    private JPanel panel1;
    private JPanel panel2;
    
    
    private JButton btnvalt;
    private JButton btnvalt2;

    public Label() {
     
         
        setVisible(true);
        setBounds(50, 50, 400, 400);
        setTitle("Teszt");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new FlowLayout());
        
        
        btnvalt = new JButton("panel 1");
        btnvalt2 = new JButton("panel 2");
        btnvalt.addActionListener(this);
        btnvalt2.addActionListener(this);
        btnvalt.setActionCommand("b1");
        btnvalt2.setActionCommand("b2");
        
        menubar = new JMenuBar();
        menu = new JMenu("Menü");
        menubar.add(menu);
        menup1 = new JMenuItem("Panel 1");
        menup1.setActionCommand("p1");
        menup1.addActionListener(this);
        menup2 = new JMenuItem("Panel 2");
        menup2.setActionCommand("p2");
        menup2.addActionListener(this);

        panel1 = new JPanel();
        panel1.setLayout(new GridLayout(2, 2));
        panel2 = new JPanel();
        panel2.setLayout(new GridLayout(2, 2));
        
        setLayout(new FlowLayout());
        
        menu.add(menup1);
        menu.add(menup2);
        setJMenuBar(menubar);
        label1 = new JLabel("label 1");
        label2 = new JLabel("Label 2");
        
        
        add(btnvalt);
        add(btnvalt2);




    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("b1")) {


            label1 = new JLabel("label 1");
            label2 = new JLabel("Label 2");
            panel1.add(label1);
            panel1.add(label2);
           
            add(panel1);
            
        }
        if (e.getActionCommand().equals("b2")) {
            remove(panel1);


            label3 = new JLabel("label 3");
            label4 = new JLabel("Label 4");
            panel2.add(label3);
            panel2.add(label4);
            add(panel2);


        }
    }

    @Override
    public void keyTyped(KeyEvent e) {
        
    }

    @Override
    public void keyPressed(KeyEvent e) {
        
    }

    @Override
    public void keyReleased(KeyEvent e) {
        
    }
}
 
1

Hogy mukodik?

janoszen · 2014. Feb. 27. (Cs), 13.02
Ez egesz pontosan hogy akarna mukodni? Nincs benne main() fuggveny, anelkul nehez tesztelni. Javasolnam, hogy toltsd fol az egesz projektedet GitHubra, had nezzuk meg.
2

szia!A következő kóddal

szobek · 2014. Feb. 27. (Cs), 13.47
szia!

A következő kóddal hívom meg:


package javaapplication3;


public class JavaApplication3 {

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

Az ablak szépen meg is nyílik csak amikor megnyomom a gombot, akkor a panelt lecseréli de olyan mintha nem frissülne csak akkor mikor az ablak szélére kattintok.
3

Tedd fel

janoszen · 2014. Feb. 27. (Cs), 14.11
Legy oly jo es tedd fel GitHubra az egesz projektedet, picit konnyebb lesz mukodesre birni es ezaltal segiteni.
4

Na a reg már megvolt, amint

szobek · 2014. Feb. 27. (Cs), 14.32
Na a reg már megvolt, amint megtalálom, hogy hova kell feltölteni már dobom is fel :)
Van valami magyar tutorial a használathoz?? :D

update: Közben megtaláltam!! :)
https://gist.github.com/9249185.git
https://gist.github.com/9249149.git
5

Feher

janoszen · 2014. Feb. 27. (Cs), 16.15
Hja, nem igy gondoltam, hanem rendes git repokent, mert akkor egy git clone jegyeben megszuletne nalam minden, beleertve a NetBeans beallitasaidat is. A Gistek sajnos feher oldalt adnak.

Tutorial itt: http://readwrite.com/2013/09/30/understanding-github-a-journey-for-beginners-part-1#awesm=~ox4TQaWbMJwUr7
6

Sejtettem, hogy elbénáztam :)

szobek · 2014. Feb. 27. (Cs), 16.27
Na de akkor nekiállok és jelzek ha kész. Köszi a segítséget előre is.
7

Hajra

janoszen · 2014. Feb. 27. (Cs), 18.14
Hajra. Amugy sem baj ha megtanulsz verziokezelni. ;)
8

Validate

BlaZe · 2014. Feb. 27. (Cs), 23.24
Itt az add() api doksija. Azt írja:
This method changes layout-related information, and therefore, invalidates the component hierarchy. If the container has already been displayed, the hierarchy must be validated thereafter in order to display the added component.
Ha megnézed a validate() javadocját, akkor az bővebben mondja:
Validating a container means laying out its subcomponents. Layout-related changes, such as setting the bounds of a component, or adding a component to the container, invalidate the container automatically. Note that the ancestors of the container may be invalidated also (see Component.invalidate() for details.) Therefore, to restore the validity of the hierarchy, the validate() method should be invoked on the top-most invalid container of the hierarchy.
Tehát szúrj be egy validate()-et az actionPerformed() metódusodba, akkor már működik.

Kis comment: szintén írja a javadoc, hogy a validáció elég erőforrásigényes. Emiatt, és mert az actionPerformed() mindig új label objektumokat hoz létre és állandóan fel-le rakosgatod benne a panelt, nem éppen optimális. Jobban jársz, ha a konstruktorban rárakosgatod a panelre a labeleket, majd a panelt a framere, mindkét panelt elrejted panelX.setVisible(false)-szal, majd az actionPerformed() metódusban váltogatod, hogy melyik látszódjon. Valahogy így.

Ha rám hallgatsz, java tanulás címszó alatt nem ilyen swinges borzalmakkal vered agyon az időt, hanem a nyelv alapjait tanulod meg. A swing bár része a javanak, de szvsz egy katasztrófa, illetve semmit nem tanít meg abból, hogy mitől java a java. Ha a java az első nyelved, akkor vezérlési szerkezetek, osztály-objektum-interface kikicsoda, láthatóság, típusok, collection framework stb. Én learning java tutorialt ajánlanám első körben (ha megy az angol).
9

Szia! Köszi a választ, jó

szobek · 2014. Feb. 28. (P), 08.48
Szia!

Köszi a választ, jó ötletnek tűnik, egyébként az alapokat már elkezdtem tanulni (osztályok, öröklődés, stb.), csak a gyakorlással jobban meg tudom tanulni, mintha csak a könyv fölött ülnék. Viszont ehhez az kell, hogy programokat csináljak. Szóval kicsit ördögi kör, de azért szépen lassan haladok :)

Köszi még egyszer!
10

Program

Poetro · 2014. Feb. 28. (P), 11.11
A programhoz viszont nem feltétlen a legalkalmasabb egy Swing alkalmazás fejlesztése, inkább valami parancssori alkalmazással kezdenék, vagy mondjuk egy alkalmazásszerverrel. Ennek egyrészt később is nagyobb hasznát veszed, másrészt pedig nem tanulod meg feleslegesen a Swing problémáit, amit később soha nem fogsz valószínűleg használni.