Przyczepiony panel

0

Cześć,

Chciałbym w swoim projekcie uzyskać takie coś: http://i.imgur.com/nqiF5.png.
Czy ktoś mógłby mnie nakierować jak wykonać taki przyczepiony panel(nowa forma) z buttonami do głównej formy? Oczywiście przy poruszaniu głównej formy cały czas ta dodatkowa powinna być przyczepiona do niej.

Dzięki

I co nikt nie wie jak to zrobić?

0

Najprościej będzie jeżeli skorzystać z dwóch JFrame. Na potrzeby przykładu nazwijmy je First i Second. Konstruktor klasy First może wyglądać np. tak:

    Second s;
    public DoubleFrame() {
        initComponents();

        addComponentListener(new ComponentAdapter() {

            @Override
            public void componentMoved(ComponentEvent e) {
                s.setLocation(getX() + getWidth(), getY() + ((getHeight() - s.getHeight()) / 2));
            }

            @Override
            public void componentResized(ComponentEvent e) {
                s.setLocation(getX() + getWidth(), getY() + ((getHeight() - s.getHeight()) / 2));
            }
        });
        s = new Second();
        s.setLocation(getX() + getWidth(), getY() + ((getHeight() - s.getHeight()) / 2));

        s.setVisible(true);
    }

Warto również ustawić dla Second

setUndecorated(true);

P.S.
Nie wiem dlaczego, ale przy pierwszym przesuwaniu okna event odpowiedzialny za przesunięcie nie przychodzi. Od drugiego razu jest ok... :/

P.S.S.
Oczywiście kod odpowiedzialny za przesuwanie drugiej ramki wydziel gdzieś w jedno wspólne miejsce ;)

0
 private MenuPanel panel;

    public MainForm(Integer divide) {
        initComponents();
        addComponentListener(new ComponentAdapter() {
            @Override
            public void componentMoved(ComponentEvent e) {
                panel.setLocation(getX() + getWidth(), getY() + ((getHeight() - panel.getHeight()) / 2));
            }
        });
        panel = new MenuPanel();
        panel.setLocation(getX() + getWidth(), getY() + ((getHeight() - panel.getHeight()) / 2));
        panel.setVisible(true);

Wydaje się być ok. U mnie przy przesuwaniu MainForm wszystko się przesuwa za pierwszym razem nawet. Dzięki :)

A jak zrobić żeby windows nie pokazywał ze są otwarte dwa oddzielne okna?

0

Inne rozwiązanie, które może nie być zawsze i wszędzie wspierane, polega na ręcznym definiowaniu kształtu okna. Dokładny opis znajdziesz na http://docs.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html Całość umieszczasz w jednym JFrame, którego kształt ręcznie definiujesz (pamiętaj by uwzględnić skalowanie). Możesz również pomyśleć nad takim rozwiązaniem problemu, który w sytuacji gdy window shape nie jest wspierane korzystać będzie z ComponentListenera, wybór należy do Ciebie.

P.S.
Zwróć uwagę, że wymagana jest Java7

0

Niech MenuPanel dziedziczy po innej klasie, np. po JWindow.

0

Jak dam tak: public class MenuPanel extends javax.swing.JWindow { to wtedy mam bledy tutaj setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setUndecorated(true);

0

JWindow jest undecorated "z natury". Nie ma ani możliwości, ani potrzeby by to zmieniać

0

Mam problem z dodaniem buttonow do tej przyczepionej formy.

public class ThumbPanel extends javax.swing.JWindow {

    public ThumbPanel() throws UnsupportedEncodingException {
        initComponents();
        displayThumbs();
    }

    private void displayThumbs() throws UnsupportedEncodingException
    {
          int count = 8;
          JButton[] jButtons = new JButton[count];
          for(int i = 0; i < count; i++) {
              thumbPanel.add(jButtons[i]);
          }
    }
 

Chcialbym aby tworzylo sie na panelu 8 buttonow w jednej kolumnie jeden pod drugim i jesli przestana sie miescic to powinien pojawic sie scroll w gore i w dol. W ogole dostaje blad przy uruchomieniu

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

0
  1. Zmień menadżera rozkładu
public class ThumbPanel extends javax.swing.JWindow {
 
    public ThumbPanel() throws UnsupportedEncodingException {
        setLayout(new GridLayout(8,1,3,3));
        initComponents();
        displayThumbs();
    }
 
    private void displayThumbs() throws UnsupportedEncodingException
    {
          int count = 8;
          JButton[] jButtons = new JButton[count];
          for(int i = 0; i < count; i++) {
              thumbPanel.add(jButtons[i]);
          }
    }
  1. Nie rozumiem tego, że się nie mieszczą skoro nie ustaliłeś rozmiaru. W każdym razie jak chcesz paski przewijania, to użyj JScrollPane
  2. Skoro masz NPE, to znaczy że używasz w kodzie obiektu, którego nie skonstruowałeś.
0

Twój kod nic nie daje dalej mam błędy

0

Jesteś trąba. Ja ci nie poprawiałem kodu, tylko pokazałem jak zmienić menadżera rozkładu.

0
public class ThumbPanel extends javax.swing.JWindow {
    private MainForm mainForm;
    private int count;
    public ThumbPanel(MainForm mainForm) throws UnsupportedEncodingException {     
        count = 8;      
        thumbPanel.setLayout(new GridLayout(count,1,3,3));   //thumbpanel = scroll panel wrzucony na forme
        initComponents();
        this.mainForm = mainForm;   //glowna forma do ktorej przyczepiona jest ta z panelem
        displayThumbs();
    }

    private void displayThumbs() throws UnsupportedEncodingException
    {
          JButton[] jButtons = new JButton[count];
          for(int i = 0; i < count; i++) {
              thumbPanel.add(jButtons[i]);    //dodajemy tyle buttonow ile jest w count;
          }
    } 

Taki mam kod. Dodałem komentarze aby latwiej bylo zrozumiec co chce osiagnac.

0

Kod jest bardzo ładny. A jak brzmi pytanie? Jeśli chcesz się dowiedzieć dlaczego dostajesz NPE, to brakuje informacji, który wiersz powoduje ten błąd.

0

Program sie kompiluje i uruchamia ale gdy ma wyswietlic glowna forme z ta przyczepiona nic sie nie dzieje a w NetBeansie dostaje takie errory:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at sliding.puzzle.ThumbPanel.<init>(ThumbPanel.java:16)
	at sliding.puzzle.MainForm.<init>(MainForm.java:46)
	at sliding.puzzle.ChooseForm.jButton1ActionPerformed(ChooseForm.java:123)
	at sliding.puzzle.ChooseForm.access$000(ChooseForm.java:12)
	at sliding.puzzle.ChooseForm$1.actionPerformed(ChooseForm.java:56)
......
...... 
0

Jesli to dam na poczatek initComponents();

 bo tak powinno byc ;p to dostaje blad: `Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: layout of JScrollPane must be a ScrollPaneLayout `
0

Po wpisaniu thumbPanel.setLayout(new ScrollPaneLayout()); znow mam blad Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

0

Dużo piszesz, ale który wiersz powoduje NPE nie chcesz zdradzić.
To ma być tak: Tworzysz JPanel p, ustawiasz mu menadżera rozkładu p.setLayout(new GridLayout(...)), tworzysz JScrollPanel sp=new JScrollPane(p), dodajesz (metoda add()) sp do JWindow.

0

Chcialbym pokazac ktory to wiersz ale netBeans mi nie pokazuje numeru wiersza z bledem ;/
Czyli zanim wrzuce scroolpanela to najpierw na forme normalny panel?

0
  1. To uruchom z ręki. NetBeans to środowisko do tworzenia i debugowania programów, nie do uruchamiania.
  2. Nie, tworzysz panel p w pamięci komputera, potem tworzysz sp=new JScrollPane(p) i sp w JWindow.
0

Kod wyglada tak: public class ThumbPanel extends javax.swing.JWindow {
private MainForm mainForm;
private int count;

public ThumbPanel(MainForm mainForm) throws UnsupportedEncodingException {
    initComponents();
    count = 8;
    this.mainForm = mainForm;
    displayThumbs();
}

private void displayThumbs() throws UnsupportedEncodingException {
    JPanel jPanel = new JPanel();
    jPanel.setLayout(new GridLayout(count, 1));
    JScrollPane sp = new JScrollPane(jPanel);
    JButton[] jButtons = new JButton[count];
    this.add(sp);
    for (int i = 0; i < count; i++) {
        sp.add(jButtons[i]);
    }
}
Program NetBeans. Debugowanie (klawisz F5). I nic oprocz tego mi sie nie wyswietla:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at java.awt.Container.addImpl(Container.java:1041)
at java.awt.Container.add(Container.java:365)
at projekt1.ThumbPanel.displayThumbs(ThumbPanel.java:31)
at projekt1.ThumbPanel.<init>(ThumbPanel.java:21)
at projekt1.MainForm.<init>(MainForm.java:46)
at projekt1.ChooseForm.jButton3ActionPerformed(ChooseForm.java:143)
at projekt1.ChooseForm.access$200(ChooseForm.java:12)
at projekt1.ChooseForm$3.actionPerformed(ChooseForm.java:72)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6288)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6053)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4651)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643)
at java.awt.EventQueue.access$000(EventQueue.java:84)
at java.awt.EventQueue$1.run(EventQueue.java:602)
at java.awt.EventQueue$1.run(EventQueue.java:600)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
at java.awt.EventQueue$2.run(EventQueue.java:616)
at java.awt.EventQueue$2.run(EventQueue.java:614)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:613)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

0

Trochę nieuważnie czytałem Twój kod.

    private void displayThumbs() throws UnsupportedEncodingException {
        JPanel jPanel = new JPanel();
        jPanel.setLayout(new GridLayout(count, 1));
        JScrollPane sp = new JScrollPane(jPanel);
        JButton[] jButtons = new JButton[count]; // tu tworzysz tablicę przycisków, ale w niej są nulle, bo samych przycisków nie tworzysz
        this.add(sp);
        for (int i = 0; i < count; i++) {
            jButtons[i]=JButton(); //tego brakowało, tak utworzone przyciski będą identyczne i bez żadnego napisu 
            sp.add(jButtons[i]);
        }
    }
0

Wiem ze zeby dodac obrazek do buttona trzeba uzyc jButtons[i].setIcon tylko jak go uzyc jesli obrazki mam w tablicy File[]

Edit: I nie wiem czy ten twoj kod dodaje jednak te buttony bo: for (int i = 0; i < countImage; i++) {
jButtons[i] = new JButton();
jButtons[i].setText("Button numer: " + i);
sp.add(jButtons[i]);
}


taki kod dalem ustawilem Text zeby bylo widac i nie widze zeby byly te buttony ;/
0

private void displayThumbs() throws UnsupportedEncodingException {
JPanel jPanel = new JPanel();
jPanel.setLayout(new GridLayout(count, 1));
JScrollPane sp = new JScrollPane(jPanel);
JButton[] jButtons = new JButton[count]; // tu tworzysz tablicę przycisków, ale w niej są nulle, bo samych przycisków nie tworzysz
this.add(sp);
for (int i = 0; i < count; i++) {
jButtons[i]=JButton(); //tego brakowało, tak utworzone przyciski będą identyczne i bez żadnego napisu
jPanel.add(jButtons[i]);
}
}

0

Mam tak private void displayThumbs() {
JPanel jPanel = new JPanel();
jPanel.setLayout(new GridLayout(countImage, 1));
JScrollPane sp = new JScrollPane(jPanel);
JButton[] jButtons = new JButton[countImage];
this.add(sp);
for (int i = 0; i < countImage; i++) {
jButtons[i] = new JButton(); //tutaj nie moze byc jButtons[i] = JButton() bo dostaje blad
jPanel.add(jButtons[i]);
}
}


I chyba nie bardzo sie tworza te buttony chcialbym to sprawdzic dodajac do kazdego inny text `jButtons[i].setText("nr: "+i) `. Ale tez nic nie wyswietla ;/
0

Nie wiem co wyczyniasz. Napisałem programik testowy, działa jak trzeba.

 import javax.swing.*;
 import java.awt.*;
 
 public class Window extends JWindow
 {
    public static void main(String[] args)
    {
        new Window();
    }
    public Window()
    {
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(8,1,3,3));
        JScrollPane sp = new JScrollPane(panel);
        add(sp);
        for (int i = 0; i<8; i++) 
        {
            panel.add(new JButton(""+(i+1)));
        }
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    } 
 }
0

Kurde nie mam pojęcia o co chodzi ;/

0

Żeby się pojawił suwak potrzebna jest drobna poprawka (JFrame jej nie wymaga):

 import javax.swing.*;
 import java.awt.*;
 
 public class Window extends JWindow
 {
    public static void main(String[] args)
    {
        new Window();
    }
    public Window()
    {
        int counter=45; 
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(counter,1,3,3));
        JScrollPane sp = new JScrollPane(panel);
        getContentPane().add(sp); //tu było add(sp);
        setPreferredSize(new Dimension(100,800));
        for (int i = 0; i<counter; i++) 
        {
            panel.add(new JButton(""+(i+1)));
        }
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    } 
 }
0

Dziala tylko to setPreferredSize(new Dimension(100,800)); forma jest wydluzana. Gdy dodaje buttony recznie w Netbeansie to sa widoczne a ten kod ich nie dodaje ;/

0

Na pewno wpisałeś polecenie pack();? Trzeba je umieścić po dodaniu przycisków.

0

Dokladnie jest tak jak u ciebie. Moze problem z tym jak wywoluje ta dodatkowa forme?

 public MainForm(Integer divide) throws UnsupportedEncodingException {
        initComponents();
        addComponentListener(new ComponentAdapter() {
            @Override
            public void componentMoved(ComponentEvent e) {
                panel.setLocation(getX() + getWidth(), getY() + ((getHeight() - panel.getHeight()) / 2));
            }
        });
        panel = new ThumbPanel(this);
        panel.setLocation(getX() + getWidth(), getY() + ((getHeight() - panel.getHeight()) / 2));
        panel.setVisible(true);
    }

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