Podstawy GUI w Swingu

0

Witam chce zrobić gui według tego tutka ale on chyba jest za stary i nieaktualny. Chce wstawić JLabel i niemoge tak samo z JTextFild i nieche mi działać, Co robię złe ?

import javax.swing.*;
public class CalFan2 extends JFrame
{
	
	
	public CalFan2() 
	{
		JTextFild tCal, tFan;
		
		setSize(400,200);
		setTitle("Przeliczanie stopni");
		
		tCal = new JTextField("");
		tCal.setBounds(170,20,150,20);
		add(tCal)
		
		
	}
 

	
    public static void main(String[] args) 
    {
    	CalFan apka = new CalFan();
    	apka.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    	apka.setVisible(true);
	}
}
0

Zdefiniuj "nie chce mi działać".

0

Masz jeszcze raz kod

1

import javax.swing.*;


public class CalFan2 extends JFrame
{
	
	
	public CalFan2() 
	{
		JTextFild tCal, tFan;
		
		setSize(400,200);
		setTitle("Przeliczanie stopni");
		
		tCal = new JTextField("");
		tCal.setBounds(170,20,150,20);
		add(tCal)
		
		
	}
 

	
    public static void main(String[] args) 
    {
    	CalFan apka = new CalFan();
    	apka.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    	apka.setVisible(true);
	}
//30}

Dodałem teraz 1-30 abyś wiedział ile jest linijek bez liczenia a tu błąd
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Access restriction: The type JFrame is not accessible due to restriction on required library C:\Program Files\Java\jre8\lib\rt.jar
JTextFild cannot be resolved to a type
Access restriction: The constructor JTextField(String) is not accessible due to restriction on required library C:\Program Files\Java\jre8\lib\rt.jar
Access restriction: The type JTextField is not accessible due to restriction on required library C:\Program Files\Java\jre8\lib\rt.jar
Syntax error, insert ";" to complete Statement
Access restriction: The method setDefaultCloseOperation(int) from the type JFrame is not accessible due to restriction on required library C:\Program Files\Java\jre8\lib\rt.jar
Access restriction: The type WindowConstants is not accessible due to restriction on required library C:\Program Files\Java\jre8\lib\rt.jar
Access restriction: The field EXIT_ON_CLOSE from the type WindowConstants is not accessible due to restriction on required library C:\Program Files\Java\jre8\lib\rt.jar

at CalFan2.<init>(CalFan2.java:4)
at CalFan2.main(CalFan2.java:26)
0

JTextField a nie JTextFild....

0

Nie pomogło
tu chyba krwi błąd
public class CalFan2 extends JFrame
i tu CalFan2 apka = new CalFan2();

0

Błąd wygląda tak jakbyś do tego projektu dołączył jednocześnie więcej niż jedno jdk, w różnych wersjach. Zgaduje ze to eclipse tak zaćpał. Wywal z build path JRE/JDK i dodaj jeszcze raz. Ewentualnie importuj potrzebne klasy explicite a nie za pomocą *

0

Może pomyśl nad: http://www.jetbrains.com/idea/
sam importuje takie proste rzeczy,k których potrzeba

0

Masz kilka literówek. Tu masz działający kod:

import javax.swing.*;

public class CalFan2 extends JFrame {

    public CalFan2() 
    {
        JTextField tCal, tFan;
 
        setSize(400,200);
        setLayout(null); //dopisałem - bogdans
        setTitle("Przeliczanie stopni");
 
        tCal = new JTextField("");
        tCal.setBounds(170,20,150,20);
        add(tCal);
    }
 
    public static void main(String[] args) 
    {
        CalFan2 apka = new CalFan2();
        apka.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        apka.setVisible(true);
    }
}
0

Poprawiony kod:

import java.awt.FlowLayout;

import javax.swing.*;

public class CalFanFrame extends JFrame {
	 public static final int WIDTH = 400;
	 public static final int HEIGHT = 200;
	 
	 public CalFanFrame()  {
		 setUpFrame();
		 initializeComponents();
	 }
	 
	 private void setUpFrame() {
	     setSize(WIDTH, HEIGHT);
	     setLayout(new FlowLayout());
	     setTitle("Przeliczanie stopni");
	 }
	 
	 private void initializeComponents() {
	     JTextField tCal = new JTextField("Pole tekstowe");
	     add(tCal);
	 }
}

// *******************************************************************

import java.awt.EventQueue;

import javax.swing.WindowConstants;

public class Runner {
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				CalFanFrame apka = new CalFanFrame();
			    apka.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
			    apka.setVisible(true);
			}
		});
	}
}

0

Ten 2 kod to jest do czego ?
A ten setLayout(null); pisałem pod tytułem wcześniej i to chyba byłą tego wina

0

Drugi kod jest kodem poprawionym i napisanym w bardziej prawidłowy sposób. Tak jak napisał bogdans, możesz używać setBounds jeśli ustawisz layout na null.
Poczytaj sobie o zarządcach układu w swingu:

http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html
lub
http://javastart.pl/grafika_awt_swing/zarzadzanie_rozkladem/

0

To mam jeszcze 1 problem nie wiem gdzie ma błąd w kodzie (już szukałem 1h i nie mogę znaleźć) oraz jak byś mógł to poprawić to w prawidłowy sposób (bo robie tak ja na filmie a mam 14lat i dopiero 2 dni się tym bawię)

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

import javax.swing.*;
 
public class Test2 extends JFrame implements ActionListener implements KeyListener
{
	 JTextField tCal, tFan;
	 JLabel lCal, lFan;
	 JButton bKon;
	 double tempCal, tempFan;
	 JCheckBox chWielkie; 
    
    public Test2() 
    {
        setSize(400,200);
        setLayout(null); 
        setTitle("Przeliczanie stopni");
        
        lCal = new JLabel("Stopnie Celsiusza");
        lCal.setBounds(20,20,150,20);
        add(lCal);
        
        lFan = new JLabel("Stopnie Fahrenheita");
        lFan.setBounds(20,80,150,20);
        add(lFan);
 
        tCal = new JTextField("32");
        tCal.setBounds(170,20,150,20);
        add(tCal);
        tCal.addActionListener(this);
        
        tFan = new JTextField("");
        tFan.setBounds(170,80,150,20);
        add(tFan);
        
        bKon = new JButton("Konwertuj");
        bKon.setBounds(100,120,150,20);
        add(bKon);
        bKon.addActionListener(this);
        
        chWielkie = new JCheckBox ("Wielkie litery");
        chWielkie.setBounds(250,120,150,20);
        add(chWielkie);
        chWielkie.addActionListener(this);
        
    }
    
    public void actionPerformed(ActionEvent e) 
    {
    	Object zrodlo = e.getSource();
    	if (zrodlo==bKon || zrodlo==tCal)
    	{
		tempCal = Double.parseDouble(tCal.getText());
		tempFan = 32.0 + (9.0/5.0) * tempCal;
		tFan.setText(String.valueOf(tempFan));
    	}
    	else if (zrodlo==chWielkie)
    	{
    		if (chWielkie.isSelected()==true)
    		{
    			tFan.setFont(new Font("SandSerif", Font.BOLD, 18));
    		}
    		else
    		{
    			tFan.setFont(new Font("SandSerif", Font.PLAIN, 12));
    		}
    	}
	}



	public static void main(String[] args) 
    {
        Test2 apka = new Test2();
        apka.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        apka.setVisible(true);
    }
}
0

A w tym polskim tutku jest ten szyk który ja stosuje xD

0

Kompilator nie podpowiada co to za błąd oraz w której lini? Jeśli chcesz żeby klasa implementowała więcej niż jeden interfejs to podawaj je po przecinku.

Błąd miałeś w lini:

public class Test2 extends JFrame implements ActionListener implements KeyListener

Powinno być

public class Test2 extends JFrame implements ActionListener
0

@martiner32 czy ty programujesz lodówką czy mikrofalówką? Przecież dowolne sensowne IDE (IntelliJ, Eclipse czy Netbeans) od kopa rozwiązuje takie problemy...

0

Brakuje Ci importów. Wstaw na górze:

import javax.swing.*;

Zawsze możesz kliknąć na ikonkę która znajduje się po lewej stronie w lini w której jest błąd.

0

Kliknij Source => Organize imports.

0

Albo zacznij używać IntelliJ IDEA- tam wszystko jest prostsze.
Poza tym poczytaj sobie o Layoutach w Swingu, ponieważ ręczne określanie położenia i wielkości chociażby JTextFieldów nie jest dobre.
Co jeśli miałbyś napisać, np kalkulator? Położenia i wielkoścci przyciksów określałbyś ręcznie?

0

A ja mam jeszcze takie jedno proste pytanie jeżeli chce dać coś w indexie górnym to co mam wpisać ? sup.0 ?

Na skrinie jest cały kod poprawiony który działa xD tylko się wszystko nie zmieściło, a chciałem pokazać, że nie mogę się łatwo zorientować gdzie jest błąd

A organizacja importów tylko pogorszyło sprawę
https://www.dropbox.com/s/bqpldqfjsyvetpj/Zrzut%20ekranu%202014-04-25%2011.07.32.png

0

jak to ma być jakiś tekst na na elemencie graficznym to używasz w nim html'u.
Np:

<html>zwykły tekst <sup>gorny indeks</sup></html>

A tu dowiesz się więcej o tym jak używać htmlu w swingu:

http://docs.oracle.com/javase/tutorial/uiswing/components/html.html

0

Dobra thx pobrałem ten program co polecałeś Ty i Karolina i zobaczymy

0

Tu masz szybki filmik jak uruchomić program w IntelliJ IDEA:

0

@bakeraw2, zgadzam się co layoutów. Ręczne rozmieszczanie komponentów powinno stosować się bardzo wyjątkowo. Np. uzyskanie poniższego wyglądu z użyciem layoutów wymaga (tak mi się przynajmniej wydaje) umieszczenia w oknie 90 pustych obiektów typu JLabel. Lepiej chyba rozmieścić przyciski ręcznie i zablokować możliwość zmiany rozmiaru okna (setResizable(false);).

0

I mam kolejne pytanie czemu mi to nie działa
tFan.setText(String.valueOf(tempFan + "<html> F 0 </html>"));
i można jakoś zablokować rozciąganie okienka ?

0

Zamiast dodawać 90 pustych obiektów typu JLabel można utworzyć raz obiekt JLabel i dodać do 90 razy do panelu.

0

String.valueOf() służy do czegoś innego. Powinieneś użyć:

JLabel textField = new JLabel();
textField.setText("<html>20<sup>o</sup></html>");
add(textField);
0

@bakeraw2, na jedno wychodzi muszą być różne obiekty.
@martiner32, przecież pisałem

setResizable(false));
0

A i chce jeszcze to zatwierdza enterem ale nie wiem jak.

0

Nie zaciekawiło cię, że kody wstawiane przez inne osoby są pokolorowane? Podpowiedź: umieszczaj kod w znacznikach <tt>
< code=java>

</tt> (bez spacji!). Na razie kosz za nieczytelny kod.

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