Hirdetés

Keresés

Új hozzászólás Aktív témák

  • Löncsi
    őstag

    Nem mondhatnám, hogy értem amit írsz... :)
    (pontosabban azt, hogy mi köze a problémámhoz - itt most kimondottan példaprogramokról van szó)

    public static void main(String[] args) {
    //Schedule a job for the event-dispatching thread:
    //creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    createAndShowGUI();
    }
    });
    }

    Szinte minden példaprogram, ami swinghez kapcsolódik, így indul.
    Miért nem elég csak statikusan indítani a createAndShowGUI-t?
    Az, hogy belül egyik-másikhoz új szálat indít, az egy másik téma. Azt nem értem, hogy miért kell a main futásától "függetleníteni" bármit?

    javax.swing.SwingUtilities.invokeLater(new Runnable() { .. }

    Fontos ,hogy kirajzolásokat az EDT szálon hajtsuk végre, más esetben hiba léphet fel (nomeg a grafikai műveletket meg kell próbálni függetleníteni a számításoktól, ezért kell külön szál).
    Az invokeLater biztosítja, hogy a kirajzolás EDT szálon hajtódik végre. (Ugye paraméterben egy Runnable-et adsz át, a run() metódus tartalmazza a grafikai parancsokat).

    Le is tudod ellenőrizni ,hogy a kirajzolás EDT-n történik-e, az isEventDispatchThread() függvény meghívásával , logikai értéket ad vissza.

    Remélem hasznos volt,bár látom utánajártál.

  • Löncsi
    őstag

    Azon töröm a fejem, hogy lehetséges-e egy Exception-t meg nem történtté tenni?

    void c() throws Z {
    ...
    throw new Z;
    }


    void b(){
    try {
    c();
    } catch(Z) { ... }
    }


    void a(){
    try {
    b();
    } catch(Z) { ... }
    }

    Mi van, ha azt akarom, hogy miután b-ben már feldolgoztam Z-t, az a-beli catch már ne akarja ismételten feldolgozni?
    Jól sejtem, hogy ez a működés nem illik a java logikába?
    Vagy megoldható, csak én nem találom a megoldást?

    'a'-beli try-catch ágat törölheted sztem, mivel ott 'b'-t hívod meg, a b-hez tartozó catch fog működni.

    Amúgy kérdésedre a válasz ,hogy nem tudom, igazából nem tudom mi értelme lenne..

  • Löncsi
    őstag

    Üdv!

    Még kezdő vagyok kis segítségre lenne szükségem.
    GUI-t készítek Swing komponensekből.
    Indulóképernyő így nézne ki:.
    Egy kép, egy JTextField, és egy JButton.
    Az ablak átméretezése esetén a komponensek elhelyezkedése kövesse a méretezést. Tehát ami eddig relatíve lent volt, az továbbra is ott legyen. Jah és az a méretük szigorúan fix maradjon amit én létrehozáskor megadok.
    A képnél ezt simán meg tudtam oldani, azonban a JTextField és a JButton esetében nem.
    Erre valakinek van ötlete?

    Egy kb 25-30 elemű tömb elemeit szeretném kiíratni sorrendben ugyanennyi JTextField-et példányosítani, majd elhelyezni a panelen és az adott tömb elemét értékül adni neki.
    Ez mennyire megvalósítható, vagy jó ötlet ha automatizálva ciklusból szeretném megoldani?

    4 fajta Layout van.

    FlowLayout, BorderLayout, GridLayout,BoxLayout.

    Box és FlowLayoutnál mikor átméretezel, a komponens mérete konstans marad.

    Szerintem érdemes egy Box-layoutot egy panelre állítani, és egyesével belerakni a komponenseket, így egymás alatt lesznek. (vagy Flow is jó, ekkor egymást követik a komponensek)

    Majd ha ezzel megvagy ,magára az ablakra ( getContentPane() )-re kellene tenni egy BorderLayoutot, átadni az előző panelt és "South"-ra tenni, így 'elvileg' egymás alatt/mellett elhelyezkedő konstans méretű gombok lesznek, mindig délen (lent).

    De csak tipp így kora reggel, el kell ezzel játszogatni.

  • Löncsi
    őstag

    Üdv.
    Egy olyan problémám van ami már rettentő idegesítö, mert teljesen érthetetlen és nem találok rá semmi megoldást
    GUI-val kapcsolatos

    Van egy Ablak osztály ami a JFrame-t örökli
    Ha ebben hozok létre egy JLabel-t és adom hozzá, akkor a szöveg egyszerü formázatlan szövegként fog megjelenni az ablakban ( UIManager-el átállítottam a kinézetet, ezért itt nem hat az hogy a swing alapesetben félkövérre állítja a szövegeket)

    De ha ezt a JLabelt egy előre létehozott külső osztályból importálom akkor minden beállítás ellenére félkövérre állítja
    Itt viszont arra gyanakodtam hogy erre már nem terjed ki a Ablak osztály UIManager beállítása - de hiába állítottam itt is be külön a kinézetet, nem működik)
    Ha van valakinek valami ötlete, írjon, elöre is kösz

    néhány kódrészlet:

    Az ablak osztály egyes részei:

    public class Ablak extends JFrame {
    Status statusz;
    JLabel valami;

    [...]

    public Ablak() {
    statusz = new Status();
    valami = new JLabel("nem félkövér, egyszerű szöveg");
    [...]
    add(statusz);
    add(valami);
    }
    }

    A teljes Status osztály:

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

    public class Status extends JLabel {
    String text;

    public Status() {
    text = new String("ez nem kellene hogy félkövér legyen");
    setText(text);
    }
    }

    Ez esetleg?
    jl.setFont(new Font("Times-Roman", Font.BOLD, 17));

    Vagy
    Font f = label.getFont();

    // bold
    label.setFont(f.deriveFont(f.getStyle() ^ Font.BOLD));
    // unbold
    label.setFont(f.deriveFont(f.getStyle() | Font.BOLD));

    Ez egyszerű kényszerítés, sztem mennie kell..

  • Löncsi
    őstag

    Szia!

    Az adott komponensre rálel név alapján, és másik fórumon ki is lettem javítva, hogy a

    this.getComponentAt(c.getLocation())

    felesleges, simán return c; elég lenne utána. Kezdek tanácstalan lenni:)
    Nem akarok minden textfield-et úgy létrehozni, hogy TextField akarmi = new TextField(); mert a huszadik ilyen után egy nagy maszlag lesz a programból.

    De String-et h hasonlítasz össze akkor '==' -al ?
    Elvileg az úgy nem jó...

  • Löncsi
    őstag

    Sziasztok.

    Az volna a kérdésem, hogy miként tudok utóbb hivatkozni olyan ojjektumra, amit korábban nem tároltam változóban, hanem pl. feltettem a GUI-ra, és jóidő.

    Emígy szól a 'csináló' metódus:

    private TextField createTextField(String text, String name, int cols)
    {
    TextField nextTextField = new TextField(text, cols);
    nextTextField.setName(name);

    return nextTextField;
    }

    Aztán így próbálok később hozzáférni:

    private Component getByName(String componentName, Container cont)
    {
    for(Component c : cont.getComponents())
    {
    System.out.println(c.getName());
    if(c.getName() == componentName)
    {
    return this.getComponentAt(c.getLocation());
    }
    }
    return null;
    }

    Az elgondolás az volt, hogy a komponenst megnevezve megszerzem magamnak az uralmat fölötte, de valami nem úgy működik, ahogy szeretném. Pl. , ha setBackground-ot vagy setForeground-ot állítok, semmi sem történik, setEnabled(false) -ra pedig meghal a teljes program.

    Mit szúrok el? Bármi ötlet jól jönne:)

    Köszöntem!

    if( c.getName().equals(componentName) )

    Így próbáld, hátha.

Új hozzászólás Aktív témák

Hirdetés