【问题标题】:Placing JLabel, JButton etc. in JFrame在JFrame中放置JLabel、JButton等
【发布时间】:2017-02-21 19:49:24
【问题描述】:

一开始我想说我是波兰人,如果我的英语不好,很抱歉……而且我的代码有波兰语的名字。

我在活动窗口中做计算器,但我有很多问题,我无法解决。我想在顶部有 Label 和 TextField,在中间有 RadioBoxes 和 TextArea,在底部有 CheckBoxes 和 Buttons,就像在这个草图上一样:

BorderLayour 应该可以帮助我,但如果我将 FlowLayout 更改为 Border,我会看到:

一个大的关闭...

如果使用 FlowLayout,它看起来像这样:

我正在发送代码,希望您能找到帮助我的方法..!

代码:

    package kalkulator;

import javaapplication7.Input;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;



public class DialogDemo extends JFrame implements ActionListener
{


    //Pole tekstowe jednolinijkowe
    JLabel etykietaTekstWe1    = new JLabel("Pierwsza liczba:");
    JLabel etykietaTekstWe2    = new JLabel("Druga liczba:");
    JTextField poleTekstWe1  = new JTextField("",10);
    JTextField poleTekstWe2  = new JTextField("",10);

    //Pole tekstowe wielolinijkowe
    JLabel etykietaTekstWy   = new JLabel("Wynik:");
    JTextArea poleTekstWy = new JTextArea("",10,20);     

    //Trzy przyciki
    JButton przyciskLicz = new JButton("Licz"); 
    JButton przyciskCzysc = new JButton("Czysc");
    JButton przyciskZamknij = new JButton("Zamknij");

    //Trzy przyciski wyboru jeden z wielu
    JLabel etykietaOdp   = new JLabel("");
    JRadioButton dodawanie = new JRadioButton("[ + ] Dodawanie",true);
    JRadioButton odejmowanie = new JRadioButton("[ - ] Odejmowanie",false);
    JRadioButton mnozenie = new JRadioButton("[ * ] Mnozenie",false);
    JRadioButton dzielenie = new JRadioButton("[ / ] Dzielenie",false);

    //Cztery przyciski wyboru kilka z wielu
    JLabel etykietaCzyszczenie   = new JLabel("");
    JCheckBox czyszczenie1 = new JCheckBox("Wyczysc liczby"); 
    JCheckBox czyszczenie2 = new JCheckBox("Wyczysc wynik");

    long czasStart;

    public DialogDemo()
    {
        //Odczytanie czasu poczatkowego 
        czasStart = System.currentTimeMillis();

        //Ustawienie managera ukladu calego okna
        getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER,20,30));      




                JMenuBar pasekMenu = new JMenuBar();
                JMenu menuPierwsze = new JMenu("Plik");
                pasekMenu.add(menuPierwsze);

                JMenuItem wyjdz = new JMenuItem("Zamknij");
                menuPierwsze.add(wyjdz);
                wyjdz.addActionListener(this);

                JMenu menuDrugie = new JMenu("Edycja");
                pasekMenu.add(menuDrugie);

                JMenuItem czysc = new JMenuItem("Czysc");
                menuDrugie.add(czysc);
                czysc.addActionListener(this);

                JMenuItem odczyt = new JMenuItem("Licz");
                menuDrugie.add(odczyt);
                odczyt.addActionListener(this);

                JMenu menuTrzecie = new JMenu("Pomoc");
                pasekMenu.add(menuTrzecie);

                setJMenuBar(pasekMenu);


        //-------------------------------------

        //Wstawienie panelu z jednolinijkowym polem tekstowym

        JPanel panelTextWe1 = new JPanel();
        panelTextWe1.setLayout(new BorderLayout());
        panelTextWe1.add(etykietaTekstWe1,BorderLayout.NORTH);
        panelTextWe1.add(poleTekstWe1,BorderLayout.CENTER);

                JPanel panelTextWe2 = new JPanel();
        panelTextWe2.setLayout(new BorderLayout());
        panelTextWe2.add(etykietaTekstWe2,BorderLayout.NORTH);
        panelTextWe2.add(poleTekstWe2,BorderLayout.CENTER);

        getContentPane().add(panelTextWe1);
        getContentPane().add(panelTextWe2);

        //-------------------------------------

        //Wstawienie panelu z przyciskami wyboru kilka z wielu

        Box boxRGrupa = Box.createVerticalBox(); //Pionowy (kolumnowy) manager ulozenia
        boxRGrupa.add(etykietaOdp);

        boxRGrupa.add(Box.createVerticalStrut(10)); //Dodanie rozporki (przestrzeni) o wielkosci
                                                    //10 pikseli pomiedzy etykieta etykietaOdp 
                                                    // a przyciskiem przyciskA

        ButtonGroup bGrupa = new ButtonGroup();


        bGrupa.add(dodawanie);
        boxRGrupa.add(dodawanie);       
        bGrupa.add(odejmowanie);
        boxRGrupa.add(odejmowanie); 
        bGrupa.add(mnozenie);
        boxRGrupa.add(mnozenie);    
        bGrupa.add(dzielenie);
        boxRGrupa.add(dzielenie);

        getContentPane().add(boxRGrupa);

        //-------------------------------------

        //Wstawienie panelu z przyciskami wyboru kilka z wielu

        Box boxCGrupa = Box.createHorizontalBox(); //Poziomy (wierszowy) manager ulozenia
        boxCGrupa.add(etykietaCzyszczenie);
        czyszczenie1.setSelected(true);     
        boxCGrupa.add(czyszczenie1);
        czyszczenie2.setSelected(false);
        boxCGrupa.add(czyszczenie2);            

        getContentPane().add(boxCGrupa);

        //-------------------------------------

        //Wstawienie panelu z wielowierszowym polem tekstowym

        JPanel panelTextWy = new JPanel();
        panelTextWy.setLayout(new BorderLayout());
        panelTextWy.add(etykietaTekstWy,BorderLayout.NORTH);        
        panelTextWy.add(new JScrollPane(poleTekstWy),BorderLayout.CENTER);
        poleTekstWy.setEditable(false);     

        getContentPane().add(panelTextWy);

        //-------------------------------------

        //Wstawienie przyciskow

        getContentPane().add(przyciskLicz) ;
        getContentPane().add(przyciskCzysc);
        getContentPane().add(przyciskZamknij);


        //Ustawienie sluchacza dla wszystkich przyciskow

        przyciskLicz.addActionListener(this);
        przyciskCzysc.addActionListener(this);           
        przyciskZamknij.addActionListener(this);
    }


    //Obsluga zdarzen klikniecia na przycisk
    public void actionPerformed(ActionEvent zdarzenie)  
    {   
        if (zdarzenie.getActionCommand().equals("Licz"))
        {
            poleTekstWy.setText(""); //Wyczyszczenie pola wyjsciowego

            String tekst = poleTekstWe1.getText();  
            poleTekstWy.append("Tekst: "+tekst+"\n"); //Dodanie teksty wejsciowego

            //------------------------------------------------------            

            //Wstawienie informacji o wybranych jezykach

            poleTekstWy.append("Jezyki: ");
            if (czyszczenie1.isSelected()) poleTekstWy.append(czyszczenie1.getText()+" ");
            if (czyszczenie2.isSelected()) poleTekstWy.append(czyszczenie2.getText()+" ");
            poleTekstWy.append("\n");

            //------------------------------------------------------

          //Wstawienie informacji o wybranej (jednej) odpowiedzi jakiegos testu

            if (dodawanie.isSelected())
            {
                poleTekstWy.append(dodawanie.getText()+"\n");
            }
            else
                if (odejmowanie.isSelected())
                {
                    poleTekstWy.append(odejmowanie.getText()+"\n");                 
                }   
                    else
                                if (mnozenie.isSelected())
                               {
                                    poleTekstWy.append(mnozenie.getText()+"\n");                    
                                }   
                                else 
                                {
                                        poleTekstWy.append(dzielenie.getText()+"\n");
                                }
        }
        else
        {
            if (zdarzenie.getActionCommand().equals("Czysc"))       
            {
                //Przywrocenie poczatkowego stanu pola wyjsciowego

                poleTekstWy.setText("");    
            }
            else
            {
                //Odczytanie czasu zakonczenia
                long czasStop = System.currentTimeMillis();

                //Obliczenie czasu uzywania programu
                long liczbaSekund = (czasStop-czasStart)/1000;
                this.setVisible(false);
                Input.showMessage("Czas uzywania programu w sekundach: "+liczbaSekund);

                System.exit(0); //Zakonczenie pracy programu
            }
        }

        repaint();
    }


    public static void main ( String[] args )
    {               
        DialogDemo dialogDemo  = new DialogDemo();
        dialogDemo.setTitle("Kalkulatorek");
        dialogDemo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        dialogDemo.setLocation(500,100);
        dialogDemo.setSize(600,700);        
        dialogDemo.setVisible( true );     
                dialogDemo.setResizable(true);
                dialogDemo.setMinimumSize(new Dimension(600, 700));
    }   

    private void setMinimumSize() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
}

【问题讨论】:

    标签: java swing layout jframe layout-manager


    【解决方案1】:

    尝试使用面板作为各个区域的容器来简化布局。

    例如,顶部中间和底部JPanel 使用GridLayout 对齐。然后在顶部面板中添加标签和文本字段,而不是将它们直接添加到主框架中。

    当然有不同的方法可以做到这一点。这似乎最简单,因为它可以让您将整个布局的大任务分解为许多较小的任务,例如如何在面板中对齐两个文本框。

    请注意,面板甚至可以再次细分。例如,底部面板可以分为复选框面板和按钮面板,使用GridLayout 左右对齐。每次细分领域时,您都会将整体问题分解为更小、更易于管理的问题。

    请参阅本教程,了解如何使用GridLayouthttps://docs.oracle.com/javase/tutorial/uiswing/layout/grid.html

    【讨论】:

    • 添加一个教程链接或关于如何使用 GrodLayout 在 JPanel 中使用和对齐组件的工作代码将是对这个答案的一个很好的扩展。
    • @MasterBlaster 绝对正确。我加了一个
    • 这是我的“复制/粘贴”cmets 之一,可能对 OP 有所帮助。第一个链接是一个组合布局的代码示例:Java GUI 必须在不同的操作系统、屏幕尺寸、屏幕分辨率等上使用不同的语言环境中的不同 PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或 combinations of them 以及 white space 的布局填充和边框。
    猜你喜欢
    • 1970-01-01
    • 2013-05-03
    • 2022-01-17
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多