LayoutManager i usadowienie/rozmiar JScrollPane

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);
        }
}
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/tutorial/uiswing/layout/visual.html

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.

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

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

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);
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 Od razu? szukałem tej opcji, ale jak widzicie jest 00:33 i w dalszym ciągu nie znalazłem.

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

1

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

 menuBar.add(Box.createHorizontalGlue());
0

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

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