如何让 Jpanel 填充另一个面板中剩余的空间?

问题描述 投票:0回答:2

几天前我开始使用 Swing,我试图为文本编辑器制作一个 UI,就像我在下面附加的那样 Sample UI

这可能是一个愚蠢的问题,但我已经制作了工具栏并添加了边框,但是当我尝试添加绘图板时,它没有填充其余的空间? My UI

这是代码,有人可以告诉我我做错了什么吗?

import javax.swing.*;
import java.awt.*;

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Text Editor");
        GraphicsDevice graphicsDevice = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
        GraphicsConfiguration config = graphicsDevice.getDefaultConfiguration();
        frame.setSize(config.getBounds().getSize());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());

        menuBar(frame);
        sketchPad(frame);

        frame.setVisible(true);

    }

    public static void menuBar(JFrame frame){
        JMenuBar menuBar = new JMenuBar();
        JMenu file= new JMenu("File");
        String[] fileItems = {"New Tab","New Window","Open","Save","Save As","Save All", "Page Setup","Print","Close Tab","Close Window","Exit"};
        for(String item:fileItems){
            JMenuItem menuItem = new JMenuItem(item);
            file.add(menuItem);
        }
        menuBar.add(file);

        JMenu edit = new JMenu("Edit");
        String[] editItems = {"Undo","Cut","Copy","Paste","Delete","Go To","Select All","Time/Date"};
        for(String item:editItems){
            JMenuItem menuItem = new JMenuItem(item);
            edit.add(menuItem);
        }
        menuBar.add(edit);

        JMenu review = new JMenu("Review");
        String[] reviewItems = {"Zoom","Status Bar","Word Wrap"};
        for(String item:reviewItems){
            if(item.equals("Zoom")){
                JMenu subMenu = new JMenu("Zoom");
                JMenuItem in,out,setDefault;
                in = new JMenuItem("Zoom In");
                subMenu.add(in);
                out = new JMenuItem("Zoom Out");
                subMenu.add(out);
                setDefault = new JMenuItem("Default");
                subMenu.add(setDefault);
                review.add(subMenu);
            }else {
                JMenuItem menuItem = new JMenuItem(item);
                review.add(menuItem);
            }
        }
        menuBar.add(review);
        
        JMenu help = new JMenu("Help");
        String[] helpItems = {"Help","About"};
        for(String item:helpItems){
            JMenuItem menuItem = new JMenuItem(item);
            help.add(menuItem);
        }
        menuBar.add(help);
        
        frame.setJMenuBar(menuBar);
    }

    public static void sketchPad(JFrame frame){
        JPanel sketchPad = new JPanel();
        sketchPad.setLayout(new BorderLayout());
        sketchPad.add(new JLabel("Sketch Pad"),BorderLayout.NORTH);
        JPanel toolBar = new JPanel();
        toolBar.setLayout(new FlowLayout());
        toolBar.add(new JButton("Rectangle"));
        toolBar.add(new JButton("Circle"));
        toolBar.add(new JButton("Line"));
        toolBar.add(new JButton("Triangle"));
        toolBar.add(new JButton("Pentagon"));
        toolBar.add(new JButton("Clear"));
        sketchPad.add(toolBar,BorderLayout.CENTER);
        JPanel drawingPad = new JPanel();
        drawingPad.setBackground(Color.GRAY);
        sketchPad.add(drawingPad,BorderLayout.SOUTH);
        sketchPad.setBorder(BorderFactory.createLineBorder(Color.black));
        frame.add(sketchPad,BorderLayout.EAST);
    }
}

我尝试过使用 setMinimumSize、setSize、getPreferedSize 方法,但似乎没有任何效果。如果我改变布局,一切都会变得混乱

java swing user-interface awt
2个回答
0
投票

更喜欢在中心添加

drawingPad
。 由于您在北边需要标签和工具栏,因此将两者添加到专用面板中。

public static void sketchPad(JFrame frame){
    JPanel toolBar = new JPanel();
    toolBar.setLayout(new FlowLayout());
    toolBar.add(new JButton("Rectangle"));
    toolBar.add(new JButton("Circle"));
    toolBar.add(new JButton("Line"));
    toolBar.add(new JButton("Triangle"));
    toolBar.add(new JButton("Pentagon"));
    toolBar.add(new JButton("Clear"));

    JPanel control = new JPanel();
    control.setLayout(new BorderLayout());
    control.add(new JLabel("Sketch Pad"),BorderLayout.NORTH);
    control.add(toolBar,BorderLayout.SOUTH);
  
    JPanel drawingPad = new JPanel();
    drawingPad.setBackground(Color.GRAY);

    JPanel sketchPad = new JPanel();
    sketchPad.setLayout(new BorderLayout());
    sketchPad.add(control,BorderLayout.NORTH);
    sketchPad.add(drawingPad,BorderLayout.CENTER);
    sketchPad.setBorder(BorderFactory.createLineBorder(Color.black));
    frame.add(sketchPad,BorderLayout.EAST);
}


0
投票

Oracle 有一个有用的教程,使用 Swing 创建 GUI。跳过使用 NetBeans IDE 学习 Swing 部分。

我重新排列了你的代码以获得以下 GUI。

创建 Swing GUI 时,您需要从内到外进行工作。您可以设置各种 Swing 组件的大小,并通过打包组件来让

JFrame

 自行调整大小。

如果用户想要最大化 GUI,右上角有一个矩形可用于此目的。让你的 GUI 尽可能小。

摆脱

static

方法。方法名称应该是动词-名词组合。

将类似的代码分组在一起。您的代码中到处都是

JFrame

 方法调用,因此很难找到它们。

为每个

JPanel

创建一个单独的方法或类。这样,您就可以轻松尝试不同的 Swing 布局。

所有 Swing 应用程序都必须以调用

SwingUtilities

 
invokeLater
 方法开始。此方法确保 Swing 组件在 
Event Dispatch Thread 上创建并执行。

这是完整的可运行代码。

import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JButton; 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.SwingUtilities; public class TextEditor implements Runnable { public static void main(String[] args) { SwingUtilities.invokeLater(new TextEditor()); } @Override public void run() { JFrame frame = new JFrame("Text Editor"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setJMenuBar(createMenuBar()); frame.add(createDrawingPad(), BorderLayout.CENTER); frame.add(createSketchPad(), BorderLayout.EAST); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); } public JMenuBar createMenuBar() { JMenuBar menuBar = new JMenuBar(); JMenu file = new JMenu("File"); String[] fileItems = { "New Tab", "New Window", "Open", "Save", "Save As", "Save All", "Page Setup", "Print", "Close Tab", "Close Window", "Exit" }; for (String item : fileItems) { JMenuItem menuItem = new JMenuItem(item); file.add(menuItem); } menuBar.add(file); JMenu edit = new JMenu("Edit"); String[] editItems = { "Undo", "Cut", "Copy", "Paste", "Delete", "Go To", "Select All", "Time/Date" }; for (String item : editItems) { JMenuItem menuItem = new JMenuItem(item); edit.add(menuItem); } menuBar.add(edit); JMenu review = new JMenu("Review"); String[] reviewItems = { "Zoom", "Status Bar", "Word Wrap" }; for (String item : reviewItems) { if (item.equals("Zoom")) { JMenu subMenu = new JMenu("Zoom"); JMenuItem in, out, setDefault; in = new JMenuItem("Zoom In"); subMenu.add(in); out = new JMenuItem("Zoom Out"); subMenu.add(out); setDefault = new JMenuItem("Default"); subMenu.add(setDefault); review.add(subMenu); } else { JMenuItem menuItem = new JMenuItem(item); review.add(menuItem); } } menuBar.add(review); JMenu help = new JMenu("Help"); String[] helpItems = { "Help", "About" }; for (String item : helpItems) { JMenuItem menuItem = new JMenuItem(item); help.add(menuItem); } menuBar.add(help); return menuBar; } public JPanel createDrawingPad() { JPanel drawingPad = new JPanel(); drawingPad.setBackground(Color.GRAY); drawingPad.setPreferredSize(new Dimension(640, 480)); return drawingPad; } public JPanel createSketchPad() { JPanel sketchPad = new JPanel(); sketchPad.setLayout(new BorderLayout()); sketchPad.setBorder(BorderFactory.createLineBorder(Color.black)); sketchPad.add(new JLabel("Sketch Pad"), BorderLayout.NORTH); sketchPad.add(createToolBar(), BorderLayout.CENTER); return sketchPad; } public JPanel createToolBar() { JPanel toolBar = new JPanel(); toolBar.setLayout(new FlowLayout()); toolBar.add(new JButton("Rectangle")); toolBar.add(new JButton("Circle")); toolBar.add(new JButton("Line")); toolBar.add(new JButton("Triangle")); toolBar.add(new JButton("Pentagon")); toolBar.add(new JButton("Clear")); return toolBar; } }
    
© www.soinside.com 2019 - 2024. All rights reserved.