LayoutManager i usadowienie/rozmiar JScrollPane

Odpowiedz Nowy wątek
2015-01-13 16:39
0

Witajcie!

Mam pewien problem. Uczę się aktualnie o GUI i wszystko szło gładko do momentu ustawienia rozmiaru JScrollPane.
Otóż mimo, że użyłem setBounds() dla scrollPane to pole textowe nie zmienia swojego rozmiaru tylko jest rozciągnięty na całą ramkę.

Dowiedziałem się, że LayoutManager jest ustawiony an default i gdy ustawiam setSize() dla JFrame automatycznie ignoruje on ustawienia innych komponentów.

Nie wiem jak mam się zabrać do zmiany ustawień LayoutManager więc prosił bym was o jak najwięcej informacji na ten temat. Starałem się przestudiować dokumentację ale mój angielski w dziedzinie programowania nie jest jeszcze wystarczalny by swobodnie się poruszać w dokumentacjach bibliotek.

pozdrawiam a tutaj kod

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import static javafx.scene.input.KeyCode.X;
import javax.swing.Box;
import javax.swing.JCheckBox;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;

public class JMenuTest extends JFrame implements ActionListener
{
    JMenuBar menuBar;
    JMenu menuPlik, menuNarzedzia, menuPomoc, menuOpcje;
    JMenuItem mOtworz, mZapisz, mWyjscie, mNarz1, mNarz2, mAbout, mOpcja1, mOpcja2;
    JCheckBoxMenuItem chOpcja3;
    JTextArea notatnik;
//    JScrollPane scrollPane;

    public JMenuTest()
    {
     setSize(800, 800);
     setTitle("Menu testowe");
     setVisible(true);
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

     menuBar = new JMenuBar();
     menuPlik = new JMenu("Plik");
        mOtworz = new JMenuItem("Otwórz");
        mZapisz = new JMenuItem("Zapisz");
        mWyjscie = new JMenuItem("Wyjdź");
            menuPlik.add(mOtworz);
            mOtworz.addActionListener(this);
            menuPlik.add(mZapisz);
            mZapisz.addActionListener(this);
            menuPlik.addSeparator();
            menuPlik.add(mWyjscie);

    mWyjscie.addActionListener(this);
    mWyjscie.setAccelerator(KeyStroke.getKeyStroke("ctrl X"));

     menuNarzedzia = new JMenu("Narzędzia");
        mNarz1 = new JMenuItem("Narz1");
        mNarz1.setEnabled(false);
        mNarz2 = new JMenuItem("Narz2");
        mNarz2.addActionListener(this);
            menuNarzedzia.add(mNarz1);
            menuNarzedzia.add(mNarz2);

     menuPomoc = new JMenu("Pomoc");
        mAbout = new JMenuItem("O programie");
            menuPomoc.add(mAbout);
            mAbout.addActionListener(this);

     menuOpcje = new JMenu("Opcje");
        mOpcja1 = new JMenuItem("Opcja 1");
        mOpcja2 = new JMenuItem("Opcja 2");
        chOpcja3 = new JCheckBoxMenuItem("tak");
            menuOpcje.add(mOpcja1);
            menuOpcje.add(mOpcja2);
            menuOpcje.add(chOpcja3);
            chOpcja3.addActionListener(this);
            menuNarzedzia.add(menuOpcje);   

        setJMenuBar(menuBar);
        menuBar.add(menuPlik);
        menuBar.add(menuNarzedzia);
        menuBar.add(menuPomoc);

        menuBar.add(Box.createHorizontalGlue());

        notatnik = new JTextArea();
        JScrollPane scrollPane = new JScrollPane(notatnik);
        scrollPane.setBounds(50, 50, 200, 200);
        add(scrollPane);

    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        Object z = e.getSource();
        if (z == mOtworz)
        {
            JFileChooser fc = new JFileChooser();
            if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
            {
                File plik = fc.getSelectedFile();
                JOptionPane.showMessageDialog(null, "Wybrany plik to: " + plik.getAbsolutePath());
            }
        }
        else if (z == mZapisz)
        {
            JFileChooser fc = new JFileChooser();
            if (fc.showSaveDialog(null) == JFileChooser.APPROVE_OPTION)
            {
                File plik = fc.getSelectedFile();
                JOptionPane.showMessageDialog(null, "Zapisany plik " + plik);
            }

        }

        if (z == mWyjscie)
        {
            int odp = JOptionPane.showConfirmDialog(null, "czy na pewno wyjsc?", "Pytanie", JOptionPane.YES_NO_OPTION );
            if (odp == JOptionPane.YES_OPTION)
            {
                dispose();
            }
            else if (odp == JOptionPane.NO_OPTION)
            {
                JOptionPane.showMessageDialog(null, "Wiedziałem");  
            }
            else if (odp == JOptionPane.CLOSED_OPTION)
            {

            }
        }
        if (z == chOpcja3)
        {
            if (chOpcja3.isSelected())
            {
                mNarz1.setEnabled(true);
            }
            else if (!chOpcja3.isSelected())  // Jeśli nie jest zaznaczona (zaprzeczenie)
            {
                mNarz1.setEnabled(false);
            }

        }
        if (z == mAbout)
        {
            JOptionPane.showMessageDialog(this, "Program demonstruje Menu \n Wersja 1.0");
        }
        if (z == mNarz2)
        {
          String sMetry = JOptionPane.showInputDialog("Podaj długość w metrach");
          double metry = Double.parseDouble(sMetry);
          double stopy = metry/0.3048;
          String sStopy = String.format("%.2f", stopy); // %.2f ogranicza zaokrąglenie do 2 miejsc po przecinku
          JOptionPane.showMessageDialog(null, metry + " metrów" + " = " + sStopy + " stóp");
        }

    }
        public static void main(String[] args)
        {
            JMenuTest appMenu = new JMenuTest();
            appMenu.setVisible(true);
        }
}

Pozostało 580 znaków

2015-01-13 16:50
0

Domyślny layout dla JFrame to BorderLayout. Opieraj się na managerach layoutów tym samym unikaj setBounds bo przy zmianie rozmiaru okna wszystko się rozjedzie. Tu masz nieco zmieniony Twój kod dla porównania

JScrollPane scrollPane = new JScrollPane(notatnik);
//        scrollPane.setBounds(50, 50, 200, 200);
// add(scrollPane); to jest równoznaczne z tym add(scrollPane, BorderLayout.CENTER);
        add(scrollPane, BorderLayout.NORTH);

A tutaj masz z obrazkami layouty, wbrew pozorom to ważne żeby sobie zwizualizować jak ma to wyglądać :)
http://docs.oracle.com/javase[...]al/uiswing/layout/visual.html

Pozostało 580 znaków

2015-01-13 18:48
0

rozumiem poniekąd mechanikę ale co jeśli chcę sam ustawić rozmiary pola tekstowego? stosując

JScrollPane scrollPane = new JScrollPane(notatnik);
        scrollPane.setPreferredSize(new Dimension(200, 200));
        add(scrollPane, BorderLayout.NORTH);

Nie dostaję pożądanego efektu. Owszem wysokość rzeczywiście się zmienia natomiast szerokość w dalszym ciągu zajmuje całą ramkę.

I co z usadowieniem? chciałbym zmienić pozycję w której ramka się znajduje.

Pozostało 580 znaków

2015-01-13 18:58
0
  1. Tak po prostu działa BorderLayout :) Osobiście najczęściej używam GridBagLayout - jest bardziej konfigurowalny.
  2. Zawołaj dla ramki metodę
    frame.setLocation(x, y);

Pozostało 580 znaków

2015-01-13 19:20
0

ojj mała pomyłka . Chodziło mi o usadowienie i rozmiar pola tekstowego.

BorderLayout nie daje Ci aż takiej swobody. Poczytaj o GridBagLayout - garai 2015-01-13 19:34

Pozostało 580 znaków

2015-01-13 19:50
0

Łap przykład.

JScrollPane scrollPane = new JScrollPane(notatnik);
        scrollPane.setPreferredSize(new Dimension(200, 200));
        GridBagLayout gbl = new GridBagLayout();
        setLayout(gbl);
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;
//        gbc.gridx = 0;
//        gbc.gridy = 0;
        gbc.weighty = 1;
        gbc.weightx = 1;
        add(scrollPane, gbc);

Pozostało 580 znaków

2015-01-14 00:34
0

zdecydowałem, że stworzę aplikację od nowa tyle, że za pomocą graficznego edytora GUI udostępnionego przez środowisko NetBeans i okazało się, że edytor także zastosował GridBagLayout. Dzięki ogromne za pomoc w tym!

Natomiast mam inny problem poziomy scroller pola tekstowego jest domyślnie widoczny od razu, natomiast pionowy ukazuje się dopiero gdy tekst zajmie więcej niż wysokość pola tekstowego.

Jest ktoś w stanie poradzić jak ustawić pionowy scrollbar by był widoczny odrazu? szukałem tej opcji, ale jak widzicie jest 00:33 i w dalszym ciągu nie znalazłem.

Pozostało 580 znaków

2015-01-14 07:18
1

A tu https://docs.oracle.com/javas[...]/javax/swing/JScrollPane.html szukałeś? Użyj trzeciego konstruktora lub tej metody
https://docs.oracle.com/javas[...]ticalScrollBarPolicy%28int%29.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2015-01-15 12:35
0

Czy wie ktoś może, jak zmienić położenie menu "O Programie" na MenuBar w GUI builderze? Chcę do przesunąć w prawo, ale cholera nie potrafię znaleźć sposobu ;/

Screen

Pozostało 580 znaków

2015-01-15 12:56

Wrzuć to między "Opcja" a "O programie"

 menuBar.add(Box.createHorizontalGlue());

Pozostało 580 znaków

2015-01-15 14:36
0

Cacy! po prostu nie byłem pewny jak edytować generowany kod, ale rozwiązanie okazało się proste ;-D dzięki

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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