几天前我开始使用 Swing,我试图为文本编辑器制作一个 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 方法,但似乎没有任何效果。如果我改变布局,一切都会变得混乱
更喜欢在中心添加
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);
}
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;
}
}