Wyświetlanie w oknie programu

Wyświetlanie w oknie programu
N4
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:193
0

Cześć, mam dosyć spory problem. Jestem w trakcie nauki Javy i niedawno przeniosłem się z programów konsolowych na graficzne. Jest jednak ważny problem - W oknie mojego programu nic się nie wyświetla! Ani przyciski, ani obrazy... nic. Po prostu szary ekran.

Kod, widoczny pod spodem, powinien dodać:

  1. Tło dla menu gry
  2. 4 przyciski (Nowa Gra, Wczytaj Grę, Filmy Treningowe i Wyjdź z gry)

Nie wyświetla się jednak nic oprócz szarego ekranu. Jedyne, co działa, to zmieniony tytuł ramki (Call of Fight).

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

public class MenuBudowa
{
	public static void main(String[] args)
	{
		Menu menu = new Menu();
		menu.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		menu.show();
	}
}

class MenuStworz extends JFrame
{
	public void Menu()
	{
		//pobranie rodzielczosci ekranu
		
		Toolkit zestaw = Toolkit.getDefaultToolkit();
		Dimension ekran = zestaw.getScreenSize();
		int wys = ekran.height;
		int szer = ekran.width;
		
		//umieszczenie ramki na ekranie
		
		setSize(szer, wys);
		setLocation(0, 0);
		
		//okreslenie tytulu i ikony ramki
		
		setTitle("Call of Fight");
	}
	public void paintComponent(Graphics g)
	{	
		//tlo menu
		
		String MenuTlo = "gif/MenuTlo.gif";
		Image MTlo = Toolkit.getDefaultToolkit().getImage(MenuTlo);
		g.drawImage(MTlo, 0, 0, null);
		
	}
}

class MenuPrzyciski extends JPanel
{
	public void Przyciski()
	{
		//tworzenie obiektow przyciskow
		
		JButton Gra = new JButton("Nowa Gra");
		JButton Wczytaj = new JButton("Wczytaj grę");
		JButton Film = new JButton("Filmy treningowe");
		JButton Koniec = new JButton("Wyjdź z gry");
		
		//dodanie przycisków
		
		add(Gra);
		add(Wczytaj);
		add(Film);
		add(Koniec);
	}
}

Czy ktoś podpowie mi, co jest tu zrobione źle?
PS: Korzystam z książki "Java 2 Podstawy" Horstmanna i Cornella, oni podawali te fragmenty kodu, które ja połączyłem w całość.


...
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

A co tu jest dobrze? Mieszasz nazwy klas z metodami. Nie umiesz napisać konstruktora. To się nawet nie kompiluje...

Kopiuj
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;

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

public class MenuBudowa {

    public static void main(String[] args) {
        MainWindow menu = new MainWindow();
        menu.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        menu.setVisible(true);
    }
}

class MainWindow extends JFrame {
    private static final long serialVersionUID = 1L;

    public MainWindow() {
        Toolkit zestaw = Toolkit.getDefaultToolkit();
        Dimension ekran = zestaw.getScreenSize();
        int wys = ekran.height;
        int szer = ekran.width;
        setPreferredSize(new Dimension(szer, wys));
        setLocation(0, 0);
        setTitle("Call of Fight");
        add(new ButtonsPanel());
        pack();
    }

    public void paintComponent(Graphics g) {
        String MenuTlo = "gif/MenuTlo.gif";
        Image MTlo = Toolkit.getDefaultToolkit().getImage(MenuTlo);
        g.drawImage(MTlo, 0, 0, null);
    }
}

class ButtonsPanel extends JPanel {
    private static final long serialVersionUID = 1L;

    public ButtonsPanel() {
        JButton Gra = new JButton("Nowa Gra");
        JButton Wczytaj = new JButton("Wczytaj grę");
        JButton Film = new JButton("Filmy treningowe");
        JButton Koniec = new JButton("Wyjdź z gry");
        add(Gra);
        add(Wczytaj);
        add(Film);
        add(Koniec);
    }
}

Proponuje wspomagać się wtyczką do Eclipse Google Window Builder...


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 2x, ostatnio: Shalom
N4
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:193
0

@Shalom
Coś jest nie tak. Kompiluje się bez żadnych błędów, ale po uruchomieniu pojawia nam się:

Kopiuj
Exception in thread "main" java.lang.Error: Do not use MainWindow.add() use Main
Window.getContentPane().add() instead
        at javax.swing.JFrame.createRootPaneException(JFrame.java:406)
        at javax.swing.JFrame.addImpl(JFrame.java:432)
        at java.awt.Container.add(Container.java:228)
        at MainWindow.<init>(MenuBudowa.java:30)
        at MenuBudowa.main(MenuBudowa.java:13)
 

Wariacji można dostać...


...
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Masz chyba prehistoryczną Javę, w wersji 1.4 (może 1.5 również) było tak, że przechodziło kompilację

Kopiuj
add(komponent);

ale był błąd wykonania. Trzeba było pisać

Kopiuj
getContentPane().add(komponent);

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
N4
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:193
0

@bogdans
Niestety, ale kompilator nie zna metody getContentPane()
Wszędzie przed add(komponent) dodawałem tą metodę, ale teraz pojawiają się błędy już przy kompilacji.


...
bogdans
Ty rzeczywiście nie rozumiesz co robisz, nie wszędzie tylko tu: add(new ButtonsPanel());. W pozostałych miejscach dodajesz komponent do JPanel, a w tym jednym do JFrame.
0

Nie przepisuj fragmentów kodu z książki, tylko na ich podstawie spróbuj napisać coś swojego. Chodzi o to, żebyś napisał coś co rozumiesz, a dopiero później dokładał różnych rzeczy. To ci pomoże zrozumieć javę i pisać coraz bardziej złożone programiki. Dlatego moja propozycja jest taka, żebyś usunął cały ten kod, stworzył ramkę do której dodasz panel, a w panelu umieścisz jeden przycisk. Dopiero później zaczniesz dodawać ich więcej. I nie twórz na razie kilku class. Kiedy się uczyłem podstaw w gui zawsze operowałem tylko na jednej clasie, bo było łatwiej wykryć ewentualne błędy. Spróbuj stworzyć to co ci podałem i jak ci się nie uda to wyślij swój kod i jakoś rozwiążemy problem. Zawsze też dla ułatwienia pracy koloruj swoje panele na jakieś jaskrawe kolory.

0

@up

  1. Nie kopiowałem z książki, tylko przeglądałem ją, by znajdywać różne obiekty.
  2. Nie rozumiem, o co ci chodzi, mówiąc o kolorowaniu. Przecież mój problem polega na tym właśnie, że wszystko jest szare!!!
    A jeżeli chodzi ci o kolorowanie kodu, to... niby jak? :D Pisząc w Notepadzie++ raczej nie da się kolorować składni - robi się to automatycznie.
  3. Bez względu na to, czy zacznę od 1, czy od 1000 przycisków - żaden się nie wyświetla, więc twoja pomoc dotycząca zaczynania od jednego przycisku nie pomaga.

Z tego wszystkiego wydaje mi się, że nie przeczytałeś poprzednich postów.
PS: To ja - Norbi452. Jestem na innym komputerze i nie chciało mi się logować

0

Mówiąc o kolorowaniu, miałem na myśli kolorowanie samych paneli, a nie składni. panel.setBackground(Color.red); - coś takiego pozwoli ci zobaczyć, czy problem tkwi w rysowaniu panelu czy dodawaniu obrazka. Ja osobiście preferuję dodawanie obrazków przez JLabel, a jeśli chodzi o samo tło aplikacji to już trochę dłuższy temat. Postaram się napisać kod do którego dodam panel czerwony przycisk i jakiś obrazek. Na tej podstawie będziesz mógł zobaczyć o co mniej więcej chodzi.

Kod składa się z dwóch klas zewnętrznych:
Klasa wywołująca ramkę:

Kopiuj
import java.awt.EventQueue;
public class JavaApplication17 {
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			
                             
			public void run() {
                            
				new ramka();
			}
		});
	}
}

Klasa druga, która służy za wywołanie ramki z panelem, przyciskiem i obrazkiem:

Kopiuj
import java.awt.Color;
import java.awt.*;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JPanel;

/**
 *
 * @author .....
 */
public class ramka
{
    JPanel panel_glowny = new JPanel();
    ImageIcon image = new ImageIcon("TUTAJ WPISZ NAZWE SWOJEGO OBRAZKA, KTORY ZNAJDUJE SIE W FOLDERZE PROJEKTU.png");
    JLabel obraz = new JLabel(image);
    JButton przycisk = new JButton("Przycisk");
    public ramka()
    {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200,200);
        frame.setResizable(true);		
        frame.setVisible(true);
        frame.add(panel_glowny);
        panel_glowny.setLayout(new BorderLayout());
        panel_glowny.setBackground(Color.red);
        panel_glowny.add("South",przycisk);
        panel_glowny.add("Center",obraz);
        
        
        
    }
}

Pisałeś wcześniej, że nie działa ci getConetentPane dlatego w moim kodzie go nie umieściłem. Pamiętaj o zmienieniu ścieżki dostępu do obrazka.

bogdans
Przeczytałeś cały wątek ze zrozumieniem?
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

@....., jakbyś czytał posty, to byś wiedział, że musi być tak:

Kopiuj
public class ramka
{
    JPanel panel_glowny = new JPanel();
    ImageIcon image = new ImageIcon("TUTAJ WPISZ NAZWE SWOJEGO OBRAZKA, KTORY ZNAJDUJE SIE W FOLDERZE PROJEKTU.png");
    JLabel obraz = new JLabel(image);
    JButton przycisk = new JButton("Przycisk");
    public ramka()
    {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200,200);
        frame.setResizable(true);                
        frame.setVisible(true);
        frame.getContentPane().add(panel_glowny);
        panel_glowny.setLayout(new BorderLayout());
        panel_glowny.setBackground(Color.red);
        panel_glowny.add("South",przycisk);
        panel_glowny.add("Center",obraz);
 
 
 
    }
}

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
N4
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:193
0

żaden z waszych sposobów nie działa. Wydaje mi się po prostu, że z moją Javą jest coś nie tak. Hmmm... a może by tak przejść na C++? :D Podobno (PODOBNO!!!) jest łatwiejsze (inaczej nie zaczynałoby się od niego w technikum). A wy - co o tym myślicie? :D


...
Shalom
Jest znacznie trudniejszy. Jak nie potrafisz sobie poradzić ze skompilowaniem gotowego kodu w javie to ja bym się zastanowił czy nie zmienić profilu kształcenia...
0

Jak nie działa to znaczy, że twój kompilator to g.... Ściągnij sobie netBeansa i po problemie. Ja w liceum uczyłem się javy, a zdania są podzielone co jest łatwiejsze. Wielu mówi, że powinno się zaczynać od języków obiektowych - javy. Zależy jeszcze co chcesz robić, w javie np. nie można pisać wirusów, ale za to można tworzyć aplety, aplikacje na androida i inne. Nie znam innych języków, dlatego każda moja opinia na temat, który język jest lepszy byłaby subiektywna.

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Javę masz z Oracle'a (Suna), czy jakiś chałupniczy wyrób?
Moim zdaniem, należy zaczynać naukę programowania od Pythona.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans
N4
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 12 lat
  • Postów:193
0

Spróbuję Pythona, może faktycznie będzie prostszy. Po prostu mam znajomego informatyka (nie zaraz po technikum, tylko z 20-letnim doświadczeniem), który polecił mi na początek Javę. Niestety, ale java mi nie chodzi (od Sun Microsystems, nie "chałupnicza robota" :D), więc spróbuję sił w Pythonie, a później przejdę na coś bardziej zaawansowanego, np. zacznę C++ albo wrócę do Javy.
Wielkie dzięki za wsparcie, koledzy.
Jeżeli nikt nie ma nic do dodania, to proszę moderatora o zamknięcie tematu.


...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.