gpt4 book ai didi

java - Swing 布局想法

转载 作者:太空宇宙 更新时间:2023-11-04 14:10:14 25 4
gpt4 key购买 nike

我正在尝试用 java 创建 JFrame。

问题是我找不到做我想做的事情的方法,如果我要放置一个文本字段,我无法放置按钮,并且它与所有项目一起...

我想做的事情就像图像的模型:

Swing Layout

感谢您的所有回答,我需要它。

最佳答案

您的图像是 Swing nested layout 的图片.

您的Swing components会这样安排。

JFrame
JPanel - main panel, Box layout, Page axis
JPanel - drawing panel
JScrollPane
JTextArea
JPanel - Flow Layout
JTextField
JButton

您的绘图面板将定义为与图像尺寸相同的首选尺寸。您可以通过重写paintComponent 方法直接在JPanel 上绘制图像。

编辑添加一些示例代码。

这是我根据您提供的轮廓创建的布局。

Swing Layout

我不知道这个 GUI 应该做什么,所以这是 Swing GUI 的骨架。

我使用model / view / controller pattern每当我创建 Swing GUI 时。这使我能够分离我的关注点并创建复杂的 GUI,而不会遇到太多问题。

我创建的第一个类是 LayoutDemo 类。

package com.ggl.layout;

import javax.swing.SwingUtilities;

import com.ggl.layout.model.LayoutModel;
import com.ggl.layout.view.LayoutFrame;

public class LayoutDemo implements Runnable {

@Override
public void run() {
new LayoutFrame(new LayoutModel());
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new LayoutDemo());
}

}

这个 20 行的类做了 3 件重要的事情。

  1. 将 Swing 组件的创建和使用放在 Event Dispatch thread (EDT) 上。通过执行 SwingUtilities invokeLater 方法。 创建 Swing 应用程序时必须执行此操作。

  2. 实例化 LayoutModel 类。

  3. 实例化 LayoutFrame 类。

接下来,我们将看一下 LayoutModel 类。

package com.ggl.layout.model;

import java.awt.Dimension;

import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.Document;

public class LayoutModel {

private Document document;

private String textString;

public LayoutModel() {
document = new DefaultStyledDocument();
}

public Dimension getPreferredSize() {
return new Dimension(300, 200);
}

public Document getDocument() {
return document;
}

public String getTextString() {
return textString;
}

public void setTextString(String textString) {
this.textString = textString;
}

}

因为我不知道这个 GUI 应该做什么,所以这个类包含 JTextArea 的文档和 JTextField 的字符串。我假设字符串将被添加到文档中,并且将在绘图区域上绘制一些内容。图纸数据将保存在模型类中。

接下来,我们来看看 LayoutFrame 类。

package com.ggl.layout.view;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;

import com.ggl.layout.model.LayoutModel;

public class LayoutFrame {

private ControlPanel controlPanel;

private DrawingPanel drawingPanel;

private JFrame frame;

private LayoutModel model;

private TextPanel textPanel;

public LayoutFrame(LayoutModel model) {
this.model = model;
createPartControl();
}

private void createPartControl() {
frame = new JFrame();
frame.setTitle("Swing Layout");
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent event) {
exitProcedure();
}
});

JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));

drawingPanel = new DrawingPanel(model);
mainPanel.add(drawingPanel);

textPanel = new TextPanel(model);
mainPanel.add(textPanel.getScrollPane());

controlPanel = new ControlPanel(model);
mainPanel.add(controlPanel.getPanel());

frame.add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.getRootPane().setDefaultButton(controlPanel.getSubmitButton());
frame.setVisible(true);
}

private void exitProcedure() {
frame.dispose();
System.exit(0);
}

}

此类将 JPanel 放入 createPartControl 方法中的 JFrame 中。

我们使用 Swing 组件。我们不扩展 Swing 组件。我们扩展 Swing 组件或任何其他 Java 类的唯一一次是当我们想要重写组件方法之一时。当我们讨论绘图面板时,我们将看到一个例子。

接下来,我们将看看 DrawingPanel 类。

package com.ggl.layout.view;

import java.awt.Graphics;

import javax.swing.JPanel;

import com.ggl.layout.model.LayoutModel;

public class DrawingPanel extends JPanel {

private static final long serialVersionUID = 6305888561097318682L;

private LayoutModel model;

public DrawingPanel(LayoutModel model) {
this.model = model;
this.setPreferredSize(model.getPreferredSize());
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
}

}

我们设置了 DrawingPanel 的大小,然后在 PaintComponent 方法中绘制要绘制的内容。对 super.paintComponent 的调用必须是重写方法中的第一行。

由于我们重写了paintComponent 方法,因此我们扩展了JPanel。我们添加一个serialVersionUID,因为JPanel实现了Serialized接口(interface)。该接口(interface)需要一个serialVersionUID。每次从 JPanel 添加或删除 Swing 组件时,serialVersionUID 都应该更改。

接下来,让我们看看 TextPanel 类。

package com.ggl.layout.view;

import javax.swing.JScrollPane;
import javax.swing.JTextArea;

import com.ggl.layout.model.LayoutModel;

public class TextPanel {

private JScrollPane scrollPane;

private JTextArea textArea;

private LayoutModel model;

public TextPanel(LayoutModel model) {
this.model = model;
createPartControl();
}

private void createPartControl() {
textArea = new JTextArea(10, 60);
textArea.setDocument(model.getDocument());
textArea.setEditable(false);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);

scrollPane = new JScrollPane(textArea);
}

public JScrollPane getScrollPane() {
return scrollPane;
}

public JTextArea getTextArea() {
return textArea;
}

}

此类将 JTextArea 放入 JScrollFrame 中。除非我们定义 JTextArea 的行数超过 10 行(每行 60 个字符),否则滚动条不会出现。

保存 JTextArea 文本的 Document 保存在模型类中。添加到文档的文本将通过模型类中的方法传递到文档。

最后,让我们看一下 ControlPanel 类。

package com.ggl.layout.view;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;

import com.ggl.layout.model.LayoutModel;

public class ControlPanel {

private JButton submitButton;

private JPanel panel;

private JTextField textField;

private LayoutModel model;

public ControlPanel(LayoutModel model) {
this.model = model;
createPartControl();
}

private void createPartControl() {
panel = new JPanel();
panel.setLayout(new BorderLayout());

textField = new JTextField(20);
panel.add(textField, BorderLayout.CENTER);

submitButton = new JButton("Submit");
submitButton.addActionListener(new SubmitActionListener());
panel.add(submitButton, BorderLayout.EAST);
}

public JButton getSubmitButton() {
return submitButton;
}

public JPanel getPanel() {
return panel;
}

public class SubmitActionListener implements ActionListener {

@Override
public void actionPerformed(ActionEvent event) {
// TODO Auto-generated method stub
model.setTextString(textField.getText().trim());
}

}

}

此类包含一个 JTextField 和一个 JButton。我使用了 BorderLayout,以便可以拉伸(stretch) JTextField 来填充主 JPanel。

JButton 附加了一个 Controller 类 SubmitActionListener。当单击 JButton 或按下 Enter 键时,将执行 Controller 代码。

感谢您阅读本文。该代码可以成为几乎所有 Swing GUI 的基础。

关于java - Swing 布局想法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28415160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com