- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个面板,我可以向其中动态添加具有固定高度的子面板。我尝试使用胶水组件,但不起作用。我希望实现子面板在 gridbaglayout 的顶部可见。附带问题是,当我不断添加子面板时,它们开始重叠,因为 JScrollPane 没有调整。但是,当我调整框架大小时,这两个问题都解决了。
此刻我不知道我错在哪里。为什么胶水组件不占用垂直空间将侧板推到顶部?
这是我的 SSCCE 代码:
import javax.swing.*;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.awt.GridLayout;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import jrdb.data.ProcessingCommand;
public class ProcessingPipelineBuilderSSCCE extends JFrame {
/**
*
*/
private static final long serialVersionUID = 2413084448601918744L;
private JPanel interiorPanel = null;
private GridBagConstraints gbc = null;
private Component glue = null;
public ProcessingPipelineBuilderSSCCE() {
super("SSCCE");
this.getContentPane().setLayout(new BorderLayout());
gbc = new GridBagConstraints();
gbc.insets = new Insets(5, 5, 0, 5);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.anchor = GridBagConstraints.PAGE_START;
JPanel pipelineBuilder = new JPanel();
pipelineBuilder.setLayout(new GridLayout(0, 1, 0, 0));
interiorPanel = new JPanel(new GridBagLayout());
interiorPanel.setBorder(BorderFactory.createLineBorder(Color.red));
JScrollPane scrollPane = new JScrollPane(interiorPanel);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setPreferredSize(new Dimension(500,300));
pipelineBuilder.add(scrollPane);
JButton btnNew = new JButton("Add new panel");
btnNew.setPreferredSize(new Dimension(500, 30));
btnNew.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (glue!=null) {
interiorPanel.remove(glue);
} else {
glue = Box.createGlue();
}
gbc.gridy = gbc.gridy + 1;
interiorPanel.add(new PipelineStep(gbc.gridy),gbc);
interiorPanel.add(glue,gbc);
interiorPanel.validate();
interiorPanel.repaint();
}
});
this.getContentPane().add(btnNew, BorderLayout.PAGE_START);
this.getContentPane().add(pipelineBuilder,BorderLayout.CENTER);
}
public class PipelineStep extends JPanel {
int number;
public PipelineStep (int n) {
super();
JOptionPane.showMessageDialog(interiorPanel, "adding new panel");
this.number = n;
this.setLayout(new FlowLayout());
JLabel lbl = new JLabel(new Integer(this.number).toString());
lbl.setPreferredSize(new Dimension(45,45));
lbl.setFont(lbl.getFont().deriveFont(26));
this.add(lbl);
this.setPreferredSize(new Dimension(450, 50));
this.setBorder(BorderFactory.createLineBorder(Color.green));
}
}
public static void main (String args[]) {
ProcessingPipelineBuilderSSCCE frame = new ProcessingPipelineBuilderSSCCE();
frame.pack();
frame.setVisible(true);
}
}
最佳答案
Why does the glue component not take up the vertical space to push the side panels to the top?
“粘合”组件仅在与 BoxLayout 一起使用时才有意义。它对 GridBagLayout 没有影响。
所以我的建议是忘记 GridBagLayout 并使用 BoxLayout。
最简单的方法是将“interiorPanel”转换为使用垂直框,然后将您的 PipelineStep
实例添加到此面板。
试试这个。但是,您会注意到面板的大小仍会增加,直到滚动 Pane 已满,此时您将看到滚动条出现。这是因为 BoxLayout 会将组件的大小调整为组件的最大尺寸。因此,为了防止这种大小调整,您可以重写 PipelineStep
类的 getMaximumSize()
方法:
@Override
public Dimension getMaximumSize()
{
return getPreferredSize();
}
或者,另一种选择是为“interiorPanel”使用“wrapper”面板。像这样的东西:
JPanel wrapper = new JPanel( new BorderLayout() );
wrapper.add(interiorPanel, BorderLayout.PAGE_START);
//JScrollPane scrollPane = new JScrollPane(interiorPanel);
JScrollPane scrollPane = new JScrollPane(wrapper);
BorderLayout.PAGE_START
尊重添加到其中的组件的首选高度,因此“interiorPanel”将始终以其首选高度显示,并且当滚动 Pane 的视口(viewport)已满时,滚动条将出现。
我使用“包装器”方法修改了您的代码。
import javax.swing.*;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.awt.GridLayout;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
//import jrdb.data.ProcessingCommand;
public class SSCCE1 extends JFrame {
/**
*
*/
private static final long serialVersionUID = 2413084448601918744L;
// private JPanel interiorPanel = null;
private Box interiorPanel = null;
private GridBagConstraints gbc = null;
private Component glue = null;
public SSCCE1() {
super("SSCCE");
this.getContentPane().setLayout(new BorderLayout());
gbc = new GridBagConstraints();
//gbc.insets = new Insets(5, 5, 0, 5);
//gbc.fill = GridBagConstraints.HORIZONTAL;
//gbc.gridx = 0;
//gbc.gridy = 0;
//gbc.weightx = 1.0;
//gbc.weighty = 1.0;
//gbc.anchor = GridBagConstraints.PAGE_START;
JPanel pipelineBuilder = new JPanel();
pipelineBuilder.setLayout(new GridLayout(0, 1, 0, 0));
// interiorPanel = new JPanel(new GridBagLayout());
interiorPanel = Box.createVerticalBox();
interiorPanel.setBorder(BorderFactory.createLineBorder(Color.red));
JPanel wrapper = new JPanel( new BorderLayout() );
wrapper.add(interiorPanel, BorderLayout.PAGE_START);
// JScrollPane scrollPane = new JScrollPane(interiorPanel);
JScrollPane scrollPane = new JScrollPane(wrapper);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setPreferredSize(new Dimension(500,300));
pipelineBuilder.add(scrollPane);
JButton btnNew = new JButton("Add new panel");
btnNew.setPreferredSize(new Dimension(500, 30));
btnNew.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// if (glue!=null) {
// interiorPanel.remove(glue);
// } else {
// glue = Box.createGlue();
// }
gbc.gridy = gbc.gridy + 1;
// interiorPanel.add(new PipelineStep(gbc.gridy),gbc);
interiorPanel.add(new PipelineStep(gbc.gridy),gbc);
// interiorPanel.add(glue,gbc);
// interiorPanel.validate();
interiorPanel.revalidate();
interiorPanel.repaint();
}
});
this.getContentPane().add(btnNew, BorderLayout.PAGE_START);
this.getContentPane().add(pipelineBuilder,BorderLayout.CENTER);
}
public class PipelineStep extends JPanel {
int number;
public PipelineStep (int n) {
super();
JOptionPane.showMessageDialog(interiorPanel, "adding new panel");
this.number = n;
this.setLayout(new FlowLayout());
JLabel lbl = new JLabel(new Integer(this.number).toString());
lbl.setPreferredSize(new Dimension(45,45));
lbl.setFont(lbl.getFont().deriveFont(26));
this.add(lbl);
this.setPreferredSize(new Dimension(450, 50));
this.setBorder(BorderFactory.createLineBorder(Color.green));
}
}
public static void main (String args[]) {
SSCCE1 frame = new SSCCE1();
frame.pack();
frame.setVisible(true);
}
}
关于java - 带胶水的GridBagLayout : no fixed row height,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61398928/
bucket/ ├── seoul/ │ ├── weather/ │ │ └── data.json │ └── gdp/ │ └── data.json ├── tok
我创建了一个成功执行的 AWS 粘合作业。但是,我无法在作业中放置任何自定义日志记录。 如何在 AWS S3 存储桶中创建日志文件,以便跟踪日常作业执行情况? 目前,当我的作业执行时,它会创建默认日志
我正在尝试将由我的 AWS Glue 爬虫映射到 Python 中的嵌套字典的表中的字段映射展开。但是,我找不到任何 Spark/Hive 解析器来反序列化 var_type = 'struct>,n
我们正在为 STM32 芯片上的 ARM Cortex M4 编写一些代码。 我的理解是 Cortex-M4 有一些 32 位指令,但这些不是 32 位 ARM 指令,它们只是一些特殊指令。我认为胶水
我已经定义了一个基本脚本来使用来自 redshift 中的一个表的数据创建 DF。我运行了该过程,但我已经为一条无法解释的消息而苦苦挣扎了一段时间。 日志中输出的错误为: “/mnt/yarn/use
我已经在 Scala 中学习了 Spark,但我对 pySpark 和 AWS Glue 还很陌生, 所以我遵循了 AWS 的这个官方教程。 https://docs.aws.amazon.com/j
我在 S3 中有一个 csv 文件,它没有任何引号。 例如。 dVsdfsCcn7j6,r:werwerwerwerwerwerwerwer,_User$SSSSSBFwJ,login,passwor
有谁知道在 Glue 作业中将源文件名添加为列的方法吗? 我们创建了一个流,我们在其中抓取 S3 中的一些文件以创建架构。然后,我们编写了一个将文件转换为新格式的作业,并将这些文件作为 CSV 写回另
一直在使用awsglue python shell作业构建简单的数据etl作业,对于spark作业,只使用过一两次转换为orc格式或在JDBC数据上执行spark sql。那么想知道每个用例的最佳/典
我正在创建 AWS Glue ETL 作业,但在文件检索方面遇到了一些障碍。 似乎以下代码仅获取根文件夹 2017 中的文件,而不再获取更多文件。有没有办法在其中包含所有子文件夹和文件? dyf =
我想使用 ETL 从 S3 读取数据。由于使用 ETL 作业,我可以设置 DPU 以加快速度。 但是我该怎么做呢?我试过 import sys from awsglue.transforms impo
我在本地开发了一个 pandas etl 脚本并且工作正常。 我准备了一个wheel文件并上传到s3。所有软件包都已正确安装。 但是,当脚本运行时,它显示 ImportError: cannot im
运行 AWS Glue 爬网程序时,它无法识别时间戳列。 我在 CSV 文件中正确格式化了 ISO8601 时间戳。首先,我希望 Glue 自动将这些归类为时间戳,但事实并非如此。 我还尝试了此链接中
为了使用 boto3 运行作业,documentation仅国家 JobName是必须的。但是,我的代码: def start_job_run(self, name): pri
为了使用 boto3 运行作业,documentation仅国家 JobName是必须的。但是,我的代码: def start_job_run(self, name): pri
我正在尝试从该作业的脚本访问 AWS ETL Glue 作业 ID。这是您可以在 AWS Glue 控制台的第一列中看到的 RunID,类似于 jr_5fc6d4ecf0248150067f2 .如何
使用 AWSglue 以及 AWS s3 和 s3fs,我提出了以下方案(以及其他尝试)。我什至在 https://s3fs.readthedocs.io/en/latest/ 上看到了例子但他们并没
我是一名优秀的程序员,十分优秀!