Wyświetlanie w oknie programu

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).

 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ść.

0

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

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...

0

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

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ć...

0

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

add(komponent);

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

getContentPane().add(komponent);
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.

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ę:

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:

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.

0

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

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);
 
 
 
    }
}
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

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.

0

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

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.

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