JButton raz są a raz ich nie ma.

0

Witam

Ostatnio zasypuję was pytaniami, ale czym bardziej zagłębiam się w Javę tym mniej rozumiem. Zwłaszcza, gdy dzieje się "magia".

Nie rozumiem jakim cudem. Kiedy stworzyłem sobie okienko, które zawiera jakiś tam tekst i poniżej 3 przyciski. Te 3 przyciski stworzyłem w innej klasie i dodałem je do klasy z okienkiem przywołując jako obiekt. (Zaraz zamieszczę kod.) To te przyciski jednym razem są tam i działają jak należy a innym razem w ogóle ich nie wyświetla. Po exporcie programu do Jar jest identycznie a na innym laptopie to już w ogóle ich nie wyświetla.. Przyciski dodałem do programu w niemal identyczny sposób jak do poprzednika, który działa poprawnie tak na komputerze jak i na laptopie. Kod też wygląda niemal identycznie jak u poprzednika..

package Wydatki;

import javax.swing.JFrame;
import javax.swing.JTextArea;

public class Frame extends JFrame {

    public Frame() {

        setSize(800, 200);
        setResizable(false);
        setLocationRelativeTo(null);
        setTitle("Wydatki");
        setVisible(true);
        setLayout(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    public static void main (String[] args){
        Frame frame = new Frame();

        JTextArea Opis_funkcji = new JTextArea();
        frame.add(Opis_funkcji);

        Opis_funkcji.setText("Wciśnij przycisk 'Nowy' aby utworzyć oraz zapisać nowy dokument tekstowy.\n"
                + "Wcisnij przycisk 'Otwórz' aby otworzyć istniejący plik tekstowy.\n"
                + "Wciśnij przycisk 'Dopisz' aby dopisać dane do utworzonego pliku tekstowego.");
        Opis_funkcji.setBounds(170, 20, 450, 70);
        Opis_funkcji.setEditable(false);
        Opis_funkcji.setBackground(null);

        Buttons przyciski = new Buttons();
        frame.add(przyciski);
        przyciski.setBounds(130, 100, 500, 200);

    }

}
 package Wydatki;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JPanel;

public class Buttons extends JPanel implements ActionListener {

    private JButton Nowy;
    private JButton Otworz;
    private JButton Dopisz;

    public Buttons(){

        Nowy = new JButton("Nowy");
        Otworz = new JButton("Otwórz");
        Dopisz = new JButton("Dopisz");

        Nowy.addActionListener(this);
        Otworz.addActionListener(this);
        Dopisz.addActionListener(this);

        setVisible(true);
        add(Nowy);
        add(Otworz);
        add(Dopisz);

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        Object klik = e.getSource();

        if (klik == Nowy)
            Zapisz.main(null);

    }

}

Proszę o pomoc, bo kompletnie nic z tego nie rozumiem. Co robię źle, jak się zabezpieczyć przed takimi dziwactwami i jak sobie radzić, kiedy problemy pojawiają się "z kosmosu" jak je wyłapywać?

Ten program miał służyć do użytku domowego. Zawiera jeszcze z 5 innych klas, ale one działają w trybie konsolowym i mają, krótko mówiąc tworzyć plik tekstowy i na nim działać. Okienka i przyciski, które zrobiłem teraz nie są w żaden sposób powiązane z tamtymi klasami. Powoli właśnie dążyłem, żeby "ubrać" ten program i jestem na samym początku i już czuję, że nic nie ogarniam.

Tak podsumowując: Kiedy kompiluje program w Eclipse przyciski w okienku "Frame" raz są i je widać a raz ich nie ma w ogóle. Tak samo dzieje się po exporcie do .jar. Kiedy wrzucam plik .jar na inne urządzenie to przycisków w ogóle nie ma.

EDIT: Dodam jeszcze, że java jest aktualna na obu urządzeniach.

0

Pierwsze co sią rzuca w oczy, to absurdalna kolejność:

        setVisible(true);
        add(Nowy);
        add(Otworz);
        add(Dopisz);

Ten sam absurd masz w klasie Frame, wpierw wyświetlasz, a potem dodajesz komponenty.
Btw, nazwa Frame jest nieudana - w Javie jest standardowa klasa o takiej nazwie, utrudniasz analizę kodu.

0

Zmieniłem na:

package Wydatki;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JPanel;

public class Buttons extends JPanel implements ActionListener {

    private JButton Nowy;
    private JButton Otworz;
    private JButton Dopisz;

    public Buttons(){

        Nowy = new JButton("Nowy");
        Otworz = new JButton("Otwórz");
        Dopisz = new JButton("Dopisz");

        Nowy.addActionListener(this);
        Otworz.addActionListener(this);
        Dopisz.addActionListener(this);

        add(Nowy);
        add(Otworz);
        add(Dopisz);

        setVisible(true);

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        Object klik = e.getSource();

        if (klik == Nowy)
            Zapisz.main(null);

    }

}

W dodatku poszperałem w linijkach Klasy Frame i zmieniłem jej nazwę.

package Wydatki;

import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JTextArea;

public class Gokno extends JFrame {

    public Gokno() {

        setSize(800, 200);
        setResizable(false);
        setLocationRelativeTo(null);
        setTitle("Wydatki");
        setLayout(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    public static void main (String[] args){
        Gokno frame = new Gokno();

        JTextArea Opis_funkcji = new JTextArea();
        frame.add(Opis_funkcji);

        Opis_funkcji.setText("Wciśnij przycisk 'Nowy' aby utworzyć oraz zapisać nowy dokument tekstowy.\n"
                + "Wcisnij przycisk 'Otwórz' aby otworzyć istniejący plik tekstowy.\n"
                + "Wciśnij przycisk 'Dopisz' aby dopisać dane do utworzonego pliku tekstowego.");
        Opis_funkcji.setBounds(170, 20, 450, 70);
        Opis_funkcji.setEditable(false);
        Opis_funkcji.setBackground(null);

        Buttons przyciski = new Buttons();
        frame.add(przyciski);
        przyciski.setBounds(270, 100, 230, 35);
        przyciski.setBackground(Color.BLACK);

        frame.setVisible(true);
    }

}

Dodałem tło, żeby mieć lepszy pogląd na to co się tam dzieje i zmniejszyłem rozmiary tego tła do rozmiarów samych przycisków.
Zauważyłem, że tym razem na laptopie wyświetla samo tło, bez przycisków.
U mnie na komputerze czasem wyświetla przyciski na czarnym tle a czasem samo czarne tło.

Tak czy inaczej problem dalej istnieje. ;(

I o co w ogóle chodzi z tym, że inaczej to działa u mnie na komputerze a inaczej na laptopie. W jaki sposób ja mam wyłapywać takie błędy przed puszczeniem czegoś w obieg, kiedy na moim komputerze za pierwszym, drugim czy nawet trzecim razem program działa bez zarzutów. A na innym urządzeniu dopiero okazuje się, że on w ogóle nie działa?

0

Może i poszperałeś w klasie Frame , ale błędu nie naprawiłeś - wpierw wyświetlasz, a potem dodajesz komponenty.
Po uruchomieniu na laptopie, zminimalizuj okno, przywróć i podziwiaj komponenty.

0

O boże faktycznie, po zminimalizowaniu działa. ;O

A jak to jest, że u mnie wyświetla bez problemów? Żeby sprawdzić czy program, rzeczywiście działa musiałem lecieć do laptopa. Gdybym miał tylko jeden komputer to byłby duży problem. W jaki sposób to sprawdzać, żeby uniknąć takich problemów?

Mówiąc o błędzie dot. Wyświetlania i dodawania komponentów masz na myśli to, że to co mam w konstruktorze, powinienem mieć pod tym co mam w mainie?

Czy bardziej o to, że w main powinno to wyglądać tak:

 public static void main (String[] args){
        Gokno frame = new Gokno();
        JTextArea Opis_funkcji = new JTextArea();
        Buttons przyciski = new Buttons();

        frame.add(Opis_funkcji);
        frame.add(przyciski);

        Opis_funkcji.setText("Wciśnij przycisk 'Nowy' aby utworzyć oraz zapisać nowy dokument tekstowy.\n"
                + "Wcisnij przycisk 'Otwórz' aby otworzyć istniejący plik tekstowy.\n"
                + "Wciśnij przycisk 'Dopisz' aby dopisać dane do utworzonego pliku tekstowego.");
        Opis_funkcji.setBounds(170, 20, 450, 70);
        Opis_funkcji.setEditable(false);
        Opis_funkcji.setBackground(null);

        przyciski.setBounds(270, 100, 230, 35);
        przyciski.setBackground(Color.BLACK);

        frame.setVisible(true);
    } 
0

Bez problemów u Ciebie działa w Eclipse, czy poza Eclipse też? Możliwe, że uruchamianie Eclipse naprawia Twoje błędy, np. dwukrotnie wyświetla okno..
W metodzie main tylko wywołanie konstruktora (ewentualnie ustawienie "skórki").

import javax.swing.JFrame;
import javax.swing.JTextArea;

public class Frame extends JFrame {

    public Frame() {
        setTitle("Wydatki");
        setSize(800, 200);
        setLayout(null);
        JTextArea Opis_funkcji = new JTextArea();
        add(Opis_funkcji);

        Opis_funkcji.setText("Wciśnij przycisk 'Nowy' aby utworzyć oraz zapisać nowy dokument tekstowy.\n"
                + "Wcisnij przycisk 'Otwórz' aby otworzyć istniejący plik tekstowy.\n"
                + "Wciśnij przycisk 'Dopisz' aby dopisać dane do utworzonego pliku tekstowego.");
        Opis_funkcji.setBounds(170, 20, 450, 70);
        Opis_funkcji.setEditable(false);
        Opis_funkcji.setBackground(null);

        Buttons przyciski = new Buttons();
        add(przyciski);
        przyciski.setBounds(130, 100, 500, 200);

        setResizable(false);
        setLocationRelativeTo(null);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);  
    }

    public static void main (String[] args){
        Frame frame = new Frame();
    } 
}

Możesz też przenieść kod opisujący komponenty do metod.

import javax.swing.JFrame;
import javax.swing.JTextArea;

public class Frame extends JFrame {

    public Frame() {
        setTitle("Wydatki");
        createGUI();
        setResizable(false);
        setLocationRelativeTo(null);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);  
    }

    public static void main (String[] args){
        Frame frame = new Frame();
    }

    private void createGUI()
    {        
        setSize(800, 200);
        setLayout(null);
        JTextArea Opis_funkcji = new JTextArea();
        add(Opis_funkcji);

        Opis_funkcji.setText("Wciśnij przycisk 'Nowy' aby utworzyć oraz zapisać nowy dokument tekstowy.\n"
                + "Wcisnij przycisk 'Otwórz' aby otworzyć istniejący plik tekstowy.\n"
                + "Wciśnij przycisk 'Dopisz' aby dopisać dane do utworzonego pliku tekstowego.");
        Opis_funkcji.setBounds(170, 20, 450, 70);
        Opis_funkcji.setEditable(false);
        Opis_funkcji.setBackground(null);

        Buttons przyciski = new Buttons();
        add(przyciski);
        przyciski.setBounds(130, 100, 500, 200);        
    }    
}
0

Wielkie dzięki, tak będę robić.

Co do pytania to działa w Eclipse oraz poza Eclipse również u mnie działa bez problemów. Co jakiś czas tylko się sypie jak na laptopie, jednak zazwyczaj działa on poprawnie. Dopiero na innym urządzeniu wykrywam błędy. To strasznie utrudnia sprawę, bo serio nie wyłapię czy coś działa czy nie, odpalając to ze swojego komputera.

EDIT: Ogarnąłem sprawę z tą magią działania programów u mnie na komputerze a na innych nie. Kiedy plik wykonywalny miałem na pulpicie to faktycznie wszystko działało. Ale gdy wrzucam go na dysk np. D. To w tamtej lokalizacji już jak na dłoni widzę wszelkie błędy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0