- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试用 java 创建 JFrame。
问题是我找不到做我想做的事情的方法,如果我要放置一个文本字段,我无法放置按钮,并且它与所有项目一起...
我想做的事情就像图像的模型:
感谢您的所有回答,我需要它。
最佳答案
您的图像是 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 上绘制图像。
这是我根据您提供的轮廓创建的布局。
我不知道这个 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 件重要的事情。
将 Swing 组件的创建和使用放在 Event Dispatch thread (EDT) 上。通过执行 SwingUtilities invokeLater 方法。 创建 Swing 应用程序时必须执行此操作。
实例化 LayoutModel 类。
实例化 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/
所以这个有点难以解释,但我会尝试一下: 我有一个带有 .boxes 类的 div。它是一些循环元素的包装。循环元素具有类.box。在这个元素中,还有两个元素。一种是 .box-header 类的 he
我有一个网站,我试图在调整浏览器窗口大小时使其表现得体。例如,我希望在有人缩小浏览器窗口时调整横幅图像的大小。网址是http://www.pfp-consortium.org 顶部的横幅在 CSS 中
我想知道情况,是将所有可能的元素都放在表单中更好,还是在用户需要时立即将元素添加到表单中更好。 我将尝试对其进行更多解释 - 我的表单具有 4 个输入和一个文本区域。然后我提供了可选值(大约 15 -
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
所以我一直在研究我正在构建的一个论坛,并且一直专注于它的一个方面,即如何在不在数据库中存储大量数据的情况下跟踪未读的帖子和通知。在查看了一些解决方案之后,我相信我想出了一个可能适合我需要的解决方案,但
编写一个高质量的软件应该是第一步。现在这是一个移动的目标。(我们有一些类似于 https://stackoverflow.com/questions/3716203/automatic-code-qu
我有一组存储在数组中的二维点。 我需要尽可能多地压缩它。最好是快速,但不要破坏交易,压缩率是目标。规则是: 一个点=一个32位的结构,存储为(x,y),每个坐标2个字节 坐标 = 8 位整数部分和 8
我的一个应用程序从服务器下载数据库。当我将应用程序安装到我的手机上时,它会正确下载文件并加载信息,没有抛出任何异常或任何东西。 但是,当我将 apk 上传到 Android Market Place
我们最近接到一位客户的电话,提示他们网站的页面底部有一些“看起来很奇怪的代码”。我们查看了源代码,发现 templates/master 中附加了大约 800 字节的恶意 javascript 代码。
以编程方式创建系统还原点是“禁忌”吗?我会在执行软件更新之前执行此操作。如果有更好的方法可以仅使用我的软件文件和数据创建还原点,请告诉我。 我想要一种方法,如果在更新期间一切都发生了故障(关闭/终止更
我有一个有很多相关模型的类问题。在我的应用程序的一个页面上,我列出了所有当前问题的摘要,以及来自相关记录的各种信息。最终,这是一个值的散列,然后我将其打印到一个 csv 样式的行中(从这里我将其称为“
我目前正在尝试从 NSClassFromString(NSString *) 方法创建对象。 我希望能够实现的是以下... NSClassFromString(stringType) *pageCon
使用 Intellij 想法,我如何找出使变量可见的原因? 困难时的示例: 假设你看 class A ,你会看到一个变量 something .如果你跳转到源代码,你会看到它是在 trait X 中定
在IntelliJ IDEA的代码样式设置中,没有.gradle文件的任何子类别(例如build.gradle),在“其他文件类型”下,没有任何选项可以修改花括号位置。我没有找到为.gradle文件设
我正在尝试按照here指令运行docker-compose,但它似乎陷入了循环。在安装Docker之前,我能够调出示例站点并进行一些外观上的更改,但是尝试使用docker-compose生成缩略图23
我正在使用 IntelliJ IDEA 12.1.4 来调试 Grails 应用程序。我开始调试 session 大约需要 2 分钟。我想尽可能避免重新启动。 我正在尝试调试一个 Controller
随着 .NET 4.0 的出现,MS AJAX 是否仍占有一席之地,或者您认为 JQuery 是否会扩展以包含 AJAX 的全部功能,并使我们所知的 MS AJAX 变得多余? 最佳答案 请记住,AS
需要帮助运行此示例 Google+ API Quickstart w/C# 应用程序,请使用 VS2015 并按照此处的说明操作:https://developers.google.com/+/web
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我有一个相当“疯狂”的想法,即在我的应用程序中拥有一个“存储过程”设施。基本上,我的应用程序以数据为中心,它可以通过某种形式的 Restful 界面访问数据存储。 我希望拥有以多种方式操作数据(这是一
我是一名优秀的程序员,十分优秀!