Etykiety i pola tekstowe - GUI

0

Napisać aplikację, która prezentuje okno GUI, zawierające etykiety i pola tekstowe, Etykiety powinny być skojarzone z polami tekstowymi za pomocą mnemonik, które wprowadzają kursor w dane pole tekstowe. Na końcu każdego "wiersza" etykieta-pole tekstowe winna znajdować się owalna etykieta z odpowiednio rozmieszonym napisem (zob.dalej), po wskazaniu której myszką uzyskamy podpowiedź dotyczącą sposobu wpisywania danych.
Pokazuje to poniższy rysunek:
http://i58.tinypic.com/2rynale.jpg

Etykiety, skojarzone z tekstem:

mają mieć podkreślone litery menmonik, które wprowadzają kurosr w pole tekstowe obok,
mają mieć tekst i ikonę rozmieszczone tak jak na rysunku, kolor tła wybierany na starcie aplikacji oraz powinny być ujęte w ramkę; ikony czerwone reprezentują dane niezbędne, zielone - niekonieczne,
ich rozmiary mają być równe i** dokładnie takie by zmieścić** najdłuższy napis, przy czym powinno to zależeć od pisma (pismo wybieramy na starcie aplikacji),
przy zmianie rozmiarów okna nie zmieniają swoich rozmiarów.

Pola tekstowe:

powinny mieć rozmiary różne, zależne od przewidywanej maksymalnej wielkości wpisywanych danych wyrażonej w liczbie znaków** i pisma wybieranego na starcie aplikacji**, przy czym rozmiar powinien odpowiadać liczbie znaków w danym piśmie,
przy zmianie rozmiarów okna mogą zmieniać swoje rozmiary (tylko szerokość i i nie przekraczając wielkości, wynikającej z maksymalnej liczby znaków w danym piśmie,
powinny być ujęte w ramkach jak na rysunku.

Etykiety owalne, służące do otwierania podpowiedzi:

powinny mieć tekst podany jak na rysunku (kilka wierszy, różny kolor wyranych fragmentów, centrowanie tekstu)
powinny mieć skojarzony tekst pomocy , pokazywany jako podpowiedź po wskazaniu etykiety myszką (automat),
nie zmieniają swoich rozmiarów.

Tekst pomocy:

ma być ujęty w grubą czerwoną ramkę,
ma składać się z kilku wierszy,
fragmenty tekstu mają być wyróżnione (np. kolorem czerwonym).


Proszę o wskazówki do zadania.
Nie wiem czy dobrze do tego chcę podejść. Tak się zastanawiam czy dobrym rozwiązaniem będzie robić GridLayout, gdzie są 3 kolumny?
Nie bardzo rozumiem o co chodzi z 'mają mieć podkreślone litery menmonik, które wprowadzają kurosr w pole tekstowe obok'.
Na razie próbowałam zrobić te przyciski (bez podkreślenia) z zielonymi i czerwonymi ikonkami.
Ikonki:
http://i58.tinypic.com/r7mbr7.jpg
http://i57.tinypic.com/24w99no.jpg
http://wklej.org/id/1369107/
To na razie próba, choć w takiej formie nie bardzo wiem jak dodać, by kolor wybierał użytkownik.
Nie wiem czy to w ogóle dobry sposób rozwiązywania tego zadania :(

Mógłby ktoś udzielić jakiś raz? Może naprowadzić jakoś lub pokazać czego w tym programie użyć?
Z góry dziękuję.

1

Później napiszę trochę więcej. Pomysł z GridLayout o trzech kolumnach jest niedobry. Powinien być GridLayout z jedną kolumną i pięcioma wierszami. A każdy komponent winien być JPanelem z obramowaniem (Border).

0

Napisałam kawałek kodu, nie wiem czy to o do chodziło:

import java.awt.*;
import javax.swing.*;
 
public class Panel {
 
    public static void main(String[] args) {
 
        JFrame frame = new JFrame();
 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(515, 400));
        frame.setLayout(new BorderLayout(1,5));
        Icon r = new ImageIcon("red.gif");
      	Icon g = new ImageIcon("green.gif");
        
      JPanel p1 = new JPanel();
      p1.setBackground(Color.GRAY); 
      p1.setBorder(BorderFactory.createLineBorder(Color.BLUE)); 

      JTextField tf1 = new JTextField("");
      tf1.setBorder(BorderFactory.createLineBorder(Color.RED) );
      p1.add(tf1);
      
        frame.pack();
        frame.setLocationRelativeTo(null); 
        frame.setVisible(true);
 
    }
} 

Już dodałam te dwie ikonki, choć nie wiem jak to potem w kodzie wstawić.
O to chodziło z 5 JPanelami? Choć nie jestem pewna czy dodawanie JTextField jako miejsca na wpisywanie danych do dobry pomysł (i jak później ustawić, by każde miało inną długość?)

1

Moja idea była taka:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
public class Zadanie extends JFrame
{
    private Panelik[] panele = new Panelik[5]; 
    private Icon red = new ImageIcon("red.png");
    private Icon green = new ImageIcon("green.png"); 
    private Font font = new Font("monospaced",Font.PLAIN,12);
    public static void main(String[] args) 
    {
        new Zadanie();
    }
    public Zadanie()
    {
        setLayout(new GridLayout(5,1,2,2));
        panele[0] = new Panelik("   Kraj",KeyEvent.VK_K,8,"kraj?","wpisz kraj","pochodzenia towaru",true);
        panele[1] = new Panelik(" Miasto",KeyEvent.VK_M,10,"miasto?","wpisz miasto","urodzin Prosiaczka",true);
        panele[2] = new Panelik("  Adres",KeyEvent.VK_A,20,"adres?","wpisz adres","Słonia Trąbalskiego",false);
        panele[3] = new Panelik("Telefon",KeyEvent.VK_T,10,"telefon?","wpisz telefon","do straży pożarnej",true);
        panele[4] = new Panelik("    Fax",KeyEvent.VK_F,6,"fax?","wpisz fax","do MSW",false);
        for(int i=0;i<panele.length;i++)
        {
            panele[i].setBorder(BorderFactory.createLineBorder(Color.BLUE));
            add(panele[i]);
        }
 
        pack();
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        
        setVisible(true); 
    }
    class Panelik extends JPanel
    {
        private JTextField tf = null;
        private int longest = 20;
        public Panelik(String label,int key,int width,String ovalLabel,String tooltip1,String tooltip2,boolean required)
        {
            setLayout(new FlowLayout(FlowLayout.LEFT));
            tf = new JTextField(width);
            tf.setBorder(BorderFactory.createLineBorder(Color.RED));
            tf.setFont(font);
            JLabel l = null;
            if(required)
            {            
                l = new JLabel(label,red,JLabel.RIGHT);
            }
            else
            {
                l = new JLabel(label,green,JLabel.RIGHT);
            }
            l.setHorizontalTextPosition(SwingConstants.LEFT);
            l.setIconTextGap(3);
            l.setLabelFor(tf);
            l.setDisplayedMnemonic(key);
            l.setFont(font);
            add(l);
            add(tf);
            StringBuffer sb = new StringBuffer("");
            for(int i=0;i<longest-width;i++)
            {
                sb.append(" ");
            }
            l = new JLabel(sb.toString());
            l.setFont(font);
            add(l);
            l = new JLabel("<html>Jak<br>wpisać<br>"+ovalLabel+"</html>");
            l.setToolTipText("<html>W polu obok<br><font color=\"red\">"+tooltip1+"</font><br>"+tooltip2+"</html>");
            l.setFont(font);
            add(l);
        }
    }
} 

Btw. w języku polskim nie stawia się spacji przed żadnymi znakami interpunkcyjnymi pytajnikami.

0

Bardzo dziękuję, już analizuję ten kod.
U mnie daje on taki efekt: http://i58.tinypic.com/2dj6xqb.png
Zastanawiam się tylko czy da się by słowa "Kraj", "Miasto" i tak dalej były na żółtym tle w ramce?
I czego użyć do zrobienia owalnej ramki + tekstu pomocy, który pojawia się po najechaniu kursorem?
Widzę, że jest tam "setToolTipText" i "ovalLabel" ale nie wiem co zmienić co powinnam dodać by podziałało.

I jeszcze mam problem, chciałam przedłużyć te pola na tekst, jednak mimo zwiększenia liczby najdłuższego, wciąż są takiej samej wielkości.

0

Tekst pomocy po najechaniu kursorem się przecież pojawia. A resztę zostawiam Tobie.

0

Niestety u mnie się nie pojawia, czy to może być wina JCreatora?

0

A co ma z tym wspólnego JCreator? IDE służy do pisania programów, a nie do ich uruchamiania. Stwórz jara lub wpisz w konsoli java Zadanie.

0

Udało mi się już zrobić okrągłe etykiety i po najechaniu myszy też się podświetla (w tym wszystkie kolory i pogrubienia). Tylko mam problem z JToolTip. Próbowałam paru wskazówek z internetu, ale niestety kolor tła nie działa (wciąż jest niebieski).

Teraz wygląda to tak: http://i60.tinypic.com/m9u0yw.png

Edycja: już się udało :) w każdym razie dziękuję za pomoc z kodem do zadania.

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